48 if (
q1 < other.
q1)
return(
true);
49 if (
q1 > other.
q1)
return(
false);
50 if (
q2 < other.
q2)
return(
true);
51 if (
q2 > other.
q2)
return(
false);
78 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
79 pResGen= rResGen.
New();
92 if(pResGen != &rResGen) {
93 pResGen->
Move(rResGen);
106 FD_DF(
"OmegaProduct(" << &rGen1 <<
"," << &rGen2 <<
")");
110 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
111 pResGen= rResGen.
New();
121 std::map< OPState, Idx> reverseCompositionMap;
123 std::stack< OPState > todo;
125 OPState currentstates, newstates;
128 StateSet::Iterator lit1, lit2;
130 std::map< OPState, Idx>::iterator rcit;
132 FD_DF(
"OmegaProduct: adding all combinations of initial states to todo:");
135 currentstates =
OPState(*lit1, *lit2,
true);
136 todo.push(currentstates);
137 reverseCompositionMap[currentstates] = pResGen->
InsInitState();
138 FD_DF(
"OmegaProduct: " << currentstates.
Str() <<
" -> " << reverseCompositionMap[currentstates]);
143 FD_DF(
"OmegaProduct: processing reachable states:");
144 while (! todo.empty()) {
148 currentstates = todo.top();
150 FD_DF(
"OmegaProduct: processing (" << currentstates.
Str() <<
" -> " << reverseCompositionMap[currentstates]);
154 for(; tit1 != tit1_end; ++tit1) {
157 tit2_end = rGen2.
TransRelEnd(currentstates.q2, tit1->Ev);
158 for (; tit2 != tit2_end; ++tit2) {
159 newstates =
OPState(tit1->X2, tit2->X2,currentstates.m1required);
161 if(currentstates.m1required) {
169 rcit = reverseCompositionMap.find(newstates);
170 if(rcit == reverseCompositionMap.end()) {
171 todo.push(newstates);
176 reverseCompositionMap[newstates] = tmpstate;
177 FD_DF(
"OmegaProduct: todo push: (" << newstates.
Str() <<
") -> " << reverseCompositionMap[newstates]);
180 tmpstate = rcit->second;
184 FD_DF(
"OmegaProduct: add transition to new generator: " <<
185 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit1->Ev, tmpstate)));
195 for(rcit=reverseCompositionMap.begin(); rcit!=reverseCompositionMap.end(); rcit++) {
196 Idx x1=rcit->first.q1;
197 Idx x2=rcit->first.q2;
198 bool m1requ=rcit->first.m1required;
199 Idx x12=rcit->second;
205 std::string name12 = name1 +
"|" + name2;
206 if(m1requ) name12 +=
"|r1m";
207 else name12 +=
"|r2m";
217 if(pResGen != &rResGen) {
218 pResGen->
Move(rResGen);
237 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
238 pResGen= rResGen.
New();
251 if(pResGen != &rResGen) {
252 pResGen->
Move(rResGen);
265 FD_DF(
"OmegaParallel(" << &rGen1 <<
"," << &rGen2 <<
")");
268 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
269 pResGen= rResGen.
New();
280 FD_DF(
"OmegaParallel: shared events: " << sharedalphabet.
ToString());
283 std::map< OPState, Idx> reverseCompositionMap;
285 std::stack< OPState > todo;
287 OPState currentstates, newstates;
290 StateSet::Iterator lit1, lit2;
292 std::map< OPState, Idx>::iterator rcit;
294 FD_DF(
"OmegaParallel: adding all combinations of initial states to todo:");
297 currentstates =
OPState(*lit1, *lit2,
true);
303 todo.push(currentstates);
304 reverseCompositionMap[currentstates] = tmpstate;
305 FD_DF(
"OmegaParallel: " << currentstates.
Str() <<
" -> " << tmpstate);
310 FD_DF(
"OmegaParallel: processing reachable states:");
311 while (! todo.empty()) {
315 currentstates = todo.top();
317 FD_DF(
"OmegaParallel: processing (" << currentstates.
Str() <<
" -> "
318 << reverseCompositionMap[currentstates]);
323 for(; tit1 != tit1_end; ++tit1) {
325 if(! sharedalphabet.
Exists(tit1->Ev)) {
326 FD_DF(
"OmegaParallel: exists only in rGen1");
327 newstates =
OPState(tit1->X2, currentstates.q2, currentstates.m1required);
330 if(currentstates.m1required) {
337 rcit = reverseCompositionMap.find(newstates);
338 if (rcit == reverseCompositionMap.end()) {
339 todo.push(newstates);
342 reverseCompositionMap[newstates] = tmpstate;
343 FD_DF(
"OmegaParallel: todo push: " << newstates.
Str() <<
"|"
344 << reverseCompositionMap[newstates]);
347 tmpstate = rcit->second;
350 pResGen->
SetTransition(reverseCompositionMap[currentstates], tit1->Ev,
352 FD_DF(
"OmegaParallel: add transition to new generator: " <<
353 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit1->Ev, tmpstate)));
357 FD_DF(
"OmegaParallel: common event");
360 tit2_end = rGen2.
TransRelEnd(currentstates.q2, tit1->Ev);
361 for (; tit2 != tit2_end; ++tit2) {
362 newstates =
OPState(tit1->X2,tit2->X2,currentstates.m1required);
365 if(currentstates.m1required) {
377 rcit = reverseCompositionMap.find(newstates);
378 if (rcit == reverseCompositionMap.end()) {
379 todo.push(newstates);
382 reverseCompositionMap[newstates] = tmpstate;
383 FD_DF(
"OmegaParallel: todo push: (" << newstates.
Str() <<
") -> "
384 << reverseCompositionMap[newstates]);
387 tmpstate = rcit->second;
391 FD_DF(
"OmegaParallel: add transition to new generator: " <<
392 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit1->Ev, tmpstate)));
400 for (; tit2 != tit2_end; ++tit2) {
401 if (! sharedalphabet.
Exists(tit2->Ev)) {
402 FD_DF(
"OmegaParallel: exists only in rGen2: " << sharedalphabet.
Str(tit2->Ev));
403 newstates =
OPState(currentstates.q1, tit2->X2, currentstates.m1required);
406 if(!currentstates.m1required) {
412 FD_DF(
"OmegaParallel: set trans: " << currentstates.Str() <<
" " << newstates.
Str());
414 rcit = reverseCompositionMap.find(newstates);
415 if (rcit == reverseCompositionMap.end()) {
416 todo.push(newstates);
419 reverseCompositionMap[newstates] = tmpstate;
420 FD_DF(
"OmegaParallel: todo push: " << newstates.
Str() <<
" -> "
421 << reverseCompositionMap[newstates]);
424 tmpstate = rcit->second;
428 FD_DF(
"OmegaParallel: add transition to new generator: " <<
429 pResGen->
TStr(
Transition(reverseCompositionMap[currentstates], tit2->Ev, tmpstate)));
438 for(rcit=reverseCompositionMap.begin(); rcit!=reverseCompositionMap.end(); rcit++) {
439 Idx x1=rcit->first.q1;
440 Idx x2=rcit->first.q2;
441 bool m1requ=rcit->first.m1required;
442 bool mres=rcit->first.mresolved;
443 Idx x12=rcit->second;
449 std::string name12 = name1 +
"|" + name2 ;
450 if(m1requ) name12 +=
"|r1m";
451 else name12 +=
"|r2m";
452 if(mres) name12 +=
"*";
462 if(pResGen != &rResGen) {
463 pResGen->
Move(rResGen);
471 FD_DF(
"OmegaClosure("<< rGen.
Name() <<
")");
490 FD_DF(
"IsOmegaClosed("<< rGen.
Name() <<
")");
504 StateSet::Iterator sit_end = rGen.
States().
End();
506 for(; sit!=sit_end; ++sit) {
507 if(irrelevant.
Exists(*sit))
continue;
510 for (; tit != tit_end; ++tit) {
511 if(!irrelevant.
Exists(tit->X2))
break;
524 #ifdef FAUDES_DEBUG_FUNCTION
525 FD_DF(
"IsOmegaClosed(..): irrelevant states "<< irrelevant.
ToString());
531 std::list<StateSet> umsccs;
536 #ifdef FAUDES_DEBUG_FUNCTION
537 std::list<StateSet>::iterator ssit=umsccs.begin();
538 for(;ssit!=umsccs.end(); ++ssit) {
539 FD_DF(
"IsOmegaClosed(): GPlant-marked scc without GCand-mark: " << ssit->ToString());
544 return umsccs.empty();
bool Exists(const Idx &rIndex) const
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
TransSet::Iterator TransRelBegin(void) const
void InsEvents(const EventSet &events)
virtual vGenerator * New(void) const
void InjectMarkedStates(const StateSet &rNewMarkedStates)
StateSet AccessibleSet(void) const
bool ExistsState(Idx index) const
std::string TStr(const Transition &rTrans) const
std::string StateName(Idx index) const
void Name(const std::string &rName)
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
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)
void aOmegaProduct(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
bool ComputeScc(const Generator &rGen, const SccFilter &rFilter, std::list< StateSet > &rSccList, StateSet &rRoots)
bool IsOmegaClosed(const Generator &rGen)
void OmegaParallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void OmegaClosure(Generator &rGen)
void OmegaProduct(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void aOmegaParallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void LoopCallback(bool pBreak(void))
std::string ToStringInteger(Int number)
std::string CollapsString(const std::string &rString, unsigned int len)