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;
439 std::map< Idx , EventSet>& rFeedbackMap)
442 FD_WARN(
"ControlledBuechiLiveness()");
445 StateSet resolved, initialK, targetLstar;
452 std::map< Idx , EventSet> controls1;
453 std::map< Idx , EventSet> controls1L;
454 std::map< Idx , EventSet> controls1X;
467 targetLstar = (initialK * rSupCandGen.
MarkedStates()) + resolved;
468 FD_WARN(
"ControlledBuechiLiveness(): [FBM] iterate resolved/targetLstar #" << xsz <<
"/" << targetLstar.
Size());
477 targetL = targetLstar + initialL;
478 FD_WARN(
"ControlledBuechiLiveness(): [FBM] ---- iterate targetL #" << targetL.
Size());
484 domain=domainL-rPlantMarking;
485 FD_WARN(
"ControlledBuechiLiveness(): [FBM] --- iterate domain #" << domain.
Size());
491 FD_WPC(1,2,
"ControlledBuechiLiveness(): [FBM] iterating reverse dynamics");
497 target = targetL + (target1-rPlantMarking);
500 FD_WARN(
"ControlledBuechiLiveness(): [FBM] -- evaluate theta for target/domain # "
501 << target.
Size() <<
"/" << domain.
Size());
503 StateSet::Iterator sit = full.
Begin();
504 StateSet::Iterator sit_end = full.
End();
505 for(;sit!=sit_end;++sit) {
511 for(;tit!=tit_end; ++tit) {
512 if(target.
Exists(tit->X2)) { pass =
true;
continue; }
513 if(domain.
Exists(tit->X2)) {
continue; }
514 if(!rCAlph.
Exists(tit->Ev)){ fail =
true;
break; }
519 if(controls1.find(*sit)==controls1.end()) controls1[*sit]=disable;
520 FD_WARN(
"ControlledBuechiLiveness(): [FBM] theta found state " << rSupCandGen.
SStr(*sit));
527 if(target1.
Size()==t1sz)
break;
528 if(target1.
Size()==fsz)
break;
531 FD_WARN(
"ControlledBuechiLiveness(): [FBM] -- mu-target1 # " << target1.
Size());
535 if(domainL.
Size()==dsz)
break;
536 if(domainL.
Size()==0)
break;
539 FD_WARN(
"ControlledBuechiLiveness(): [FBM] --- nu-domainL-mu-target1 # " << domainL.
Size());
542 std::map< Idx , EventSet>::iterator cit=controls1.begin();
543 std::map< Idx , EventSet>::iterator cit_end=controls1.end();
544 for(;cit!=cit_end;++cit) {
545 if(controls1L.find(cit->first)!=controls1L.end())
continue;
546 controls1L[cit->first]=cit->second;
550 initialL.InsertSet(domainL);
551 if(initialL.Size()==t1Lsz)
break;
552 if(initialL.Size()==fsz)
break;
557 if(initialK.
Size()==rsz)
break;
558 if(initialK.
Size()==0)
break;
562 std::map< Idx , EventSet>::iterator cit=controls1L.begin();
563 std::map< Idx , EventSet>::iterator cit_end=controls1L.end();
564 for(;cit!=cit_end;++cit) {
565 if(controls1X.find(cit->first)!=controls1X.end())
continue;
566 controls1X[cit->first]=cit->second;
571 if(resolved.
Size()==xsz)
break;
572 if(resolved.
Size()==fsz)
break;
580 StateSet::Iterator sit = resolved.
Begin();
581 StateSet::Iterator sit_end = resolved.
End();
582 for(;sit!=sit_end;++sit) {
583 FD_WARN(
"ControlledBuechiLiveness(): [FBM] controls " << rSupCandGen.
SStr(*sit) <<
" " << controls1X[*sit].ToString());
584 rFeedbackMap[*sit]= (rSupCandGen.
ActiveEventSet(*sit) + ucalph) - controls1X[*sit];
604 std::set< EventSet >::iterator eit =
enable_one.begin();
605 std::set< EventSet >::iterator eit_end =
enable_one.end();
606 for(; eit!=eit_end ; ++eit)
630 std::map< Idx , Idx>& rControllerStatesMap,
631 std::map< Idx , EventSet>& rFeedbackMap)
634 FD_WARN(
"ControlledBuechiLiveness(): [POBS]: cand #" << rSupCandGen.
Size());
637 StateSet::Iterator xit = rSupCandGen.
StatesBegin();
638 StateSet::Iterator xit_end = rSupCandGen.
StatesEnd();
639 for(;xit!=xit_end;++xit) {
640 std::map< Idx , Idx >::const_iterator cxit=rControllerStatesMap.find(*xit);
641 if(cxit==rControllerStatesMap.end()) rControllerStatesMap[*xit]=*xit;
645 std::map< Idx , Idx>::const_iterator oit = rControllerStatesMap.begin();
646 std::set< Idx > ostates;
647 for(; oit != rControllerStatesMap.end(); ++oit)
648 ostates.insert(oit->second);
649 FD_WARN(
"ControlledBuechiLiveness(): [POBS]: " <<
"obs #" << ostates.size());
652 StateSet resolved, initialK, targetLstar;
660 std::map< Idx , MCtrlPattern> controlsT;
661 std::map< Idx , MCtrlPattern> controls1;
662 std::map< Idx , MCtrlPattern> controls1L;
663 std::map< Idx , MCtrlPattern> controls1X;
676 targetLstar = (initialK * rSupCandGen.
MarkedStates()) + resolved;
677 FD_WARN(
"ControlledBuechiLiveness(): [POBS] iterate resolved/targetLstar #" << xsz <<
"/" << targetLstar.
Size());
686 targetL = targetLstar + initialL;
687 FD_WARN(
"ControlledBuechiLiveness(): [POBS] ---- iterate targetL #" << targetL.
Size());
693 domain=domainL-rPlantMarking;
694 FD_WARN(
"ControlledBuechiLiveness(): [POBS] --- iterate domain #" << domain.
Size());
700 FD_WPC(1,2,
"ControlledBuechiLiveness(): [POBS] iterating reverse dynamics");
706 target = targetL + (target1-rPlantMarking);
709 FD_WARN(
"ControlledBuechiLiveness(): [POBS] -- evaluate theta for target/domain # "
710 << target.
Size() <<
"/" << domain.
Size());
715 StateSet::Iterator sit = full.
Begin();
716 StateSet::Iterator sit_end = full.
End();
717 for(;sit!=sit_end;++sit) {
718 Idx cx=rControllerStatesMap[*sit];
725 for(;tit!=tit_end; ++tit) {
726 if(disable.
Exists(tit->Ev))
continue;
727 if(target.
Exists(tit->X2)) {enable.
Insert(tit->Ev); pass =
true;
continue;}
728 if(domain.
Exists(tit->X2)) {
continue;}
729 if(!rCAlph.
Exists(tit->Ev)){ fail =
true;
break;}
734 if(controlsT.find(cx)==controlsT.end()) {
735 if(controls1.find(cx)!=controls1.end())
736 controlsT[cx].merge(controls1[cx]);
737 if(controls1L.find(cx)!=controls1L.end())
738 controlsT[cx].merge(controls1L[cx]);
739 if(controls1X.find(cx)!=controls1X.end())
740 controlsT[cx].merge(controls1X[cx]);
743 controlsT[cx].disable_all.InsertSet(disable);
744 controlsT[cx].enable_one.insert(enable);
749 std::map< Idx , MCtrlPattern >::iterator cpit=controlsT.begin();
750 std::map< Idx , MCtrlPattern >::iterator cpit_end=controlsT.end();
751 while(cpit!=cpit_end) {
752 if(cpit->second.conflict()) {controlsT.erase(cpit++);
continue;}
753 controls1[cpit->first].merge(cpit->second);
760 for(;sit!=sit_end;++sit) {
763 Idx cx=rControllerStatesMap[*sit];
764 if(controls1.find(cx)==controls1.end())
continue;
765 disable=controls1[cx].disable_all;
768 for(;tit!=tit_end; ++tit) {
769 if(disable.
Exists(tit->Ev))
continue;
770 if(target.
Exists(tit->X2)) {pass =
true;
continue;}
771 if(domain.
Exists(tit->X2)) {
continue;}
782 if(target1.
Size()==t1sz)
break;
783 if(target1.
Size()==fsz)
break;
786 FD_WARN(
"ControlledBuechiLiveness(): [POBS] -- mu-target1 # " << target1.
Size());
790 if(domainL.
Size()==dsz)
break;
791 if(domainL.
Size()==0)
break;
794 FD_WARN(
"ControlledBuechiLiveness(): [POBS] --- nu-domainL-mu-target1 # " << domainL.
Size());
797 std::map< Idx , MCtrlPattern>::iterator cit = controls1.begin();
798 std::map< Idx , MCtrlPattern>::iterator cit_end = controls1.end();
799 for(;cit!=cit_end;++cit)
800 controls1L[cit->first].merge(cit->second);
803 initialL.InsertSet(domainL);
804 if(initialL.Size()==t1Lsz)
break;
805 if(initialL.Size()==fsz)
break;
810 if(initialK.
Size()==rsz)
break;
811 if(initialK.
Size()==0)
break;
815 std::map< Idx , MCtrlPattern>::iterator cit = controls1L.begin();
816 std::map< Idx , MCtrlPattern>::iterator cit_end = controls1L.end();
817 for(;cit!=cit_end;++cit)
818 controls1X[cit->first].merge(cit->second);
822 if(resolved.
Size()==xsz)
break;
823 if(resolved.
Size()==fsz)
break;
831 FD_WARN(
"ControlledBuechiLiveness(): [POBS] ---- coaccessible ok");
833 FD_WARN(
"ControlledBuechiLiveness(): [POBS] ---- complete ok");
835 FD_WARN(
"ControlledBuechiLiveness(): [POBS] ---- init state ok");
838 StateSet::Iterator sit = resolved.
Begin();
839 StateSet::Iterator sit_end = resolved.
End();
840 for(;sit!=sit_end;++sit) {
841 Idx cx=rControllerStatesMap[*sit];
843 rFeedbackMap[*sit]= rSupCandGen.
Alphabet() - controls1X[cx].disable_all;
870 if (
q1 < other.
q1)
return(
true);
871 if (
q1 > other.
q1)
return(
false);
872 if (
q2 < other.
q2)
return(
true);
873 if (
q2 > other.
q2)
return(
false);
889 std::map< OPSState , Idx>& rProductCompositionMap,
892 FD_DF(
"SupBuechiConProduct(" << &rPlantGen <<
"," << &rSpecGen <<
")");
900 FD_DF(
"SupBuechiConProduct: plant got no initial states. "
901 <<
"parallel composition contains empty language.");
905 FD_DF(
"SupBuechiConProduct: spec got no initial states. "
906 <<
"parallel composition contains empty language.");
911 std::stack< OPSState > todo;
917 std::map< OPSState, Idx>::iterator rcit;
928 rProductCompositionMap[currentp] = currentt;
931 FD_DF(
"SupBuechiConProduct: processing reachable states:");
932 while(!todo.empty()) {
936 FD_WPC(rProductCompositionMap.size(),rProductCompositionMap.size()+todo.size(),
"SupBuechiConProduct(): processing");
937 FD_DF(
"SupBuechiConProduct(): processing" << rProductCompositionMap.size() <<
" " << todo.size());
939 currentp = todo.top();
940 currentt = rProductCompositionMap[currentp];
943 if(critical.
Exists(currentt))
continue;
945 FD_DF(
"SupBuechiConProduct: processing (" << currentp.
Str() <<
" -> " << currentt <<
")");
954 while((ptit != ptit_end) && (stit != stit_end)) {
955 FD_DF(
"SupBuechiConProduct: current plant-transition: " << rPlantGen.
TStr(*ptit) );
956 FD_DF(
"SupBuechiConProduct: current spec-transition: " << rSpecGen.
TStr(*stit));
958 if(ptit->Ev == stit->Ev) {
966 rcit = rProductCompositionMap.find(nextp);
967 if(rcit != rProductCompositionMap.end()) {
968 if(critical.
Exists(rcit->second)) {
969 FD_DF(
"SupBuechiConParallel: common event " << rSpecGen.
EStr(stit->Ev) <<
" to a critical states");
971 if(!rCAlph.
Exists(ptit->Ev)) {
972 FD_DF(
"SupBuechiConProduct: critical insert" << currentt);
973 critical.
Insert(currentt);
988 else if (ptit->Ev < stit->Ev) {
989 FD_DF(
"SupConProduct: " << rPlantGen.
EStr(ptit->Ev) <<
" is enabled in the plant but disabled in the specification");
991 if (!rCAlph.
Exists(ptit->Ev)) {
992 FD_DF(
"SupBuechiConProduct: disabled event " << rPlantGen.
EStr(ptit->Ev) <<
" is uncontrollable");
993 FD_DF(
"SupBuechiConProduct: critical insert" << currentt);
994 critical.
Insert(currentt);
1000 FD_DF(
"SupBuechiConProduct: incrementing plant transrel");
1005 FD_DF(
"SupBuechiConProduct: incrementing spec transrel");
1010 while (ptit != ptit_end) {
1011 FD_DF(
"SupBuechiConProduct: current g-transition: " << rPlantGen.
TStr(*ptit));
1012 FD_DF(
"SupBuechiConProduct: current h-transition: end");
1014 if (!rCAlph.
Exists(ptit->Ev)) {
1015 FD_DF(
"SupBuechiConProduct: asynchron executed uncontrollable "
1016 <<
"event " << rPlantGen.
EStr(ptit->Ev) <<
" leaves specification:");
1017 FD_DF(
"SupConProduct: critical insert" << rPlantGen.
SStr(currentt));
1018 critical.
Insert(currentt);
1022 FD_DF(
"SupBuechiConProduct: incrementing g transrel");
1027 if(critical.
Exists(currentt))
continue;
1030 FD_DF(
"SupBuechiConProduct(): processing pass2");
1036 while((ptit != ptit_end) && (stit != stit_end)) {
1037 FD_DF(
"SupBuechiConProduct: current plant-transition: " << rPlantGen.
TStr(*ptit) );
1038 FD_DF(
"SupBuechiConProduct: current spec-transition: " << rSpecGen.
TStr(*stit));
1040 if(ptit->Ev == stit->Ev) {
1041 if(!disable.
Exists(stit->Ev)) {
1042 FD_DF(
"SupBuechiConProduct: executing common event " << rPlantGen.
EStr(ptit->Ev));
1050 rcit = rProductCompositionMap.find(nextp);
1052 if(rcit == rProductCompositionMap.end()) {
1055 rProductCompositionMap[nextp] = nextt;
1059 FD_DF(
"SupBuechiConProduct: todo push: (" << nextp.
Str() <<
") -> " << nextt);
1061 nextt = rcit->second;
1064 FD_DF(
"SupBuechierParallel: add transition to new generator: " << rResGen.
TStr(
Transition(currentt, ptit->Ev, nextt)));
1072 else if (ptit->Ev < stit->Ev) {
1083 FD_DF(
"SupBuechiConProduct: deleting critical states: " << critical.
ToString());
1087 std::map< OPSState , Idx>::iterator cit = rProductCompositionMap.begin();
1088 while(cit != rProductCompositionMap.end())
1089 if(!rResGen.
ExistsState(cit->second)) rProductCompositionMap.erase(cit++);
1105 FD_DF(
"SupBuechiConUnchecked(\"" << rPlantGen.
Name() <<
"\", \"" << rSpecGen.
Name() <<
"\")");
1109 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1110 pResGen= rResGen.
New();
1116 FD_DF(
"SupBuechiCon: controllable events: " << rCAlph.
ToString());
1119 std::map< OPSState , Idx> cmap;
1123 rPlantMarking.
Clear();
1124 std::map< OPSState, Idx>::iterator pcit;
1125 for(pcit=cmap.begin(); pcit!=cmap.end(); ++pcit)
1127 rPlantMarking.
Insert(pcit->second);
1130 #ifdef FAUDES_DEBUG_FUNCTION
1131 std::map< OPSState, Idx>::iterator dcit;
1132 for(dcit=cmap.begin(); dcit!=cmap.end(); ++dcit) {
1133 Idx x1=dcit->first.q1;
1134 Idx x2=dcit->first.q2;
1135 bool m1requ=dcit->first.m1required;
1136 Idx x12=dcit->second;
1138 std::string name1= rPlantGen.
StateName(x1);
1140 std::string name2= rSpecGen.
StateName(x2);
1143 if(m1requ) name12= name1 +
"|" + name2 +
"|r1m";
1144 else name12= name1 +
"|" + name2 +
"|r2m";
1150 #ifdef FAUDES_DEBUG_FUNCTION
1152 pResGen->
Write(
"tmp_syn_xxx_"+pResGen->
Name()+
".gen");
1159 if(pResGen->
Empty())
break;
1163 FD_WARN(
"SupBuechiCon: iterate: do prefix con on #" << pResGen->
Size());
1165 FD_WARN(
"SupBuechiCon: iterate: do coaccessible on #" << pResGen->
Size());
1167 FD_WARN(
"SupBuechiCon: iterate: do accessible on #" << pResGen->
Size());
1169 FD_WARN(
"SupBuechiCon: iterate: do complete on #" << pResGen->
Size());
1171 if(pResGen->
Size() == count1)
break;
1172 if(pResGen->
Size() == 0)
break;
1176 FD_WARN(
"SupBuechiCon: iterate: do controlled liveness on #" << pResGen->
Size());
1178 if(pResGen->
Size() == count2)
break;
1182 std::map< OPSState, Idx>::iterator rcit;
1184 for(rcit=cmap.begin(); rcit!=cmap.end(); rcit++) {
1185 Idx x1=rcit->first.q1;
1186 Idx x2=rcit->first.q2;
1187 bool m1requ=rcit->first.m1required;
1188 Idx x12=rcit->second;
1190 std::string name1= rPlantGen.
StateName(x1);
1192 std::string name2= rSpecGen.
StateName(x2);
1195 if(m1requ) name12= name1 +
"|" + name2 +
"|r1m";
1196 else name12= name1 +
"|" + name2 +
"|r2m";
1206 if(pResGen != &rResGen) {
1207 pResGen->
Move(rResGen);
1211 FD_WARN(
"SupBuechiCon: return #" << rResGen.
Size());
1222 std::map< Idx , Idx >& rObserverStateMap,
1223 std::map< Idx , EventSet>& rFeedbackMap,
1226 FD_WARN(
"SupBuechiConNorm(\"" << rPlantGen.
Name() <<
"\", \"" << rSpecGen.
Name() <<
"\")");
1230 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1231 pResGen= rResGen.
New();
1237 FD_WARN(
"SupBuechiConNorm: controllable events: " << rCAlph.
ToString());
1238 FD_WARN(
"SupBuechiConNorm: un-observabel events: " << (rPlantGen.
Alphabet()-rOAlph).ToString());
1241 std::map< OPSState , Idx> cmap;
1249 rPlantMarking.
Clear();
1250 std::map< OPSState, Idx>::iterator pcit;
1251 for(pcit=cmap.begin(); pcit!=cmap.end(); ++pcit)
1253 rPlantMarking.
Insert(pcit->second);
1260 std::map< std::pair<Idx,Idx>,
Idx> rObserverCompositionMap;
1261 Product(*pResGen, obsG, rObserverCompositionMap, *pResGen);
1264 std::map< std::pair<Idx,Idx>,
Idx>::iterator cit;
1265 for(cit=rObserverCompositionMap.begin(); cit!=rObserverCompositionMap.end();++cit)
1266 if(rPlantMarking.
Exists(cit->first.first)) fixmarking.
Insert(cit->second);
1267 rPlantMarking=fixmarking;
1269 std::map< std::pair<Idx,Idx>,
Idx>::iterator sit;
1270 for(sit=rObserverCompositionMap.begin(); sit!=rObserverCompositionMap.end();++sit)
1271 rObserverStateMap[sit->second]=sit->first.second;
1273 #ifdef FAUDES_DEBUG_FUNCTION
1275 pResGen->
Write(
"tmp_syn_xxx_"+pResGen->
Name()+
".gen");
1279 FD_WARN(
"SupBuechiConNorm(): cand #" << pResGen->
Size() <<
" obs #" << obsG.
Size());
1283 if(pResGen->
Empty())
break;
1287 FD_WARN(
"SupBuechiConNorm: iterate: do prefix-contr on #" << pResGen->
Size());
1289 FD_WARN(
"SupBuechiConNorm: iterate: do accessible on #" << pResGen->
Size());
1291 FD_WARN(
"SupBuechiConNorm: iterate: do coaccessible on #" << pResGen->
Size());
1293 FD_WARN(
"SupBuechiConNorm: iterate: do prefix-norm on #" << pResGen->
Size());
1295 FD_WARN(
"SupBuechiConNorm: iterate: do coaccessible on #" << pResGen->
Size());
1297 FD_WARN(
"SupBuechiConNorm: iterate: do accessible on #" << pResGen->
Size());
1299 FD_WARN(
"SupBuechiConNorm: iterate: do complete on #" << pResGen->
Size());
1301 if(pResGen->
Size() == count1)
break;
1302 if(pResGen->
Size() == 0)
break;
1306 FD_WARN(
"SupBuechiConNorm: iterate: do controlled liveness on #" << pResGen->
Size());
1309 std::map< Idx , Idx>::iterator oit = rObserverStateMap.begin();
1310 while(oit != rObserverStateMap.end())
1311 if(!pResGen->
ExistsState(oit->first)) rObserverStateMap.erase(oit++);
1313 std::set< Idx > ostates;
1314 for(oit = rObserverStateMap.begin(); oit != rObserverStateMap.end(); ++oit)
1315 ostates.insert(oit->second);
1318 FD_WARN(
"SupBuechiConNorm(): cand #" << pResGen->
Size() <<
" obs #" << ostates.size());
1319 std::map< Idx , EventSet> feedback;
1322 if(pResGen->
Size() == count2)
break;
1326 if(pResGen != &rResGen) {
1327 pResGen->
Move(rResGen);
1365 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1366 pResGen= rResGen.
New();
1373 if(pResGen != &rResGen) {
1374 pResGen->
Move(rResGen);
1393 std::map< Idx , EventSet> feedback;
1397 StateSet::Iterator sit_end = rResGen.
StatesEnd();
1398 for(;sit!=sit_end;++sit) {
1399 const EventSet& pattern = feedback[*sit];
1402 while(tit!=tit_end) {
1403 if(pattern.
Exists(tit->Ev)) { tit++;
continue;};
1413 throw Exception(
"BuechiCon(..)",
"ERROR: controllability test failed", 500);
1416 throw Exception(
"BuechiCon(..)",
"ERROR: rel. top. closedness test failed", 500);
1432 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1433 pResGen= rResGen.
New();
1440 if(pResGen != &rResGen) {
1441 pResGen->
Move(rResGen);
1458 std::map< Idx , Idx> constates;
1459 std::map< Idx , EventSet> feedback;
1475 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1476 pResGen= rResGen.
New();
1483 if(pResGen != &rResGen) {
1484 pResGen->
Move(rResGen);
1502 std::map< Idx , Idx> cxmap;
1503 std::map< Idx , EventSet> feedback;
1509 StateSet::Iterator sit_end = rResGen.
StatesEnd();
1510 for(;sit!=sit_end;++sit) {
1512 const EventSet& pattern = feedback[*sit];
1515 while(tit!=tit_end) {
1516 if(pattern.
Exists(tit->Ev)) { tit++;
continue;};
1525 throw Exception(
"BuechiConNorm(..)",
"ERROR: controllability test failed", 500);
1528 throw Exception(
"BuechiConNorm(..)",
"ERROR: rel. top. closedness test failed", 500);
1536 throw Exception(
"BuechiConNorm(..)",
"ERROR: prefix normality test failed", 500);
1552 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
1553 pResGen= rResGen.
New();
1560 if(pResGen != &rResGen) {
1561 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 IsBuechiRelativelyClosed(const Generator &rGenPlant, const Generator &rGenCand)
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)
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)