45 FD_DF(
"IsBuechiControllable(\"" << rGenPlant.
Name() <<
"\", \"" << rGenCand.
Name() <<
"\")");
49 std::stringstream errstr;
50 errstr <<
"Alphabets of generators do not match.";
51 throw Exception(
"IsBuechiControllable(..)", errstr.str(), 100);
57 std::stringstream errstr;
58 errstr <<
"Argument \"" << rGenCand.
Name() <<
"\" is not omega-trim.";
59 throw Exception(
"IsBuechiControllable(..)", errstr.str(), 201);
62 std::stringstream errstr;
63 errstr <<
"Argument \"" << rGenPlant.
Name() <<
"\" is not omega-trim.";
64 throw Exception(
"IsBuechiControllable(..)", errstr.str(), 201);
70 if(rGenCand.
Empty()) {
71 FD_DF(
"IsBuechiControllable(..): empty candidate, pass");
77 if(rGenPlant.
Empty()) {
78 FD_DF(
"IsBuechiControllable(..): empty plant, fail");
85 std::stringstream errstr;
86 errstr <<
"Arguments are expected to be deterministic.";
87 throw Exception(
"IsBuechiControllable", errstr.str(), 202);
99 FD_DF(
"IsBuechiControllable(...): passed");
303 FD_DF(
"ControlledBuechiLiveness()");
306 StateSet resolved, initialK, targetLstar;
326 targetLstar = (initialK * rSupCandGen.
MarkedStates()) + resolved;
327 FD_DF(
"ControlledBuechiLiveness(): [STD] iterate resolved/targetLstar #" << rsz <<
"/" << targetLstar.
Size());
338 targetL=targetLstar+initialL;
339 FD_DF(
"ControlledBuechiLiveness(): [STD] ---- iterate targetL #" << targetL.
Size());
345 targetL = targetLstar + initialL;
348 FD_DF(
"ControlledBuechiLiveness(): [STD] --- iterate domainL #" << domainL.
Size());
351 FD_WPC(1,2,
"ControlledBuechiLiveness(): [STD] iterating reverse dynamics");
354 domain=domainL-rPlantMarking;
363 target = targetL + (target1-rPlantMarking);
366 FD_DF(
"ControlledBuechiLiveness(): [STD] -- evaluate theta for target/domain # "
367 << target.
Size() <<
"/" << domain.
Size());
369 StateSet::Iterator sit = full.
Begin();
370 StateSet::Iterator sit_end = full.
End();
371 for(;sit!=sit_end;++sit) {
376 for(;tit!=tit_end; ++tit) {
377 if(target.
Exists(tit->X2)) {pass =
true;
continue;}
378 if(domain.
Exists(tit->X2)) {
continue;}
379 if(!rCAlph.
Exists(tit->Ev)){ fail =
true;
break;}
383 FD_DF(
"ControlledBuechiLiveness(): [STD] theta found state " << rSupCandGen.
SStr(*sit));
389 if(target1.
Size()==t1sz)
break;
390 if(target1.
Size()==fsz)
break;
393 FD_DF(
"ControlledBuechiLiveness(): [STD] -- mu-target1 # " << target1.
Size());
397 if(domainL.
Size()==dLsz)
break;
398 if(domainL.
Size()==0)
break;
401 FD_DF(
"ControlledBuechiLiveness(): [STD] --- nu-domainL-mu-target1 # " << domainL.
Size());
404 initialL.InsertSet(domainL);
405 if(initialL.Size()==iLsz)
break;
406 if(initialL.Size()==fsz)
break;
411 if(initialK.
Size()==iKsz)
break;
412 if(initialK.
Size()==0)
break;
417 if(resolved.
Size()==rsz)
break;
418 if(resolved.
Size()==fsz)
break;
438 std::map< Idx , EventSet>& rFeedbackMap)
441 FD_DF(
"ControlledBuechiLiveness()");
444 StateSet resolved, initialK, targetLstar;
451 std::map< Idx , EventSet> controls1;
452 std::map< Idx , EventSet> controls1L;
453 std::map< Idx , EventSet> controls1X;
466 targetLstar = (initialK * rSupCandGen.
MarkedStates()) + resolved;
467 FD_DF(
"ControlledBuechiLiveness(): [FBM] iterate resolved/targetLstar #" << xsz <<
"/" << targetLstar.
Size());
476 targetL = targetLstar + initialL;
477 FD_DF(
"ControlledBuechiLiveness(): [FBM] ---- iterate targetL #" << targetL.
Size());
483 domain=domainL-rPlantMarking;
484 FD_DF(
"ControlledBuechiLiveness(): [FBM] --- iterate domain #" << domain.
Size());
490 FD_WPC(1,2,
"ControlledBuechiLiveness(): [FBM] iterating reverse dynamics");
496 target = targetL + (target1-rPlantMarking);
499 FD_DF(
"ControlledBuechiLiveness(): [FBM] -- evaluate theta for target/domain # "
500 << target.
Size() <<
"/" << domain.
Size());
502 StateSet::Iterator sit = full.
Begin();
503 StateSet::Iterator sit_end = full.
End();
504 for(;sit!=sit_end;++sit) {
510 for(;tit!=tit_end; ++tit) {
511 if(target.
Exists(tit->X2)) { pass =
true;
continue; }
512 if(domain.
Exists(tit->X2)) {
continue; }
513 if(!rCAlph.
Exists(tit->Ev)){ fail =
true;
break; }
518 if(controls1.find(*sit)==controls1.end()) controls1[*sit]=disable;
519 FD_DF(
"ControlledBuechiLiveness(): [FBM] theta found state " << rSupCandGen.
SStr(*sit));
520 #ifdef FAUDES_DEBUG_FUNCTION
528 if(target1.
Size()==t1sz)
break;
529 if(target1.
Size()==fsz)
break;
532 FD_DF(
"ControlledBuechiLiveness(): [FBM] -- mu-target1 # " << target1.
Size());
536 if(domainL.
Size()==dsz)
break;
537 if(domainL.
Size()==0)
break;
540 FD_DF(
"ControlledBuechiLiveness(): [FBM] --- nu-domainL-mu-target1 # " << domainL.
Size());
543 std::map< Idx , EventSet>::iterator cit=controls1.begin();
544 std::map< Idx , EventSet>::iterator cit_end=controls1.end();
545 for(;cit!=cit_end;++cit) {
546 if(controls1L.find(cit->first)!=controls1L.end())
continue;
547 controls1L[cit->first]=cit->second;
551 initialL.InsertSet(domainL);
552 if(initialL.Size()==t1Lsz)
break;
553 if(initialL.Size()==fsz)
break;
558 if(initialK.
Size()==rsz)
break;
559 if(initialK.
Size()==0)
break;
563 std::map< Idx , EventSet>::iterator cit=controls1L.begin();
564 std::map< Idx , EventSet>::iterator cit_end=controls1L.end();
565 for(;cit!=cit_end;++cit) {
566 if(controls1X.find(cit->first)!=controls1X.end())
continue;
567 controls1X[cit->first]=cit->second;
572 if(resolved.
Size()==xsz)
break;
573 if(resolved.
Size()==fsz)
break;
581 StateSet::Iterator sit = resolved.
Begin();
582 StateSet::Iterator sit_end = resolved.
End();
583 for(;sit!=sit_end;++sit) {
584 FD_DF(
"ControlledBuechiLiveness(): [FBM] controls " << rSupCandGen.
SStr(*sit) <<
" " << controls1X[*sit].ToString());
585 rFeedbackMap[*sit]= (rSupCandGen.
ActiveEventSet(*sit) + ucalph) - controls1X[*sit];
605 std::set< EventSet >::iterator eit =
enable_one.begin();
606 std::set< EventSet >::iterator eit_end =
enable_one.end();
607 for(; eit!=eit_end ; ++eit)
631 std::map< Idx , Idx>& rControllerStatesMap,
632 std::map< Idx , EventSet>& rFeedbackMap)
635 FD_DF(
"ControlledBuechiLiveness(): [POBS]: cand #" << rSupCandGen.
Size());
638 StateSet::Iterator xit = rSupCandGen.
StatesBegin();
639 StateSet::Iterator xit_end = rSupCandGen.
StatesEnd();
640 for(;xit!=xit_end;++xit) {
641 std::map< Idx , Idx >::const_iterator cxit=rControllerStatesMap.find(*xit);
642 if(cxit==rControllerStatesMap.end()) rControllerStatesMap[*xit]=*xit;
646 std::map< Idx , Idx>::const_iterator oit = rControllerStatesMap.begin();
647 std::set< Idx > ostates;
648 for(; oit != rControllerStatesMap.end(); ++oit)
649 ostates.insert(oit->second);
650 FD_DF(
"ControlledBuechiLiveness(): [POBS]: " <<
"obs #" << ostates.size());
653 StateSet resolved, initialK, targetLstar;
661 std::map< Idx , MCtrlPattern> controlsT;
662 std::map< Idx , MCtrlPattern> controls1;
663 std::map< Idx , MCtrlPattern> controls1L;
664 std::map< Idx , MCtrlPattern> controls1X;
677 targetLstar = (initialK * rSupCandGen.
MarkedStates()) + resolved;
678 FD_DF(
"ControlledBuechiLiveness(): [POBS] iterate resolved/targetLstar #" << xsz <<
"/" << targetLstar.
Size());
687 targetL = targetLstar + initialL;
688 FD_DF(
"ControlledBuechiLiveness(): [POBS] ---- iterate targetL #" << targetL.
Size());
694 domain=domainL-rPlantMarking;
695 FD_DF(
"ControlledBuechiLiveness(): [POBS] --- iterate domain #" << domain.
Size());
701 FD_WPC(1,2,
"ControlledBuechiLiveness(): [POBS] iterating reverse dynamics");
707 target = targetL + (target1-rPlantMarking);
710 FD_DF(
"ControlledBuechiLiveness(): [POBS] -- evaluate theta for target/domain # "
711 << target.
Size() <<
"/" << domain.
Size());
716 StateSet::Iterator sit = full.
Begin();
717 StateSet::Iterator sit_end = full.
End();
718 for(;sit!=sit_end;++sit) {
719 Idx cx=rControllerStatesMap[*sit];
726 for(;tit!=tit_end; ++tit) {
727 if(disable.
Exists(tit->Ev))
continue;
728 if(target.
Exists(tit->X2)) {enable.
Insert(tit->Ev); pass =
true;
continue;}
729 if(domain.
Exists(tit->X2)) {
continue;}
730 if(!rCAlph.
Exists(tit->Ev)){ fail =
true;
break;}
735 if(controlsT.find(cx)==controlsT.end()) {
736 if(controls1.find(cx)!=controls1.end())
737 controlsT[cx].merge(controls1[cx]);
738 if(controls1L.find(cx)!=controls1L.end())
739 controlsT[cx].merge(controls1L[cx]);
740 if(controls1X.find(cx)!=controls1X.end())
741 controlsT[cx].merge(controls1X[cx]);
744 controlsT[cx].disable_all.InsertSet(disable);
745 controlsT[cx].enable_one.insert(enable);
750 std::map< Idx , MCtrlPattern >::iterator cpit=controlsT.begin();
751 std::map< Idx , MCtrlPattern >::iterator cpit_end=controlsT.end();
752 while(cpit!=cpit_end) {
753 if(cpit->second.conflict()) {controlsT.erase(cpit++);
continue;}
754 controls1[cpit->first].merge(cpit->second);
761 for(;sit!=sit_end;++sit) {
764 Idx cx=rControllerStatesMap[*sit];
765 if(controls1.find(cx)==controls1.end())
continue;
766 disable=controls1[cx].disable_all;
769 for(;tit!=tit_end; ++tit) {
770 if(disable.
Exists(tit->Ev))
continue;
771 if(target.
Exists(tit->X2)) {pass =
true;
continue;}
772 if(domain.
Exists(tit->X2)) {
continue;}
783 if(target1.
Size()==t1sz)
break;
784 if(target1.
Size()==fsz)
break;
787 FD_DF(
"ControlledBuechiLiveness(): [POBS] -- mu-target1 # " << target1.
Size());
791 if(domainL.
Size()==dsz)
break;
792 if(domainL.
Size()==0)
break;
795 FD_DF(
"ControlledBuechiLiveness(): [POBS] --- nu-domainL-mu-target1 # " << domainL.
Size());
798 std::map< Idx , MCtrlPattern>::iterator cit = controls1.begin();
799 std::map< Idx , MCtrlPattern>::iterator cit_end = controls1.end();
800 for(;cit!=cit_end;++cit)
801 controls1L[cit->first].merge(cit->second);
804 initialL.InsertSet(domainL);
805 if(initialL.Size()==t1Lsz)
break;
806 if(initialL.Size()==fsz)
break;
811 if(initialK.
Size()==rsz)
break;
812 if(initialK.
Size()==0)
break;
816 std::map< Idx , MCtrlPattern>::iterator cit = controls1L.begin();
817 std::map< Idx , MCtrlPattern>::iterator cit_end = controls1L.end();
818 for(;cit!=cit_end;++cit)
819 controls1X[cit->first].merge(cit->second);
823 if(resolved.
Size()==xsz)
break;
824 if(resolved.
Size()==fsz)
break;
832 FD_DF(
"ControlledBuechiLiveness(): [POBS] ---- coaccessible ok");
834 FD_DF(
"ControlledBuechiLiveness(): [POBS] ---- complete ok");
836 FD_DF(
"ControlledBuechiLiveness(): [POBS] ---- init state ok");
839 StateSet::Iterator sit = resolved.
Begin();
840 StateSet::Iterator sit_end = resolved.
End();
841 for(;sit!=sit_end;++sit) {
842 Idx cx=rControllerStatesMap[*sit];
844 rFeedbackMap[*sit]= rSupCandGen.
Alphabet() - controls1X[cx].disable_all;
871 if (
q1 < other.
q1)
return(
true);
872 if (
q1 > other.
q1)
return(
false);
873 if (
q2 < other.
q2)
return(
true);
874 if (
q2 > other.
q2)
return(
false);
890 std::map< OPSState , Idx>& rProductCompositionMap,
893 FD_DF(
"SupBuechiConProduct(" << &rPlantGen <<
"," << &rSpecGen <<
")");
901 FD_DF(
"SupBuechiConProduct: plant got no initial states. "
902 <<
"parallel composition contains empty language.");
906 FD_DF(
"SupBuechiConProduct: spec got no initial states. "
907 <<
"parallel composition contains empty language.");
912 std::stack< OPSState > todo;
918 std::map< OPSState, Idx>::iterator rcit;
929 rProductCompositionMap[currentp] = currentt;
932 FD_DF(
"SupBuechiConProduct: processing reachable states:");
933 while(!todo.empty()) {
937 FD_WPC(rProductCompositionMap.size(),rProductCompositionMap.size()+todo.size(),
"SupBuechiConProduct(): processing");
938 FD_DF(
"SupBuechiConProduct(): processing" << rProductCompositionMap.size() <<
" " << todo.size());
940 currentp = todo.top();
941 currentt = rProductCompositionMap[currentp];
944 if(critical.
Exists(currentt))
continue;
946 FD_DF(
"SupBuechiConProduct: processing (" << currentp.
Str() <<
" -> " << currentt <<
")");
955 while((ptit != ptit_end) && (stit != stit_end)) {
956 FD_DF(
"SupBuechiConProduct: current plant-transition: " << rPlantGen.
TStr(*ptit) );
957 FD_DF(
"SupBuechiConProduct: current spec-transition: " << rSpecGen.
TStr(*stit));
959 if(ptit->Ev == stit->Ev) {
967 rcit = rProductCompositionMap.find(nextp);
968 if(rcit != rProductCompositionMap.end()) {
969 if(critical.
Exists(rcit->second)) {
970 FD_DF(
"SupBuechiConParallel: common event " << rSpecGen.
EStr(stit->Ev) <<
" to a critical states");
972 if(!rCAlph.
Exists(ptit->Ev)) {
973 FD_DF(
"SupBuechiConProduct: critical insert" << currentt);
974 critical.
Insert(currentt);
989 else if (ptit->Ev < stit->Ev) {
990 FD_DF(
"SupConProduct: " << rPlantGen.
EStr(ptit->Ev) <<
" is enabled in the plant but disabled in the specification");
992 if (!rCAlph.
Exists(ptit->Ev)) {
993 FD_DF(
"SupBuechiConProduct: disabled event " << rPlantGen.
EStr(ptit->Ev) <<
" is uncontrollable");
994 FD_DF(
"SupBuechiConProduct: critical insert" << currentt);
995 critical.
Insert(currentt);
1001 FD_DF(
"SupBuechiConProduct: incrementing plant transrel");
1006 FD_DF(
"SupBuechiConProduct: incrementing spec transrel");
1011 while (ptit != ptit_end) {
1012 FD_DF(
"SupBuechiConProduct: current g-transition: " << rPlantGen.
TStr(*ptit));
1013 FD_DF(
"SupBuechiConProduct: current h-transition: end");
1015 if (!rCAlph.
Exists(ptit->Ev)) {
1016 FD_DF(
"SupBuechiConProduct: asynchron executed uncontrollable "
1017 <<
"event " << rPlantGen.
EStr(ptit->Ev) <<
" leaves specification:");
1018 FD_DF(
"SupConProduct: critical insert" << rPlantGen.
SStr(currentt));
1019 critical.
Insert(currentt);
1023 FD_DF(
"SupBuechiConProduct: incrementing g transrel");
1028 if(critical.
Exists(currentt))
continue;
1031 FD_DF(
"SupBuechiConProduct(): processing pass2");
1037 while((ptit != ptit_end) && (stit != stit_end)) {
1038 FD_DF(
"SupBuechiConProduct: current plant-transition: " << rPlantGen.
TStr(*ptit) );
1039 FD_DF(
"SupBuechiConProduct: current spec-transition: " << rSpecGen.
TStr(*stit));
1041 if(ptit->Ev == stit->Ev) {
1042 if(!disable.
Exists(stit->Ev)) {
1043 FD_DF(
"SupBuechiConProduct: executing common event " << rPlantGen.
EStr(ptit->Ev));
1051 rcit = rProductCompositionMap.find(nextp);
1053 if(rcit == rProductCompositionMap.end()) {
1056 rProductCompositionMap[nextp] = nextt;
1060 FD_DF(
"SupBuechiConProduct: todo push: (" << nextp.
Str() <<
") -> " << nextt);
1062 nextt = rcit->second;
1065 FD_DF(
"SupBuechierParallel: add transition to new generator: " << rResGen.
TStr(
Transition(currentt, ptit->Ev, nextt)));
1073 else if (ptit->Ev < stit->Ev) {
1084 FD_DF(
"SupBuechiConProduct: deleting critical states: " << critical.
ToString());
1088 std::map< OPSState , Idx>::iterator cit = rProductCompositionMap.begin();
1089 while(cit != rProductCompositionMap.end())
1090 if(!rResGen.
ExistsState(cit->second)) rProductCompositionMap.erase(cit++);
1106 FD_DF(
"SupBuechiConUnchecked(\"" << rPlantGen.
Name() <<
"\", \"" << rSpecGen.
Name() <<
"\")");
1110 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1111 pResGen= rResGen.
New();
1117 FD_DF(
"SupBuechiCon: controllable events: " << rCAlph.
ToString());
1120 std::map< OPSState , Idx> cmap;
1124 rPlantMarking.
Clear();
1125 std::map< OPSState, Idx>::iterator pcit;
1126 for(pcit=cmap.begin(); pcit!=cmap.end(); ++pcit)
1128 rPlantMarking.
Insert(pcit->second);
1131 #ifdef FAUDES_DEBUG_FUNCTION
1132 std::map< OPSState, Idx>::iterator dcit;
1133 for(dcit=cmap.begin(); dcit!=cmap.end(); ++dcit) {
1134 Idx x1=dcit->first.q1;
1135 Idx x2=dcit->first.q2;
1136 bool m1requ=dcit->first.m1required;
1137 Idx x12=dcit->second;
1139 std::string name1= rPlantGen.
StateName(x1);
1141 std::string name2= rSpecGen.
StateName(x2);
1144 if(m1requ) name12= name1 +
"|" + name2 +
"|r1m";
1145 else name12= name1 +
"|" + name2 +
"|r2m";
1151 #ifdef FAUDES_DEBUG_FUNCTION
1153 pResGen->
Write(
"tmp_syn_xxx_"+pResGen->
Name()+
".gen");
1160 if(pResGen->
Empty())
break;
1164 FD_DF(
"SupBuechiCon: iterate: do prefix con on #" << pResGen->
Size());
1166 FD_DF(
"SupBuechiCon: iterate: do coaccessible on #" << pResGen->
Size());
1168 FD_DF(
"SupBuechiCon: iterate: do accessible on #" << pResGen->
Size());
1170 FD_DF(
"SupBuechiCon: iterate: do complete on #" << pResGen->
Size());
1172 if(pResGen->
Size() == count1)
break;
1173 if(pResGen->
Size() == 0)
break;
1177 FD_DF(
"SupBuechiCon: iterate: do controlled liveness on #" << pResGen->
Size());
1179 if(pResGen->
Size() == count2)
break;
1183 std::map< OPSState, Idx>::iterator rcit;
1185 for(rcit=cmap.begin(); rcit!=cmap.end(); rcit++) {
1186 Idx x1=rcit->first.q1;
1187 Idx x2=rcit->first.q2;
1188 bool m1requ=rcit->first.m1required;
1189 Idx x12=rcit->second;
1191 std::string name1= rPlantGen.
StateName(x1);
1193 std::string name2= rSpecGen.
StateName(x2);
1196 if(m1requ) name12= name1 +
"|" + name2 +
"|r1m";
1197 else name12= name1 +
"|" + name2 +
"|r2m";
1207 if(pResGen != &rResGen) {
1208 pResGen->
Move(rResGen);
1212 FD_DF(
"SupBuechiCon: return #" << rResGen.
Size());
1223 std::map< Idx , Idx >& rObserverStateMap,
1224 std::map< Idx , EventSet>& rFeedbackMap,
1227 FD_DF(
"SupBuechiConNorm(\"" << rPlantGen.
Name() <<
"\", \"" << rSpecGen.
Name() <<
"\")");
1231 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1232 pResGen= rResGen.
New();
1238 FD_DF(
"SupBuechiConNorm: controllable events: " << rCAlph.
ToString());
1239 FD_DF(
"SupBuechiConNorm: un-observabel events: " << (rPlantGen.
Alphabet()-rOAlph).ToString());
1242 std::map< OPSState , Idx> cmap;
1250 rPlantMarking.
Clear();
1251 std::map< OPSState, Idx>::iterator pcit;
1252 for(pcit=cmap.begin(); pcit!=cmap.end(); ++pcit)
1254 rPlantMarking.
Insert(pcit->second);
1261 std::map< std::pair<Idx,Idx>,
Idx> rObserverCompositionMap;
1262 Product(*pResGen, obsG, rObserverCompositionMap, *pResGen);
1265 std::map< std::pair<Idx,Idx>,
Idx>::iterator cit;
1266 for(cit=rObserverCompositionMap.begin(); cit!=rObserverCompositionMap.end();++cit)
1267 if(rPlantMarking.
Exists(cit->first.first)) fixmarking.
Insert(cit->second);
1268 rPlantMarking=fixmarking;
1270 std::map< std::pair<Idx,Idx>,
Idx>::iterator sit;
1271 for(sit=rObserverCompositionMap.begin(); sit!=rObserverCompositionMap.end();++sit)
1272 rObserverStateMap[sit->second]=sit->first.second;
1274 #ifdef FAUDES_DEBUG_FUNCTION
1276 pResGen->
Write(
"tmp_syn_xxx_"+pResGen->
Name()+
".gen");
1280 FD_DF(
"SupBuechiConNorm(): cand #" << pResGen->
Size() <<
" obs #" << obsG.
Size());
1284 if(pResGen->
Empty())
break;
1288 FD_DF(
"SupBuechiConNorm: iterate: do prefix-contr on #" << pResGen->
Size());
1290 FD_DF(
"SupBuechiConNorm: iterate: do accessible on #" << pResGen->
Size());
1292 FD_DF(
"SupBuechiConNorm: iterate: do coaccessible on #" << pResGen->
Size());
1294 FD_DF(
"SupBuechiConNorm: iterate: do prefix-norm on #" << pResGen->
Size());
1296 FD_DF(
"SupBuechiConNorm: iterate: do coaccessible on #" << pResGen->
Size());
1298 FD_DF(
"SupBuechiConNorm: iterate: do accessible on #" << pResGen->
Size());
1300 FD_DF(
"SupBuechiConNorm: iterate: do complete on #" << pResGen->
Size());
1302 if(pResGen->
Size() == count1)
break;
1303 if(pResGen->
Size() == 0)
break;
1307 FD_DF(
"SupBuechiConNorm: iterate: do controlled liveness on #" << pResGen->
Size());
1310 std::map< Idx , Idx>::iterator oit = rObserverStateMap.begin();
1311 while(oit != rObserverStateMap.end())
1312 if(!pResGen->
ExistsState(oit->first)) rObserverStateMap.erase(oit++);
1314 std::set< Idx > ostates;
1315 for(oit = rObserverStateMap.begin(); oit != rObserverStateMap.end(); ++oit)
1316 ostates.insert(oit->second);
1319 FD_DF(
"SupBuechiConNorm(): cand #" << pResGen->
Size() <<
" obs #" << ostates.size());
1320 std::map< Idx , EventSet> feedback;
1323 if(pResGen->
Size() == count2)
break;
1327 if(pResGen != &rResGen) {
1328 pResGen->
Move(rResGen);
1366 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1367 pResGen= rResGen.
New();
1374 if(pResGen != &rResGen) {
1375 pResGen->
Move(rResGen);
1394 std::map< Idx , EventSet> feedback;
1398 StateSet::Iterator sit_end = rResGen.
StatesEnd();
1399 for(;sit!=sit_end;++sit) {
1400 const EventSet& pattern = feedback[*sit];
1403 while(tit!=tit_end) {
1404 if(pattern.
Exists(tit->Ev)) { tit++;
continue;};
1414 throw Exception(
"BuechiCon(..)",
"ERROR: controllability test failed", 500);
1417 throw Exception(
"BuechiCon(..)",
"ERROR: rel. top. closedness test failed", 500);
1434 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1435 pResGen= rResGen.
New();
1442 if(pResGen != &rResGen) {
1443 pResGen->
Move(rResGen);
1460 std::map< Idx , Idx> constates;
1461 std::map< Idx , EventSet> feedback;
1477 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1478 pResGen= rResGen.
New();
1485 if(pResGen != &rResGen) {
1486 pResGen->
Move(rResGen);
1504 std::map< Idx , Idx> cxmap;
1505 std::map< Idx , EventSet> feedback;
1511 StateSet::Iterator sit_end = rResGen.
StatesEnd();
1512 for(;sit!=sit_end;++sit) {
1514 const EventSet& pattern = feedback[*sit];
1517 while(tit!=tit_end) {
1518 if(pattern.
Exists(tit->Ev)) { tit++;
continue;};
1527 throw Exception(
"BuechiConNorm(..)",
"ERROR: controllability test failed", 500);
1530 throw Exception(
"BuechiConNorm(..)",
"ERROR: rel. top. closedness test failed", 500);
1538 throw Exception(
"BuechiConNorm(..)",
"ERROR: prefix normality test failed", 500);
1554 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1555 pResGen= rResGen.
New();
1562 if(pResGen != &rResGen) {
1563 pResGen->
Move(rResGen);
#define FD_WPC(cntnow, contdone, message)
const std::string & Name(void) const
std::set< EventSet > enable_one
void merge(const MCtrlPattern &other)
bool Exists(const Idx &rIndex) const
virtual void InsertSet(const NameSet &rOtherSet)
bool Insert(const Idx &rIndex)
bool operator<(const OPSState &other) const
OPSState(const Idx &rq1, const Idx &rq2, const bool &rf)
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
const TaEventSet< EventAttr > & Alphabet(void) const
EventSet ControllableEvents(void) const
EventSet ObservableEvents(void) const
void DWrite(const Type *pContext=0) const
std::string ToString(const std::string &rLabel="", const Type *pContext=0) const
void Write(const Type *pContext=0) const
StateSet::Iterator StatesBegin(void) const
StateSet::Iterator InitStatesBegin(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
const StateSet & MarkedStates(void) const
const EventSet & Alphabet(void) const
virtual void Move(vGenerator &rGen)
bool InitStatesEmpty(void) const
EventSet ActiveEventSet(Idx x1) const
const StateSet & InitStates(void) const
TransSet::Iterator TransRelBegin(void) const
void ClrTransition(Idx x1, Idx ev, Idx x2)
void WriteStateSet(const StateSet &rStateSet) const
bool IsComplete(void) const
virtual vGenerator * New(void) const
bool ExistsState(Idx index) const
bool IsCoaccessible(void) const
std::string TStr(const Transition &rTrans) const
std::string StateName(Idx index) const
StateSet::Iterator StatesEnd(void) const
void DelStates(const StateSet &rDelStates)
TransSet::Iterator TransRelEnd(void) const
std::string EStr(Idx index) const
void SetMarkedState(Idx index)
virtual void EventAttributes(const EventSet &rEventSet)
bool StateNamesEnabled(void) const
std::string SStr(Idx index) const
bool ExistsMarkedState(Idx index) const
std::string UniqueStateName(const std::string &rName) const
const StateSet & States(void) const
void InjectAlphabet(const EventSet &rNewalphabet)
bool Exists(const T &rElem) const
virtual void RestrictSet(const TBaseSet &rOtherSet)
virtual void InsertSet(const TBaseSet &rOtherSet)
Iterator Begin(void) const
void Product(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void MarkAllStates(vGenerator &rGen)
void Project(const Generator &rGen, const EventSet &rProjectAlphabet, Generator &rResGen)
void InvProject(Generator &rGen, const EventSet &rProjectAlphabet)
bool IsDeterministic(const vGenerator &rGen)
void BuechiConNorm(const Generator &rPlantGen, const EventSet &rCAlph, const EventSet &rOAlph, const Generator &rSpecGen, Generator &rResGen)
void SupBuechiCon(const Generator &rPlantGen, const EventSet &rCAlph, const Generator &rSpecGen, Generator &rResGen)
bool IsBuechiControllable(const Generator &rGenPlant, const EventSet &rCAlph, const Generator &rGenCand)
bool BuechiTrim(vGenerator &rGen)
void BuechiCon(const Generator &rPlantGen, const EventSet &rCAlph, const Generator &rSpecGen, Generator &rResGen)
void SupBuechiConNorm(const Generator &rPlantGen, const EventSet &rCAlph, const EventSet &rOAlph, const Generator &rSpecGen, Generator &rResGen)
bool IsControllable(const Generator &rPlantGen, const EventSet &rCAlph, const Generator &rSupCandGen)
bool IsNormal(const Generator &rL, const EventSet &rOAlph, const Generator &rK)
bool IsControllableUnchecked(const Generator &rPlantGen, const EventSet &rCAlph, const Generator &rSupCandGen, StateSet &rCriticalStates)
void SupBuechiConUnchecked(const Generator &rPlantGen, const EventSet &rCAlph, const Generator &rSpecGen, StateSet &rPlantMarking, Generator &rResGen)
void SupConNormClosedUnchecked(const Generator &rPlantGen, const EventSet &rCAlph, const EventSet &rOAlph, Generator &rObserverGen, Generator &rSupCandGen)
bool ControlledBuechiLiveness(Generator &rSupCandGen, const EventSet &rCAlph, const StateSet &rPlantMarking)
void ControlProblemConsistencyCheck(const GeneratorVector &rPlantGenVec, const EventSet &rConAlph, const GeneratorVector &rSpecGenVec)
void SupConClosedUnchecked(const Generator &rPlantGen, const EventSet &rCAlph, Generator &rSupCandGen)
bool IsBuechiTrim(const vGenerator &rGen)
bool IsBuechiRelativelyClosed(const Generator &rGenPlant, const Generator &rGenCand)
std::string ToStringInteger(Int number)
void SupBuechiConProduct(const Generator &rPlantGen, const EventSet &rCAlph, const Generator &rSpecGen, std::map< OPSState, Idx > &rProductCompositionMap, Generator &rResGen)
void SupBuechiConNormUnchecked(const Generator &rPlantGen, const EventSet &rCAlph, const EventSet &rOAlph, const Generator &rSpecGen, StateSet &rPlantMarking, std::map< Idx, Idx > &rObserverStateMap, std::map< Idx, EventSet > &rFeedbackMap, Generator &rResGen)
std::string CollapsString(const std::string &rString, unsigned int len)
bool IsBuechiRelativelyClosedUnchecked(const Generator &rGenPlant, const Generator &rGenCand)