|
Go to the documentation of this file.
53 StateSet::Iterator lit;
60 FD_DF( "ProjectNonDet: todo add: " << rGen. SStr(*lit));
65 while (! todo.empty()) {
66 currentstate = todo.top();
69 FD_DF( "ProjectNonDet: current state: " << rGen. SStr(currentstate));
80 while(tit != tit_end) {
81 FD_DF( "ProjectNonDet: current transition: " << rGen. SStr(tit->X1)
82 << "-" << rGen. EStr(tit->Ev) << "-" << rGen. SStr(tit->X2));
83 if (! rProjectAlphabet. Exists(tit->Ev)) {
84 FD_DF( "ProjectNonDet: deleting current transition");
92 FD_DF( "ProjectNonDet: relinking outgoing transitions...");
93 for (lit = reach. Begin(); lit != reach. End(); ++lit) {
96 for (; tit != tit_end; ++tit) {
97 if (rProjectAlphabet. Exists(tit->Ev)) {
98 FD_DF( "ProjectNonDet: relinking transition: " << rGen. TStr(*tit) << " to " << rGen. SStr(currentstate));
100 if (! done. Exists(tit->X2)) {
101 FD_DF( "ProjectNonDet: todo push: " << rGen. SStr(tit->X2));
108 FD_DF( "ProjectNonDet: setting marked state " << rGen. SStr(currentstate));
131 std::stack<Idx> todod, todor;
134 StateSet::Iterator sit;
135 StateSet::Iterator sit_end;
151 while(!todod.empty()) {
154 FD_WPC(doned. Size() - todod.size(), rGen. Size(), "ProjectNonDet() [STD]: done/size: "
155 << doned. Size() - todod.size() << " / " << rGen. Size());
158 currentstate = todod.top();
160 FD_DF( "ProjectNonDet: current state: " << rGen. SStr(currentstate));
163 todor.push(currentstate);
165 doner. Insert(currentstate);
167 while(!todor.empty()) {
168 Idx reachstate = todor.top();
170 FD_DF( "ProjectNonDet: reach: " << rGen. SStr(reachstate));
176 for(; tit != tit_end; ++tit) {
177 if(tit->X1!=reachstate) break;
179 if(rProjectAlphabet. Exists(tit->Ev)) {
181 if(doned. Insert(tit->X2)) {
182 FD_DF( "ProjectNonDet: todod insert: " << rGen. SStr(tit->X2));
188 if(doner. Insert(tit->X2)) {
201 while(tit != tit_end) {
202 if(tit->X1!=currentstate) break;
203 FD_DF( "ProjectNonDet: current transition: " << rGen. SStr(tit->X1)
204 << "-" << rGen. EStr(tit->Ev) << "-" << rGen. SStr(tit->X2));
205 if(!rProjectAlphabet. Exists(tit->Ev)) {
206 FD_DF( "ProjectNonDet: deleting current transition");
238 template< class VLabel, class ELabel >
240 template< class VLabel, class ELabel >
242 template< class VLabel, class ELabel >
243 struct graph_iterator_t;
244 template< class VLabel, class ELabel >
245 struct node_iterator_t;
246 template< class VLabel, class ELabel >
266 template< class VLabel, class ELabel >
267 struct TGraph : std::map< VLabel , TNode< VLabel , ELabel > > {
272 static TGraph gInfX1; return gInfX1.begin(); }
281 template< class VLabel, class ELabel >
282 struct TNode : std::set< node_entry_t< VLabel , ELabel > > {
300 template< class VLabel, class ELabel >
312 inline bool operator<(const node_entry_t< VLabel , ELabel >& ent) const {
313 if(this-> Ev < ent.Ev) return true;
314 if(this-> Ev > ent.Ev) return false;
315 if(this-> X2It->first == ent.X2It->first) return false;
318 return this-> X2It->first < ent.X2It->first;
329 template< class VLabel, class ELabel >
336 : TGraph< VLabel , ELabel >::iterator() {}
338 : TGraph< VLabel , ELabel >::iterator(git) {}
340 inline VLabel X1( void) const { return (*this)->first; }
342 { return (* FakeConst())->second.begin(); }
344 { return (*this)->second.end(); }
346 { return (* FakeConst())->second.lower_bound(
349 { return (* FakeConst())->second.lower_bound(
354 if(x2it!=(* this)) ++(x2it->second.RefCnt);
358 if(nit-> X2It != (* this)) --(nit-> X2It->second.RefCnt);
359 (*this)->second.erase(nit);
362 ++((*this)->second.RefCnt);
365 inline Int& UsrFlg( void) { return (*this)->second.UsrFlg; }
367 std::string Str( void) const {
368 std::stringstream rep;
371 rep << "[" << X1() << "] ";
372 for(; nit!=nit_end; ++nit)
373 rep << "(" << nit. Ev() << ")->" << nit. X2() << " ";
384 template< class VLabel, class ELabel >
387 : TNode< VLabel , ELabel >::iterator() {}
389 : TNode< VLabel , ELabel >::iterator(nit) {}
390 inline ELabel Ev( void) const { return (*this)->Ev; }
392 inline VLabel X2( void) const { return (*this)->X2It->first; }
415 return (this->insert(std::make_pair(x1,mapped_type()))).first; }
417 if(Find(x1)==End()) return false;
420 for(;git!=git_end;++git) {
423 while(nit!=nit_end) {
424 if(nit. X2()==x1) git. Erase(nit++);
428 return ((*this).erase(x1)) !=0;
433 if(x2it->second.RefCnt == 0 ) ((*this).erase(x2it));
441 if(git==end()) git = insert(std::make_pair(tit->X1,mapped_type())).first;
443 if(x2it==end()) x2it = insert(std::make_pair(tit->X2,mapped_type())).first;
448 for(; sit != sit_end; sit++)
449 Find(*sit).IncRefCnt();
456 for(; git != git_end; git++) {
459 for(; nit != nit_end; ++nit) {
469 std::string Str( void) const {
470 std::stringstream rep;
473 for(; git!=git_end; ++git)
474 rep << git. Str() << std::endl;
480 return gInfX1.begin(); }
495 std::stack<Graph::Iterator> todod, todor;
496 std::stack<Graph::Iterator> todov;
500 StateSet::Iterator sit;
509 FD_DF( "ProjectNonDet: convert to graph");
511 FD_DF( "ProjectNonDet: convert to graph: done");
515 todod.push(trg. Find(*sit));
520 while(!todod.empty()) {
523 FD_WPC(doned. Size() - todod.size(),trg.size(), "ProjectNonDet() [G1]: done/size: "
524 << doned. Size() - todod.size() << "/" << trg.size());
527 currentstate = todod.top();
529 FD_DF( "ProjectNonDet: current state: " << rGen. SStr(currentstate.X1()));
532 todor.push(currentstate);
534 doner. Insert(currentstate.X1());
536 while(!todor.empty()) {
537 reachstate = todor.top();
539 FD_DF( "ProjectNonDet: reach: " << rGen. SStr(reachstate. X1()));
543 nit=reachstate. Begin();
544 nit_end=reachstate. End();
545 for(; nit != nit_end; ++nit) {
547 if(rProjectAlphabet. Exists(nit. Ev())) {
549 FD_DF( "ProjectNonDet: todod insert: " << rGen. SStr(nit. X2()));
550 todod.push(nit. X2It());
553 if(reachstate!=currentstate) {
554 FD_DF( "ProjectNonDet: trans insert: " << rGen. SStr(currentstate.X1()) << " -> " << rGen. SStr(nit. X2()));
555 currentstate.Insert(nit. Ev(),nit. X2It());
561 todor.push(nit. X2It());
562 if(nit. X2It()==currentstate)
563 todov.push(reachstate);
572 nit=currentstate.Begin();
573 nit_end=currentstate.End();
574 while(nit != nit_end) {
575 if(!rProjectAlphabet. Exists(nit. Ev()))
576 trg. Erase(currentstate,nit++);
585 FD_DF( "ProjectNonDet: convert from graph");
587 FD_DF( "ProjectNonDet: convert from graph: done");
606 std::stack<Idx> todod;
609 StateSet::Iterator sit, sit_end;
625 while(!todod.empty()) {
628 FD_WPC(doned. Size(),rGen. Size(), "ProjectNonDet() [SIMPL]: current/size: "
629 << doned. Size() << " / " << rGen. Size());
632 currentstate = todod.top();
634 FD_DF( "ProjectNonDet: current state: " << rGen. SStr(currentstate));
640 for(; tit != tit_end; ++tit) {
641 if(!doned. Exists(tit->X2)) { todod.push(tit->X2); doned. Insert(tit->X2); }
642 if(rProjectAlphabet. Exists(tit->Ev)) continue;
643 if(tit->X2==currentstate) continue;
651 sit_end = reach. End();
652 for(; sit != sit_end; ++sit) {
655 for(; tit != tit_end; ++tit) {
663 if(revisit) todod.push(currentstate);
667 FD_DF( "ProjectNonDet: finalize");
690 StateSet::Iterator lit;
691 StateSet::Iterator lit2;
714 while(!todo. Empty()) {
715 currentstate = *todo. Begin();
717 done. Insert(currentstate);
718 FD_DF( "ProjectNonDet: current state: " << rGen. SStr(currentstate));
726 FD_DF( "ProjectNonDet: relinking outgoing transitions...");
727 for(lit = reach. Begin(); lit != reach. End(); ++lit) {
730 for(; tit != tit_end; ++tit) {
731 if(rProjectAlphabet. Exists(tit->Ev)) {
732 FD_DF( "ProjectNonDet: relinking transition: " << rGen. TStr(*tit) << " to " << rGen. SStr(currentstate));
734 if (!done. Exists(tit->X2)) {
735 FD_DF( "ProjectNonDet: todo insert: " << rGen. SStr(tit->X2));
742 FD_DF( "ProjectNonDet: local reach from state " << tit->X2 << ": " << reachext. ToString());
743 for (lit2 = reachext. Begin(); lit2 != reachext. End(); ++lit2) {
744 if (!rGen. ExistsTransition(tit->X2, tit->Ev, *lit2) && (tit->X2 != *lit2)) {
746 FD_DF( "ProjectNonDet: setting transition: " << rGen. SStr(tit->X1) << "-" << rGen. EStr(tit->Ev) << "-" << rGen. SStr(*lit2));
748 if (!done. Exists(*lit2)) {
749 FD_DF( "ProjectNonDet: todo insert: " << rGen. SStr(tit->X2));
758 FD_DF( "ProjectNonDet: setting marked state " << rGen. SStr(currentstate));
766 while(tit != tit_end) {
767 FD_DF( "ProjectNonDet: current transition: " << rGen. SStr(tit->X1)
768 << "-" << rGen. EStr(tit->Ev) << "-" << rGen. SStr(tit->X2));
769 if(!rProjectAlphabet. Exists(tit->Ev)) {
770 FD_DF( "ProjectNonDet: deleting current transition");
805 std::stack<Idx> todod, todor, todof, todox;
806 StateSet doned, doner, donef, donex;
811 StateSet::Iterator sit;
812 StateSet::Iterator sit_end;
823 FD_WPD(0,1, "ProjectNonDet() [FB-REACH]: remove silent selfloops");
826 while(tit!=tit_end) {
827 if(tit->X1 == tit->X2)
828 if(!rProjectAlphabet. Exists(tit->Ev))
840 while(!todod.empty()) {
843 FD_WPD(donex. Size(), rGen. Size(), "ProjectNonDet() [FB-REACH]: done/size: "
844 << donex. Size() << " / " << rGen. Size());
847 currentstate = todod.top();
849 FD_DF( "ProjectNonDet: ---- current state: " << rGen. SStr(currentstate));
852 if(donex. Exists(currentstate)) continue;
855 FD_DF( "ProjectNonDet: running f-reach on " << rGen. SStr(currentstate));
857 todor.push(currentstate);
859 doner. Insert(currentstate);
860 Idx lastfound=currentstate;
861 while(!todor.empty()) {
862 reachstate = todor.top();
868 for(; tit != tit_end; ++tit) {
869 if(tit->X1 != reachstate) break;
871 if(rProjectAlphabet. Exists(tit->Ev)) {
887 if(reachstate!=currentstate) todox.push(reachstate);
892 if(donex. Exists(currentstate)) continue;
894 FD_DF( "ProjectNonDet: f-reach-proj found #" << doner. Size() << " reachable states");
895 FD_DF( "ProjectNonDet: f-reach-proj found #" << (donex*doner).Size() << " exit states");
900 FD_DF( "ProjectNonDet: f-reach-proj found #" << candx. Size() << " exit candidates");
906 FD_DF( "ProjectNonDet: running b-reach-proj on exitstates");
907 while(!todox.empty()) {
908 exitstate = todox.top();
910 FD_DF( "ProjectNonDet: -- b-reach on exit state: " << rGen. SStr(exitstate));
917 for(;tit!=tit_end; ++tit) {
918 if(tit->X1!=exitstate) break;
923 rit_end = revrel. End();
924 while(rit != rit_end) {
925 if(rit->X2!=exitstate) break;
931 if(donex. Exists(rit->X1)) {++rit; continue;}
932 FD_DF( "ProjectNonDet: -- b-reach predecessor: " << rGen. SStr(rit->X1));
936 for(;tit!=tit_end; ++tit)
941 FD_DF( "unlink " << rit->Str());
944 if(!donex. Exists(rit->X1)) {
948 while(tit != tit_end) {
949 if(rProjectAlphabet. Exists(tit->Ev)) { ++tit; continue;}
955 FD_DF( "ProjectNonDet: b-reach new exit state: " << rGen. SStr(currentstate));
958 candx. Erase(rit->X1);
973 if(doner<=donex) break;
977 FD_DF( "ProjectNonDet: b-reach-proj stuck with #" << donex. Size() << " exit states");
978 FD_DF( "ProjectNonDet: choosing first of #" << candx. Size() << " exit candidates");
979 exitstate= *candx. Begin();
983 FD_DF( "ProjectNonDet: running f-reach-proj on: " << rGen. SStr(exitstate));
984 todof.push(exitstate);
988 while(!todof.empty()) {
989 reachstate = todof.top();
996 for(; tit != tit_end; ++tit) {
997 if(tit->X1!=reachstate) break;
999 if(rProjectAlphabet. Exists(tit->Ev))
1003 if(donef. Insert(tit->X2))
1004 todof.push(tit->X2);
1008 FD_DF( "ProjectNonDet: f-reach-proj found #" << donef. Size() << " states");
1016 while(tit != tit_end) {
1017 if(tit->X1!=exitstate) break;
1018 if(!rProjectAlphabet. Exists(tit->Ev))
1025 #ifdef FAUDES_CHECKED
1026 if(donex. Exists(exitstate))
1027 FD_WARN( "ProjectNonDet: ERROR: new exit state " << exitstate);
1029 todox.push(exitstate);
1031 candx. Erase(exitstate);
1060 std::stack<Idx> todod, todor, todof, todox;
1061 StateSet doned, doner, donef, donex;
1066 StateSet::Iterator sit;
1067 StateSet::Iterator sit_end;
1078 FD_WPD(0,1, "ProjectNonDet() [SCC]: remove silent selfloops");
1081 while(tit!=tit_end) {
1082 if(tit->X1 == tit->X2)
1083 if(!rProjectAlphabet. Exists(tit->Ev))
1089 FD_WPD(0,1, "ProjectNonDet() [SCC]: compute silent sccs");
1093 std::list<StateSet> scclist;
1098 FD_WPD(0,1, "ProjectNonDet() [SCC]: processing #" << scclist.size() << " sccs");
1099 std::list<StateSet>::iterator cit=scclist.begin();
1100 std::list<StateSet>::iterator cit_end=scclist.end();
1101 std::map<Idx,Idx> sccxmap;
1103 for(;cit!=cit_end;++cit) {
1112 for(;sit!=sit_end;++sit){
1117 while(tit!=tit_end) {
1119 if(!cit->Exists(tit->X2)) {
1124 if(rProjectAlphabet. Exists(tit->Ev))
1137 for(;sit!=sit_end;++sit) sccxmap[*sit]=sccx;
1141 if(sccxmap.size()>0){
1142 FD_WPD(0,1, "ProjectNonDet() [SCC]: applying state substitution for #" << sccxmap.size() << " states");
1143 std::map<Idx,Idx>::iterator xxit;
1146 while(tit!=tit_end) {
1147 xxit=sccxmap.find(tit->X2);
1148 if(xxit==sccxmap.end()) {++tit; continue;}
1156 cit=scclist.begin();
1157 cit_end=scclist.end();
1158 for(;cit!=cit_end;++cit)
1172 while(!todod.empty()) {
1175 FD_WPD(donex. Size(), rGen. Size(), "ProjectNonDet() [FB-REACH]: done/size: "
1176 << donex. Size() << " / " << rGen. Size());
1179 currentstate = todod.top();
1181 FD_DF( "ProjectNonDet: ---- current state: " << rGen. SStr(currentstate));
1184 if(donex. Exists(currentstate)) continue;
1187 FD_DF( "ProjectNonDet: running f-reach on " << rGen. SStr(currentstate));
1189 todor.push(currentstate);
1191 doner. Insert(currentstate);
1192 Idx lastfound=currentstate;
1193 while(!todor.empty()) {
1194 reachstate = todor.top();
1200 for(; tit != tit_end; ++tit) {
1201 if(tit->X1 != reachstate) break;
1203 if(rProjectAlphabet. Exists(tit->Ev)) {
1204 if(doned. Insert(tit->X2))
1205 todod.push(tit->X2);
1212 if(doner. Insert(tit->X2))
1213 todor.push(tit->X2);
1218 donex. Insert(reachstate);
1219 if(reachstate!=currentstate) todox.push(reachstate);
1224 if(donex. Exists(currentstate)) continue;
1226 FD_DF( "ProjectNonDet: f-reach-proj found #" << doner. Size() << " reachable states");
1227 FD_DF( "ProjectNonDet: f-reach-proj found #" << (donex*doner).Size() << " exit states");
1232 FD_DF( "ProjectNonDet: f-reach-proj found #" << candx. Size() << " exit candidates");
1235 FD_DF( "ProjectNonDet: running b-reach-proj on exitstates");
1236 while(!todox.empty()) {
1237 exitstate = todox.top();
1239 FD_DF( "ProjectNonDet: -- b-reach on exit state: " << rGen. SStr(exitstate));
1246 for(;tit!=tit_end; ++tit) {
1247 if(tit->X1!=exitstate) break;
1252 rit_end = revrel. End();
1253 while(rit != rit_end) {
1254 if(rit->X2!=exitstate) break;
1260 if(donex. Exists(rit->X1)) {++rit; continue;}
1261 FD_DF( "ProjectNonDet: -- b-reach predecessor: " << rGen. SStr(rit->X1));
1264 tit_end=exits. End();
1265 for(;tit!=tit_end; ++tit)
1270 FD_DF( "unlink " << rit->Str());
1273 if(!donex. Exists(rit->X1)) {
1277 while(tit != tit_end) {
1278 if(rProjectAlphabet. Exists(tit->Ev)) { ++tit; continue;}
1284 FD_DF( "ProjectNonDet: b-reach new exit state: " << rGen. SStr(currentstate));
1285 todox.push(rit->X1);
1287 candx. Erase(rit->X1);
1295 revrel. Erase(rit++);
1302 #ifdef FAUDES_CHECKED
1303 if(!donex. Exists(currentstate))
1304 FD_WARN( "ProjectNonDet: ERROR: b-reach-proj stuck with #" << donex. Size() << " exit states");
1317 FD_WPD(0,1, "ProjectNonDet() [SCC]: done");
1342 if(&rResGen != &rGen) rResGen. Assign(rGen);
1409 if(&rResGen== &rGen) {
1410 pResGen= rResGen. New();
1413 Project(rGen,rProjectAlphabet,*pResGen);
1417 if(pResGen != &rResGen) {
1418 pResGen-> Move(rResGen);
1427 std::map<Idx,StateSet>& rEntryStatesMap, Generator& rResGen) {
1428 FD_DF( "Project(...)");
1430 std::map<Idx,StateSet> tmp_entrystatemap;
1432 if(&rResGen != &rGen) rResGen. Assign(rGen);
1439 std::vector<StateSet> subsets;
1440 std::vector<Idx> newindices;
1442 StateMin(*tmp, rResGen, subsets, newindices);
1444 std::vector<StateSet>::size_type i;
1445 std::map<Idx,StateSet>::iterator esmit;
1446 StateSet::Iterator sit;
1447 for (i = 0; i < subsets.size(); ++i) {
1449 for (sit = subsets[i].Begin(); sit != subsets[i].End(); ++sit) {
1450 esmit = tmp_entrystatemap.find(*sit);
1451 #ifdef FAUDES_DEBUG_CODE
1452 if (esmit == tmp_entrystatemap.end()) {
1453 FD_DF( "project internal error");
1461 rEntryStatesMap.insert(std::make_pair(newindices[i], tmpstates));
1471 std::stringstream errstr;
1472 errstr << "Input alphabet has to contain alphabet of generator \"" << rGen. Name() << "\"";
1473 throw Exception( "InvProject(Generator,EventSet)", errstr.str(), 506);
1478 FD_DF( "InvProject: adding events \"" << newevents. ToString()
1479 << "\" at every state");
1480 StateSet::Iterator lit;
1481 EventSet::Iterator eit;
1484 for (eit = newevents. Begin(); eit != newevents. End(); ++eit) {
1494 FD_DF( "aInvProject(..)");
1505 FD_DF( "aInvProject(..): fixing attributes: source " << typeid(*rProjectAlphabet. AttributeType()).name() <<
1507 for(EventSet::Iterator eit=newevents. Begin(); eit!=newevents. End(); ++eit)
1526 std::map<Idx,StateSet>& rEntryStatesMap) {
1527 std::map<StateSet,Idx>::const_iterator it;
1528 for (it = rRevEntryStatesMap.begin(); it != rRevEntryStatesMap.end(); ++it) {
1529 rEntryStatesMap.insert(std::make_pair(it->second, it->first));
libFAUDES 2.28a
--- 2016.09.13
--- c++ api documentaion by doxygen
|