35 std::map< std::pair<Idx,Idx>,
Idx> cmap;
38 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
39 pResGen= rResGen.
New();
42 Parallel(rGen1, rGen2, cmap, *pResGen);
44 if(pResGen != &rResGen) {
45 pResGen->
Move(rResGen);
57 std::map< std::pair<Idx,Idx>,
Idx> cmap;
62 if(rGenVec.
Size()==0) {
66 rResGen=rGenVec.
At(0);
71 FD_DF(
"Parallel() cnt " << i <<
" states " << rResGen.
Size());
85 if(rGenVec.
Size()==0) {
89 rResGen=rGenVec.
At(0);
94 FD_DF(
"ParallelLive() cnt " << i <<
" certconf trans #" << rResGen.
TransRel().
Size());
96 FD_DF(
"ParallelLive() cnt " << i <<
" parallel trans #" << rResGen.
TransRel().
Size());
106 FD_DF(
"aParallel(...)");
113 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
114 pResGen= rResGen.
New();
127 if(pResGen != &rResGen) {
128 pResGen->
Move(rResGen);
132 FD_DF(
"aParallel(...): done");
150 if(rGenVec.
Size()==0) {
155 if(rGenVec.
Size()==1) {
156 rResGen=rGenVec.
At(0);
187 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
188 pResGen= rResGen.
New();
201 if(pResGen != &rResGen) {
202 pResGen->
Move(rResGen);
229 Parallel(rGen1,rGen2,rCompositionMap,rResGen);
252 StateSet::Iterator sit;
265 std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
269 FD_DF(
"Parallel(" << &rGen1 <<
"," << &rGen2 <<
")");
301 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
302 pResGen= rResGen.
New();
306 rCompositionMap.clear();
309 EventSet::Iterator eit;
316 FD_DF(
"Parallel: inserted indices in rResGen.alphabet( "
328 FD_DF(
"Parallel: shared events: " << sharedalphabet.
ToString());
331 std::stack< std::pair<Idx,Idx> > todo;
333 std::pair<Idx,Idx> currentstates, newstates;
336 StateSet::Iterator lit1,lit2;
338 std::map< std::pair<Idx,Idx>,
Idx>::iterator rcit;
341 FD_DF(
"Parallel: adding all combinations of initial states to todo:");
344 newstates = std::make_pair(*lit1, *lit2);
346 rCompositionMap[newstates] = tmpstate;
347 FD_DF(
"Parallel: (" << *lit1 <<
"|" << *lit2 <<
") -> "
348 << rCompositionMap[newstates]);
350 if(!gen1live.
Exists(newstates.first))
continue;
351 if(!gen2live.
Exists(newstates.second))
continue;
353 todo.push(newstates);
354 FD_DF(
"Parallel: todo push: (" << newstates.first <<
"|"
355 << newstates.second <<
") -> "
356 << rCompositionMap[newstates]);
361 FD_DF(
"Parallel: processing reachable states:");
362 while (! todo.empty()) {
366 FD_WPC(rCompositionMap.size(),rCompositionMap.size()+todo.size(),
"Parallel(): processing");
368 currentstates = todo.top();
370 FD_DF(
"Parallel: processing (" << currentstates.first <<
"|"
371 << currentstates.second <<
") -> "
372 << rCompositionMap[currentstates]);
377 for(; tit1 != tit1_end; ++tit1) {
379 if(! sharedalphabet.
Exists(tit1->Ev)) {
380 FD_DF(
"Parallel: exists only in rGen1");
381 newstates = std::make_pair(tit1->X2, currentstates.second);
383 rcit = rCompositionMap.find(newstates);
384 if(rcit == rCompositionMap.end()) {
386 rCompositionMap[newstates] = tmpstate;
389 dopush= gen1live.
Exists(newstates.first) && gen2live.
Exists(newstates.second);
392 todo.push(newstates);
393 FD_DF(
"Parallel: todo push: (" << newstates.first <<
"|"
394 << newstates.second <<
") -> "
395 << rCompositionMap[newstates]);
398 tmpstate = rcit->second;
400 pResGen->
SetTransition(rCompositionMap[currentstates], tit1->Ev, tmpstate);
401 FD_DF(
"Parallel: add transition to new generator: "
402 << rCompositionMap[currentstates] <<
"-" << tit1->Ev <<
"-"
407 FD_DF(
"Parallel: common event");
410 tit2_end = rGen2.
TransRelEnd(currentstates.second, tit1->Ev);
411 for (; tit2 != tit2_end; ++tit2) {
412 newstates = std::make_pair(tit1->X2, tit2->X2);
414 rcit = rCompositionMap.find(newstates);
415 if (rcit == rCompositionMap.end()) {
417 rCompositionMap[newstates] = tmpstate;
420 dopush= gen1live.
Exists(newstates.first) && gen2live.
Exists(newstates.second);
423 todo.push(newstates);
424 FD_DF(
"Parallel: todo push: (" << newstates.first <<
"|"
425 << newstates.second <<
") -> "
426 << rCompositionMap[newstates]);
429 tmpstate = rcit->second;
433 FD_DF(
"Parallel: add transition to new generator: "
434 << rCompositionMap[currentstates] <<
"-"
435 << tit1->Ev <<
"-" << tmpstate);
442 tit2_end = rGen2.
TransRelEnd(currentstates.second);
443 for (; tit2 != tit2_end; ++tit2) {
444 if (! sharedalphabet.
Exists(tit2->Ev)) {
445 FD_DF(
"Parallel: exists only in rGen2");
446 newstates = std::make_pair(currentstates.first, tit2->X2);
448 rcit = rCompositionMap.find(newstates);
449 if(rcit == rCompositionMap.end()) {
451 rCompositionMap[newstates] = tmpstate;
454 dopush= gen1live.
Exists(newstates.first) && gen2live.
Exists(newstates.second);
457 todo.push(newstates);
458 FD_DF(
"Parallel: todo push: (" << newstates.first <<
"|"
459 << newstates.second <<
") -> "
460 << rCompositionMap[newstates]);
463 tmpstate = rcit->second;
467 FD_DF(
"Parallel: add transition to new generator: "
468 << rCompositionMap[currentstates] <<
"-"
469 << tit2->Ev <<
"-" << tmpstate);
475 rcit=rCompositionMap.begin();
476 while(rcit!=rCompositionMap.end()) {
485 if(pResGen != &rResGen) {
499 std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
502 FD_DF(
"ParallelLive(" << &rGen1 <<
"," << &rGen2 <<
")");
503 Parallel(rGen1,rGen2,rCompositionMap,rResGen,
true);
511 FD_DF(
"ParallelLive(" << &rGen1 <<
"," << &rGen2 <<
")");
512 std::map< std::pair<Idx,Idx>,
Idx> cmap;
513 Parallel(rGen1,rGen2,cmap,rResGen,
true);
518 std::map< std::pair<Idx,Idx>,
Idx> cmap;
520 Product(rGen1, rGen2, cmap, rResGen);
536 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
537 pResGen= rResGen.
New();
550 if(pResGen != &rResGen) {
551 pResGen->
Move(rResGen);
570 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
571 pResGen= rResGen.
New();
584 if(pResGen != &rResGen) {
585 pResGen->
Move(rResGen);
594 std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
601 Product(rGen1,rGen2,rCompositionMap,rResGen);
608 std::map< std::pair<Idx,Idx>,
Idx>::iterator rit;
609 for(rit=rCompositionMap.begin(); rit!=rCompositionMap.end(); ++rit){
619 std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
622 FD_DF(
"Product(" << rGen1.
Name() <<
"," << rGen2.
Name() <<
")");
623 FD_DF(
"Product(): state counts " << rGen1.
Size() <<
"/" << rGen2.
Size());
627 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
628 pResGen= rResGen.
New();
631 rCompositionMap.clear();
635 FD_DF(
"Product: shared alphabet: "
639 std::stack< std::pair<Idx,Idx> > todo;
641 std::pair<Idx,Idx> currentstates, newstates;
645 StateSet::Iterator lit1, lit2;
647 std::map< std::pair<Idx,Idx>,
Idx>::iterator rcit;
650 FD_DF(
"Product: adding all combinations of initial states to todo:");
655 currentstates = std::make_pair(*lit1, *lit2);
656 todo.push(currentstates);
657 rCompositionMap[currentstates] = pResGen->
InsInitState();
658 FD_DF(
"Product: (" << *lit1 <<
"|" << *lit2 <<
") -> "
659 << rCompositionMap[currentstates]);
664 FD_DF(
"Product: processing reachable states:");
665 while (! todo.empty()) {
669 FD_WPC(rCompositionMap.size(),rCompositionMap.size()+todo.size(),
"Product(): processing");
671 currentstates = todo.top();
673 FD_DF(
"Product: processing (" << currentstates.first <<
"|"
674 << currentstates.second <<
") -> " << rCompositionMap[currentstates]);
679 tit2_end = rGen2.
TransRelEnd(currentstates.second);
680 while((tit1 != tit1_end) && (tit2 != tit2_end)) {
682 if(tit1->Ev < tit2->Ev) {
687 if(tit1->Ev > tit2->Ev) {
693 while(tit2 != tit2_end) {
695 if(tit1->Ev != tit2->Ev)
break;
697 newstates = std::make_pair(tit1->X2, tit2->X2);
699 rcit = rCompositionMap.find(newstates);
700 if(rcit == rCompositionMap.end()) {
701 todo.push(newstates);
703 rCompositionMap[newstates] = tmpstate;
705 FD_DF(
"Product: todo push: (" << newstates.first <<
"|"
706 << newstates.second <<
") -> " << rCompositionMap[newstates] <<
" todo #" << todo.size());
708 tmpstate = rcit->second;
711 pResGen->
SetTransition(rCompositionMap[currentstates], tit1->Ev, tmpstate);
712 FD_DF(
"Product: add transition to new generator: "
713 << rCompositionMap[currentstates] <<
"-" << tit1->Ev <<
"-" << tmpstate);
720 if(tit1->Ev == tit2_begin->Ev)
727 rcit=rCompositionMap.begin();
728 while(rcit!=rCompositionMap.end()) {
737 if(pResGen != &rResGen) {
747 FD_DF(
"Product(...): done");
755 const std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
758 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
759 for(rcit=rCompositionMap.begin(); rcit!=rCompositionMap.end(); rcit++) {
760 Idx x1=rcit->first.first;
761 Idx x2=rcit->first.second;
762 Idx x12=rcit->second;
768 std::string name12= name1 +
"|" + name2;
777 const std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
778 std::map<Idx,Idx>& rCompositionMap1)
780 rCompositionMap1.clear();
781 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
782 for(rcit=rCompositionMap.begin(); rcit!=rCompositionMap.end(); rcit++)
783 rCompositionMap1.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.first));
789 const std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
790 std::map<Idx,Idx>& rCompositionMap2)
792 rCompositionMap2.clear();
793 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
794 for(rcit=rCompositionMap.begin(); rcit!=rCompositionMap.end(); rcit++)
795 rCompositionMap2.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.second));
860 std::pair<Idx,Idx> x12(x1,x2);
863 return x12it->second;
871 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
873 mArg1Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.first));
874 mArg2Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.second));
878 std::map< Idx , Idx >::const_iterator x1it=
mArg1Map.find(x1);
888 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
890 mArg1Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.first));
891 mArg2Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.second));
895 std::map< Idx , Idx >::const_iterator x2it=
mArg2Map.find(x2);
#define FD_WPC(cntnow, contdone, message)
#define FAUDES_TYPE_IMPLEMENTATION(ftype, ctype, cbase)
const std::string & Name(void) const
bool Exists(const Idx &rIndex) const
bool DoEqual(const ProductCompositionMap &rOther) const
virtual ~ProductCompositionMap(void)
Idx Arg1State(Idx s12) const
std::map< Idx, Idx > mArg2Map
std::map< Idx, Idx > mArg1Map
void DoAssign(const ProductCompositionMap &rSrc)
const std::map< std::pair< Idx, Idx >, Idx > & StlMap(void) const
ProductCompositionMap(void)
Idx CompState(Idx s1, Idx s2) const
Idx Arg2State(Idx s12) const
std::map< std::pair< Idx, Idx >, Idx > mCompositionMap
std::vector< int >::size_type Position
virtual const T & At(const Position &pos) const
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
std::string ToString(const std::string &rLabel="", const Type *pContext=0) const
StateSet::Iterator StatesBegin(void) const
StateSet::Iterator InitStatesBegin(void) const
const TransSet & TransRel(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
const EventSet & Alphabet(void) const
virtual void Move(vGenerator &rGen)
std::string MarkedStatesToString(void) const
TransSet::Iterator TransRelBegin(void) const
EventSet::Iterator AlphabetBegin(void) const
virtual vGenerator * New(void) const
void ClearStateNames(void)
bool ExistsState(Idx index) const
std::string StateName(Idx index) const
StateSet::Iterator StatesEnd(void) const
TransSet::Iterator TransRelEnd(void) const
void SetMarkedState(Idx index)
virtual void EventAttributes(const EventSet &rEventSet)
bool StateNamesEnabled(void) const
StateSet::Iterator InitStatesEnd(void) const
EventSet::Iterator AlphabetEnd(void) const
StateSet CoaccessibleSet(void) const
bool ExistsMarkedState(Idx index) const
std::string AlphabetToString(void) const
std::string UniqueStateName(const std::string &rName) const
void InjectAlphabet(const EventSet &rNewalphabet)
bool Exists(const T &rElem) const
bool EqualAttributes(const TBaseSet &rOtherSet) const
void Product(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void aParallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void aProduct(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void Parallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void SetComposedStateNames(const Generator &rGen1, const Generator &rGen2, const std::map< std::pair< Idx, Idx >, Idx > &rCompositionMap, Generator &rGen12)
void RemoveNonCoaccessibleOut(Generator &g)
void CompositionMap1(const std::map< std::pair< Idx, Idx >, Idx > &rCompositionMap, std::map< Idx, Idx > &rCompositionMap1)
void ParallelLive(const GeneratorVector &rGenVec, Generator &rResGen)
std::string ToStringInteger(Int number)
void CompositionMap2(const std::map< std::pair< Idx, Idx >, Idx > &rCompositionMap, std::map< Idx, Idx > &rCompositionMap2)
std::string CollapsString(const std::string &rString, unsigned int len)