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) {
158 for (; tit2 != tit2_end; ++tit2) {
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");
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");
361 for (; tit2 != tit2_end; ++tit2) {
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));
408 newstates.m1required=
true;
409 newstates.mresolved=
true;
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;
514 irrelevant.Insert(*sit);
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();