|
|
Go to the documentation of this file.
25#include "syn_include.h"
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)
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)
libFAUDES 2.33k
--- 2025.09.16
--- c++ api documentaion by doxygen
|