65 FD_DF(
"IsBuechiTrim(): result " << res);
71 FD_DF(
"BuechiClosure("<< rGen.
Name() <<
")");
85 FD_DF(
"IsBuechiClosed("<< rGen.
Name() <<
")");
96 StateSet::Iterator sit_end = rGen.
States().
End();
98 for(; sit!=sit_end; ++sit) {
99 if(irrelevant.
Exists(*sit))
continue;
102 for (; tit != tit_end; ++tit) {
103 if(!irrelevant.
Exists(tit->X2))
break;
115 #ifdef FAUDES_DEBUG_FUNCTION
116 FD_DF(
"IsBuechiClosed(..): irrelevant states "<< irrelevant.
ToString());
121 std::list<StateSet> umsccs;
125 #ifdef FAUDES_DEBUG_FUNCTION
126 std::list<StateSet>::iterator ssit=umsccs.begin();
127 for(;ssit!=umsccs.end(); ++ssit) {
128 FD_DF(
"IsBuechiClosed(): GPlant-marked scc without GCand-mark: " << ssit->ToString());
132 return umsccs.empty();
147 if (
q1 < other.
q1)
return(
true);
148 if (
q1 > other.
q1)
return(
false);
149 if (
q2 < other.
q2)
return(
true);
150 if (
q2 > other.
q2)
return(
false);
170 FD_DF(
"BuechiProduct(" << &rGen1 <<
"," << &rGen2 <<
")");
174 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
175 pResGen= rResGen.
New();
185 std::map< OPState, Idx> reverseCompositionMap;
187 std::stack< OPState > todo;
189 OPState currentstates, newstates;
192 StateSet::Iterator lit1, lit2;
194 std::map< OPState, Idx>::iterator rcit;
196 FD_DF(
"BuechiProduct: adding all combinations of initial states to todo:");
199 currentstates =
OPState(*lit1, *lit2,
true);
200 todo.push(currentstates);
201 reverseCompositionMap[currentstates] = pResGen->
InsInitState();
202 FD_DF(
"BuechiProduct: " << currentstates.
Str() <<
" -> " << reverseCompositionMap[currentstates]);
207 FD_DF(
"BuechiProduct: processing reachable states:");
208 while (! todo.empty()) {
212 currentstates = todo.top();
214 FD_DF(
"BuechiProduct: processing (" << currentstates.
Str() <<
" -> " << reverseCompositionMap[currentstates]);
218 for(; tit1 != tit1_end; ++tit1) {
221 tit2_end = rGen2.
TransRelEnd(currentstates.q2, tit1->Ev);
222 for (; tit2 != tit2_end; ++tit2) {
223 newstates =
OPState(tit1->X2, tit2->X2,currentstates.m1required);
225 if(currentstates.m1required) {
233 rcit = reverseCompositionMap.find(newstates);
234 if(rcit == reverseCompositionMap.end()) {
235 todo.push(newstates);
240 reverseCompositionMap[newstates] = tmpstate;
241 FD_DF(
"BuechiProduct: todo push: (" << newstates.
Str() <<
") -> " << reverseCompositionMap[newstates]);
244 tmpstate = rcit->second;
248 FD_DF(
"BuechiProduct: add transition to new generator: " <<
249 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit1->Ev, tmpstate)));
259 for(rcit=reverseCompositionMap.begin(); rcit!=reverseCompositionMap.end(); rcit++) {
260 Idx x1=rcit->first.q1;
261 Idx x2=rcit->first.q2;
262 bool m1requ=rcit->first.m1required;
263 Idx x12=rcit->second;
269 std::string name12 = name1 +
"|" + name2;
270 if(m1requ) name12 +=
"|r1m";
271 else name12 +=
"|r2m";
281 if(pResGen != &rResGen) {
282 pResGen->
Move(rResGen);
297 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
298 pResGen= rResGen.
New();
308 if(pResGen != &rResGen) {
309 pResGen->
Move(rResGen);
320 FD_DF(
"BuechiParallel(" << &rGen1 <<
"," << &rGen2 <<
")");
323 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
324 pResGen= rResGen.
New();
335 FD_DF(
"BuechiParallel: shared events: " << sharedalphabet.
ToString());
338 std::map< OPState, Idx> reverseCompositionMap;
340 std::stack< OPState > todo;
342 OPState currentstates, newstates;
345 StateSet::Iterator lit1, lit2;
347 std::map< OPState, Idx>::iterator rcit;
349 FD_DF(
"BuechiParallel: adding all combinations of initial states to todo:");
352 currentstates =
OPState(*lit1, *lit2,
true);
358 todo.push(currentstates);
359 reverseCompositionMap[currentstates] = tmpstate;
360 FD_DF(
"BuechiParallel: " << currentstates.
Str() <<
" -> " << tmpstate);
365 FD_DF(
"BuechiParallel: processing reachable states:");
366 while (! todo.empty()) {
370 currentstates = todo.top();
372 FD_DF(
"BuechiParallel: processing (" << currentstates.
Str() <<
" -> "
373 << reverseCompositionMap[currentstates]);
378 for(; tit1 != tit1_end; ++tit1) {
380 if(! sharedalphabet.
Exists(tit1->Ev)) {
381 FD_DF(
"BuechiParallel: exists only in rGen1");
382 newstates =
OPState(tit1->X2, currentstates.q2, currentstates.m1required);
385 if(currentstates.m1required) {
392 rcit = reverseCompositionMap.find(newstates);
393 if (rcit == reverseCompositionMap.end()) {
394 todo.push(newstates);
397 reverseCompositionMap[newstates] = tmpstate;
398 FD_DF(
"BuechiParallel: todo push: " << newstates.
Str() <<
"|"
399 << reverseCompositionMap[newstates]);
402 tmpstate = rcit->second;
405 pResGen->
SetTransition(reverseCompositionMap[currentstates], tit1->Ev,
407 FD_DF(
"BuechiParallel: add transition to new generator: " <<
408 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit1->Ev, tmpstate)));
412 FD_DF(
"BuechiParallel: common event");
415 tit2_end = rGen2.
TransRelEnd(currentstates.q2, tit1->Ev);
416 for (; tit2 != tit2_end; ++tit2) {
417 newstates =
OPState(tit1->X2,tit2->X2,currentstates.m1required);
420 if(currentstates.m1required) {
432 rcit = reverseCompositionMap.find(newstates);
433 if (rcit == reverseCompositionMap.end()) {
434 todo.push(newstates);
437 reverseCompositionMap[newstates] = tmpstate;
438 FD_DF(
"BuechiParallel: todo push: (" << newstates.
Str() <<
") -> "
439 << reverseCompositionMap[newstates]);
442 tmpstate = rcit->second;
446 FD_DF(
"BuechiParallel: add transition to new generator: " <<
447 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit1->Ev, tmpstate)));
455 for (; tit2 != tit2_end; ++tit2) {
456 if (! sharedalphabet.
Exists(tit2->Ev)) {
457 FD_DF(
"BuechiParallel: exists only in rGen2: " << sharedalphabet.
Str(tit2->Ev));
458 newstates =
OPState(currentstates.q1, tit2->X2, currentstates.m1required);
461 if(!currentstates.m1required) {
467 FD_DF(
"BuechiParallel: set trans: " << currentstates.Str() <<
" " << newstates.
Str());
469 rcit = reverseCompositionMap.find(newstates);
470 if (rcit == reverseCompositionMap.end()) {
471 todo.push(newstates);
474 reverseCompositionMap[newstates] = tmpstate;
475 FD_DF(
"BuechiParallel: todo push: " << newstates.
Str() <<
" -> "
476 << reverseCompositionMap[newstates]);
479 tmpstate = rcit->second;
483 FD_DF(
"BuechiParallel: add transition to new generator: " <<
484 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit2->Ev, tmpstate)));
493 for(rcit=reverseCompositionMap.begin(); rcit!=reverseCompositionMap.end(); rcit++) {
494 Idx x1=rcit->first.q1;
495 Idx x2=rcit->first.q2;
496 bool m1requ=rcit->first.m1required;
497 bool mres=rcit->first.mresolved;
498 Idx x12=rcit->second;
504 std::string name12 = name1 +
"|" + name2 ;
505 if(m1requ) name12 +=
"|r1m";
506 else name12 +=
"|r2m";
507 if(mres) name12 +=
"*";
517 if(pResGen != &rResGen) {
518 pResGen->
Move(rResGen);
534 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
535 pResGen= rResGen.
New();
545 if(pResGen != &rResGen) {
546 pResGen->
Move(rResGen);
556 FD_DF(
"IsBuechiRelativelyMarked(\"" << rGenPlant.
Name() <<
"\", \"" << rGenCand.
Name() <<
"\")");
560 std::stringstream errstr;
561 errstr <<
"Alphabets of generators do not match.";
562 throw Exception(
"BuechiRelativelyMarked", errstr.str(), 100);
565 #ifdef FAUDES_CHECKED
568 std::stringstream errstr;
569 errstr <<
"Arguments are expected to be nonblocking.";
570 throw Exception(
"IsBuechiRelativelyMarked", errstr.str(), 201);
574 #ifdef FAUDES_CHECKED
577 std::stringstream errstr;
578 errstr <<
"Arguments are expected to be deterministic.";
579 throw Exception(
"IsBuechiRelativelyMarked", errstr.str(), 202);
585 std::map< std::pair<Idx,Idx> ,
Idx> revmap;
590 Product(rGenPlant,rGenCand,revmap,markPlant,markCand,product);
595 std::list<StateSet> umsccs;
600 std::list<StateSet>::iterator ssit=umsccs.begin();
601 for(;ssit!=umsccs.end(); ++ssit) {
602 FD_DF(
"IsBuechiRelativelyMarked(): GPlant-marked scc without GCand-mark: " << ssit->ToString());
606 return umsccs.size()==0;
617 FD_DF(
"IsBuechiRelativelyClosed(\"" << rGenPlant.
Name() <<
"\", \"" << rGenCand.
Name() <<
"\")");
621 std::stringstream errstr;
622 errstr <<
"Alphabets of generators do not match.";
623 throw Exception(
"BuechiRelativelyClosed", errstr.str(), 100);
626 #ifdef FAUDES_CHECKED
629 std::stringstream errstr;
630 errstr <<
"Argument \"" << rGenCand.
Name() <<
"\" is not omegatrim.";
631 throw Exception(
"IsBuechiRelativelyClosed", errstr.str(), 201);
634 std::stringstream errstr;
635 errstr <<
"Argument \"" << rGenPlant.
Name() <<
"\" is not omega-trim.";
636 throw Exception(
"IsBuechiRelativelyClosed", errstr.str(), 201);
643 if(rGenCand.
Empty()) {
644 FD_DF(
"IsBuechiRelativelyClosed(..): empty candidate: pass");
650 if(rGenPlant.
Empty()) {
651 FD_DF(
"IsBuechiRelativelyClosed(..): non-empty candidate. empty plant: fail");
655 #ifdef FAUDES_CHECKED
658 std::stringstream errstr;
659 errstr <<
"Arguments are expected to be deterministic.";
660 throw Exception(
"IsBuechiRelativelyClosed", errstr.str(), 202);
673 std::map< std::pair<Idx,Idx> ,
Idx> revmap;
683 std::stack< std::pair<Idx,Idx> > todo;
685 std::pair<Idx,Idx> currentstates, newstates;
689 StateSet::Iterator lit1, lit2;
691 std::map< std::pair<Idx,Idx>,
Idx>::iterator rcit;
693 bool inclusion12=
true;
696 FD_DF(
"IsBuechiRelativelyClosed(): Product composition A");
701 currentstates = std::make_pair(*lit1, *lit2);
702 todo.push(currentstates);
704 revmap[currentstates] = tmpstate;
705 FD_DF(
"IsBuechiRelativelyClosed(): Product composition A: (" << *lit1 <<
"|" << *lit2 <<
") -> "
706 << revmap[currentstates]);
711 while (! todo.empty() && inclusion12) {
715 currentstates = todo.top();
717 FD_DF(
"IsBuechiRelativelyClosed(): Product composition B: (" << currentstates.first <<
"|"
718 << currentstates.second <<
") -> " << revmap[currentstates]);
721 tit1_end = rGenCand.
TransRelEnd(currentstates.first);
723 tit2_end = rGenPlant.
TransRelEnd(currentstates.second);
725 bool resolved12=
true;
726 while((tit1 != tit1_end) && (tit2 != tit2_end)) {
728 if(tit1->Ev != curev1) {
729 if(!resolved12) inclusion12=
false;
734 if (tit1->Ev == tit2->Ev) {
736 newstates = std::make_pair(tit1->X2, tit2->X2);
738 rcit = revmap.find(newstates);
739 if (rcit == revmap.end()) {
740 todo.push(newstates);
742 revmap[newstates] = tmpstate;
743 FD_DF(
"IsBuechiRelativelyClosed(): Product composition C: (" << newstates.first <<
"|"
744 << newstates.second <<
") -> " << revmap[newstates]);
747 tmpstate = rcit->second;
749 product.
SetTransition(revmap[currentstates], tit1->Ev, tmpstate);
754 else if (tit1->Ev < tit2->Ev) {
758 else if (tit1->Ev > tit2->Ev) {
763 if(!resolved12) inclusion12=
false;
766 #ifdef FAUDES_DEBUG_FUNCTION
767 FD_DF(
"IsBuechiRelativelyClosed(): Product: done");
769 FD_DF(
"IsBuechiRelativelyClosed(): Product: inclusion L(GenCand) <= L(GenPlant) not satisfied");
774 if(!inclusion12)
return false;
777 std::map< std::pair<Idx,Idx>,
Idx>::iterator rit;
778 for(rit=revmap.begin(); rit!=revmap.end(); ++rit){
786 std::list<StateSet> umsccs12;
788 ComputeScc(product,umfilter12,umsccs12,umroots12);
791 std::list<StateSet>::iterator ssit=umsccs12.begin();
792 for(;ssit!=umsccs12.end(); ++ssit) {
793 FD_DF(
"IsBuechiRelativelyClosed(): G2-marked scc without G1-mark: " << ssit->ToString());
797 if(umsccs12.size()!=0)
return false;
802 std::list<StateSet> umsccs21;
804 ComputeScc(product,umfilter21,umsccs21,umroots21);
807 ssit=umsccs21.begin();
808 for(;ssit!=umsccs21.end(); ++ssit) {
809 FD_DF(
"IsBuechiRelativelyClosed(): G1-marked scc without G2-mark: " << ssit->ToString());
813 if(umsccs21.size()!=0)
return false;
816 FD_DF(
"IsBuechiRelativelyClosed(): pass");
824 FD_DF(
"BuechiLanguageInclusion(\"" << rGen1.
Name() <<
"\", \"" << rGen2.
Name() <<
"\")");
828 std::stringstream errstr;
829 errstr <<
"Alphabets of generators do not match.";
830 throw Exception(
"BuechiLanguageInclusion", errstr.str(), 100);
833 #ifdef FAUDES_CHECKED
836 std::stringstream errstr;
837 errstr <<
"Argument \"" << rGen1.
Name() <<
"\" is not omegatrim.";
838 throw Exception(
"BuechiLanguageInclusion", errstr.str(), 201);
841 std::stringstream errstr;
842 errstr <<
"Argument \"" << rGen2.
Name() <<
"\" is not omega-trim.";
843 throw Exception(
"BuechiLanguageInclusion", errstr.str(), 201);
850 FD_DF(
"BuechiLanguageInclusion(..): empty candidate: pass");
857 FD_DF(
"BuechiLanguageInclusion(..): non-empty candidate. empty plant: fail");
861 #ifdef FAUDES_CHECKED
864 std::stringstream errstr;
865 errstr <<
"Arguments are expected to be deterministic.";
866 throw Exception(
"BuechiLanguageInclusion", errstr.str(), 202);
871 std::map< std::pair<Idx,Idx> ,
Idx> revmap;
881 std::stack< std::pair<Idx,Idx> > todo;
883 std::pair<Idx,Idx> currentstates, newstates;
887 StateSet::Iterator lit1, lit2;
889 std::map< std::pair<Idx,Idx>,
Idx>::iterator rcit;
891 bool inclusion12=
true;
894 FD_DF(
"BuechiLanguageInclusion(): Product composition A");
899 currentstates = std::make_pair(*lit1, *lit2);
900 todo.push(currentstates);
902 revmap[currentstates] = tmpstate;
903 FD_DF(
"BuechiLanguageInclusion(): Product composition A: (" << *lit1 <<
"|" << *lit2 <<
") -> "
904 << revmap[currentstates]);
909 while (! todo.empty() && inclusion12) {
913 currentstates = todo.top();
915 FD_DF(
"BuechiLanguageInclusion(): Product composition B: (" << currentstates.first <<
"|"
916 << currentstates.second <<
") -> " << revmap[currentstates]);
921 tit2_end = rGen2.
TransRelEnd(currentstates.second);
923 bool resolved12=
true;
924 while((tit1 != tit1_end) && (tit2 != tit2_end)) {
926 if(tit1->Ev != curev1) {
927 if(!resolved12) inclusion12=
false;
932 if (tit1->Ev == tit2->Ev) {
934 newstates = std::make_pair(tit1->X2, tit2->X2);
936 rcit = revmap.find(newstates);
937 if (rcit == revmap.end()) {
938 todo.push(newstates);
940 revmap[newstates] = tmpstate;
941 FD_DF(
"BuechiLanguageInclusion(): Product composition C: (" << newstates.first <<
"|"
942 << newstates.second <<
") -> " << revmap[newstates]);
945 tmpstate = rcit->second;
947 product.
SetTransition(revmap[currentstates], tit1->Ev, tmpstate);
952 else if (tit1->Ev < tit2->Ev) {
956 else if (tit1->Ev > tit2->Ev) {
961 if(!resolved12) inclusion12=
false;
964 #ifdef FAUDES_DEBUG_FUNCTION
965 FD_DF(
"BuechiLanguageInclusion(): Product: done");
967 FD_DF(
"BuechiLanguageInclusion(): Product: inclusion L(Gen1) <= L(Gen2) not satisfied");
972 if(!inclusion12)
return false;
975 std::map< std::pair<Idx,Idx>,
Idx>::iterator rit;
976 for(rit=revmap.begin(); rit!=revmap.end(); ++rit){
984 std::list<StateSet> umsccs21;
986 ComputeScc(product,umfilter21,umsccs21,umroots21);
989 std::list<StateSet>::iterator ssit=umsccs21.begin();
990 for(;ssit!=umsccs21.end(); ++ssit) {
991 FD_DF(
"BuechiLanguageInclusion(): G1-marked scc without G2-mark: " << ssit->ToString());
995 if(umsccs21.size()!=0)
return false;
998 FD_DF(
"BuechiLanguageInclusion(): pass");
1006 FD_DF(
"BuechiLanguageEquality(\"" << rGen1.
Name() <<
"\", \"" << rGen2.
Name() <<
"\")");
1010 std::stringstream errstr;
1011 errstr <<
"Alphabets of generators do not match.";
1012 throw Exception(
"BuechiLanguageEquality", errstr.str(), 100);
1015 #ifdef FAUDES_CHECKED
1018 std::stringstream errstr;
1019 errstr <<
"Argument \"" << rGen1.
Name() <<
"\" is not omegatrim.";
1020 throw Exception(
"BuechiLanguageEquality", errstr.str(), 201);
1023 std::stringstream errstr;
1024 errstr <<
"Argument \"" << rGen2.
Name() <<
"\" is not omega-trim.";
1025 throw Exception(
"BuechiLanguageEquality", errstr.str(), 201);
1032 bool empty1=rGen1.
Empty();
1033 bool empty2=rGen2.
Empty();
1034 if( empty1 && empty2) {
1035 FD_DF(
"BuechiLanguageEquality(..): empty candidates: pass");
1038 if( empty1 != empty2) {
1039 FD_DF(
"BuechiLanguageEquality(..): empty/non-empty candidates: fail");
1043 #ifdef FAUDES_CHECKED
1046 std::stringstream errstr;
1047 errstr <<
"Arguments are expected to be deterministic.";
1048 throw Exception(
"BuechiLanguageEquality", errstr.str(), 202);
1053 std::map< std::pair<Idx,Idx> ,
Idx> revmap;
1063 std::stack< std::pair<Idx,Idx> > todo;
1065 std::pair<Idx,Idx> currentstates, newstates;
1069 StateSet::Iterator lit1, lit2;
1071 std::map< std::pair<Idx,Idx>,
Idx>::iterator rcit;
1076 FD_DF(
"BuechiLanguageEquality(): Product composition A");
1081 currentstates = std::make_pair(*lit1, *lit2);
1082 todo.push(currentstates);
1084 revmap[currentstates] = tmpstate;
1085 FD_DF(
"BuechiLanguageEquality(): Product composition A: (" << *lit1 <<
"|" << *lit2 <<
") -> "
1086 << revmap[currentstates]);
1091 while (! todo.empty() && equal12) {
1095 currentstates = todo.top();
1097 FD_DF(
"BuechiLanguageEquality(): Product composition B: (" << currentstates.first <<
"|"
1098 << currentstates.second <<
") -> " << revmap[currentstates]);
1101 tit1_end = rGen1.
TransRelEnd(currentstates.first);
1103 tit2_end = rGen2.
TransRelEnd(currentstates.second);
1104 while((tit1 != tit1_end) && (tit2 != tit2_end)) {
1106 if (tit1->Ev != tit2->Ev) {
1111 newstates = std::make_pair(tit1->X2, tit2->X2);
1113 rcit = revmap.find(newstates);
1114 if (rcit == revmap.end()) {
1115 todo.push(newstates);
1117 revmap[newstates] = tmpstate;
1118 FD_DF(
"BuechiLanguageEquality(): Product composition C: (" << newstates.first <<
"|"
1119 << newstates.second <<
") -> " << revmap[newstates]);
1121 tmpstate = rcit->second;
1123 product.
SetTransition(revmap[currentstates], tit1->Ev, tmpstate);
1129 #ifdef FAUDES_DEBUG_FUNCTION
1130 FD_DF(
"BuechiLanguageEquality(): Product: done");
1132 FD_DF(
"BuechiLanguageEquality(): Product: inclusion L(Gen1) == L(Gen2) not satisfied");
1137 if(!equal12)
return false;
1140 std::map< std::pair<Idx,Idx>,
Idx>::iterator rit;
1141 for(rit=revmap.begin(); rit!=revmap.end(); ++rit){
1149 std::list<StateSet> umsccs12;
1151 ComputeScc(product,umfilter12,umsccs12,umroots12);
1154 std::list<StateSet>::iterator ssit=umsccs12.begin();
1155 for(;ssit!=umsccs12.end(); ++ssit) {
1156 FD_DF(
"BuechiLanguageEquality(): G1-marked scc without G2-mark: " << ssit->ToString());
1160 if(umsccs12.size()!=0)
return false;
1165 std::list<StateSet> umsccs21;
1167 ComputeScc(product,umfilter21,umsccs21,umroots21);
1170 ssit=umsccs21.begin();
1171 for(;ssit!=umsccs21.end(); ++ssit) {
1172 FD_DF(
"BuechiLanguageEquality(): G2-marked scc without G1-mark: " << ssit->ToString());
1176 if(umsccs21.size()!=0)
return false;
1179 FD_DF(
"BuechiLanguageEquality(): pass");
const std::string & Name(void) const
bool Exists(const Idx &rIndex) const
virtual std::string Str(const Idx &rIndex) const
bool operator<(const OPState &other) const
OPState(const Idx &rq1, const Idx &rq2, const bool &rf)
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
std::string ToString(const std::string &rLabel="", const Type *pContext=0) 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)
std::string MarkedStatesToString(void) const
const StateSet & InitStates(void) const
TransSet::Iterator TransRelBegin(void) const
bool IsAccessible(void) const
void InsEvents(const EventSet &events)
bool IsComplete(void) const
virtual vGenerator * New(void) const
void InjectMarkedStates(const StateSet &rNewMarkedStates)
StateSet AccessibleSet(void) const
bool ExistsState(Idx index) const
bool IsCoaccessible(void) const
std::string TStr(const Transition &rTrans) const
std::string StateName(Idx index) const
TransSet::Iterator TransRelEnd(void) const
StateSet TerminalStates(void) const
void SetMarkedState(Idx index)
virtual void EventAttributes(const EventSet &rEventSet)
bool StateNamesEnabled(void) const
StateSet::Iterator InitStatesEnd(void) const
StateSet CoaccessibleSet(void) 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 InsertSet(const TBaseSet &rOtherSet)
bool EqualAttributes(const TBaseSet &rOtherSet) const
Iterator Begin(void) const
virtual void EraseSet(const TBaseSet &rOtherSet)
bool ComputeScc(const Generator &rGen, const SccFilter &rFilter, std::list< StateSet > &rSccList, StateSet &rRoots)
void Product(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
bool IsDeterministic(const vGenerator &rGen)
void aBuechiProduct(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void BuechiProduct(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void BuechiParallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void aBuechiParallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
bool BuechiTrim(vGenerator &rGen)
void BuechiClosure(Generator &rGen)
bool IsBuechiClosed(const Generator &rGen)
void LoopCallback(bool pBreak(void))
bool BuechiLanguageInclusion(const Generator &rGen1, const Generator &rGen2)
bool BuechiLanguageEquality(const Generator &rGen1, const Generator &rGen2)
bool IsBuechiTrim(const vGenerator &rGen)
bool IsBuechiRelativelyClosed(const Generator &rGenPlant, const Generator &rGenCand)
std::string ToStringInteger(Int number)
bool IsBuechiRelativelyMarked(const Generator &rGenPlant, const Generator &rGenCand)
std::string CollapsString(const std::string &rString, unsigned int len)
bool IsBuechiRelativelyClosedUnchecked(const Generator &rGenPlant, const Generator &rGenCand)