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());
82 std::map< std::pair<Idx,Idx>,
Idx> cmap;
87 if(rGenVec.
Size()==0) {
91 rResGen=rGenVec.
At(0);
96 FD_DF(
"ParallelNB() cnt " << i <<
" certconf trans #" << rResGen.
TransRel().
Size());
98 FD_DF(
"ParallelNB() cnt " << i <<
" parallel trans #" << rResGen.
TransRel().
Size());
108 FD_DF(
"aParallel(...)");
115 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
116 pResGen= rResGen.
New();
129 if(pResGen != &rResGen) {
130 pResGen->
Move(rResGen);
134 FD_DF(
"aParallel(...): done");
152 if(rGenVec.
Size()==0) {
157 if(rGenVec.
Size()==1) {
158 rResGen=rGenVec.
At(0);
189 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
190 pResGen= rResGen.
New();
203 if(pResGen != &rResGen) {
204 pResGen->
Move(rResGen);
231 Parallel(rGen1,rGen2,rCompositionMap,rResGen);
254 StateSet::Iterator sit;
267 std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
270 FD_DF(
"Parallel(" << &rGen1 <<
"," << &rGen2 <<
")");
302 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
303 pResGen= rResGen.
New();
307 rCompositionMap.clear();
310 EventSet::Iterator eit;
317 FD_DF(
"Parallel: inserted indices in rResGen.alphabet( "
322 FD_DF(
"Parallel: shared events: " << sharedalphabet.
ToString());
325 std::stack< std::pair<Idx,Idx> > todo;
327 std::pair<Idx,Idx> currentstates, newstates;
330 StateSet::Iterator lit1,lit2;
332 std::map< std::pair<Idx,Idx>,
Idx>::iterator rcit;
335 FD_DF(
"Parallel: adding all combinations of initial states to todo:");
338 currentstates = std::make_pair(*lit1, *lit2);
339 todo.push(currentstates);
341 rCompositionMap[currentstates] = tmpstate;
342 FD_DF(
"Parallel: (" << *lit1 <<
"|" << *lit2 <<
") -> "
343 << rCompositionMap[currentstates]);
348 FD_DF(
"Parallel: processing reachable states:");
349 while (! todo.empty()) {
353 FD_WPC(rCompositionMap.size(),rCompositionMap.size()+todo.size(),
"Parallel(): processing");
355 currentstates = todo.top();
357 FD_DF(
"Parallel: processing (" << currentstates.first <<
"|"
358 << currentstates.second <<
") -> "
359 << rCompositionMap[currentstates]);
364 for (; tit1 != tit1_end; ++tit1) {
366 if (! sharedalphabet.
Exists(tit1->Ev)) {
367 FD_DF(
"Parallel: exists only in rGen1");
368 newstates = std::make_pair(tit1->X2, currentstates.second);
370 rcit = rCompositionMap.find(newstates);
371 if (rcit == rCompositionMap.end()) {
372 todo.push(newstates);
374 rCompositionMap[newstates] = tmpstate;
375 FD_DF(
"Parallel: todo push: (" << newstates.first <<
"|"
376 << newstates.second <<
") -> "
377 << rCompositionMap[newstates]);
380 tmpstate = rcit->second;
382 pResGen->
SetTransition(rCompositionMap[currentstates], tit1->Ev, tmpstate);
383 FD_DF(
"Parallel: add transition to new generator: "
384 << rCompositionMap[currentstates] <<
"-" << tit1->Ev <<
"-"
389 FD_DF(
"Parallel: common event");
392 tit2_end = rGen2.
TransRelEnd(currentstates.second, tit1->Ev);
393 for (; tit2 != tit2_end; ++tit2) {
394 newstates = std::make_pair(tit1->X2, tit2->X2);
396 rcit = rCompositionMap.find(newstates);
397 if (rcit == rCompositionMap.end()) {
398 todo.push(newstates);
400 rCompositionMap[newstates] = tmpstate;
401 FD_DF(
"Parallel: todo push: (" << newstates.first <<
"|"
402 << newstates.second <<
") -> "
403 << rCompositionMap[newstates]);
406 tmpstate = rcit->second;
410 FD_DF(
"Parallel: add transition to new generator: "
411 << rCompositionMap[currentstates] <<
"-"
412 << tit1->Ev <<
"-" << tmpstate);
419 tit2_end = rGen2.
TransRelEnd(currentstates.second);
420 for (; tit2 != tit2_end; ++tit2) {
421 if (! sharedalphabet.
Exists(tit2->Ev)) {
422 FD_DF(
"Parallel: exists only in rGen2");
423 newstates = std::make_pair(currentstates.first, tit2->X2);
425 rcit = rCompositionMap.find(newstates);
426 if (rcit == rCompositionMap.end()) {
427 todo.push(newstates);
429 rCompositionMap[newstates] = tmpstate;
430 FD_DF(
"Parallel: todo push: (" << newstates.first <<
"|"
431 << newstates.second <<
") -> "
432 << rCompositionMap[newstates]);
435 tmpstate = rcit->second;
439 FD_DF(
"Parallel: add transition to new generator: "
440 << rCompositionMap[currentstates] <<
"-"
441 << tit2->Ev <<
"-" << tmpstate);
447 rcit=rCompositionMap.begin();
448 while(rcit!=rCompositionMap.end()) {
457 if(pResGen != &rResGen) {
471 std::map< std::pair<Idx,Idx>,
Idx> cmap;
473 Product(rGen1, rGen2, cmap, rResGen);
489 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
490 pResGen= rResGen.
New();
503 if(pResGen != &rResGen) {
504 pResGen->
Move(rResGen);
523 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
524 pResGen= rResGen.
New();
537 if(pResGen != &rResGen) {
538 pResGen->
Move(rResGen);
547 std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
554 Product(rGen1,rGen2,rCompositionMap,rResGen);
561 std::map< std::pair<Idx,Idx>,
Idx>::iterator rit;
562 for(rit=rCompositionMap.begin(); rit!=rCompositionMap.end(); ++rit){
572 std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
575 FD_DF(
"Product(" << rGen1.
Name() <<
"," << rGen2.
Name() <<
")");
576 FD_DF(
"Product(): state counts " << rGen1.
Size() <<
"/" << rGen2.
Size());
580 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
581 pResGen= rResGen.
New();
584 rCompositionMap.clear();
588 FD_DF(
"Product: shared alphabet: "
592 std::stack< std::pair<Idx,Idx> > todo;
594 std::pair<Idx,Idx> currentstates, newstates;
598 StateSet::Iterator lit1, lit2;
600 std::map< std::pair<Idx,Idx>,
Idx>::iterator rcit;
603 FD_DF(
"Product: adding all combinations of initial states to todo:");
608 currentstates = std::make_pair(*lit1, *lit2);
609 todo.push(currentstates);
610 rCompositionMap[currentstates] = pResGen->
InsInitState();
611 FD_DF(
"Product: (" << *lit1 <<
"|" << *lit2 <<
") -> "
612 << rCompositionMap[currentstates]);
617 FD_DF(
"Product: processing reachable states:");
618 while (! todo.empty()) {
622 FD_WPC(rCompositionMap.size(),rCompositionMap.size()+todo.size(),
"Product(): processing");
624 currentstates = todo.top();
626 FD_DF(
"Product: processing (" << currentstates.first <<
"|"
627 << currentstates.second <<
") -> " << rCompositionMap[currentstates]);
632 tit2_end = rGen2.
TransRelEnd(currentstates.second);
633 while((tit1 != tit1_end) && (tit2 != tit2_end)) {
635 if(tit1->Ev < tit2->Ev) {
640 if(tit1->Ev > tit2->Ev) {
646 while(tit2 != tit2_end) {
648 if(tit1->Ev != tit2->Ev)
break;
650 newstates = std::make_pair(tit1->X2, tit2->X2);
652 rcit = rCompositionMap.find(newstates);
653 if(rcit == rCompositionMap.end()) {
654 todo.push(newstates);
656 rCompositionMap[newstates] = tmpstate;
658 FD_DF(
"Product: todo push: (" << newstates.first <<
"|"
659 << newstates.second <<
") -> " << rCompositionMap[newstates] <<
" todo #" << todo.size());
661 tmpstate = rcit->second;
664 pResGen->
SetTransition(rCompositionMap[currentstates], tit1->Ev, tmpstate);
665 FD_DF(
"Product: add transition to new generator: "
666 << rCompositionMap[currentstates] <<
"-" << tit1->Ev <<
"-" << tmpstate);
673 if(tit1->Ev == tit2_begin->Ev)
680 rcit=rCompositionMap.begin();
681 while(rcit!=rCompositionMap.end()) {
690 if(pResGen != &rResGen) {
700 FD_DF(
"Product(...): done");
708 const std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
711 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
712 for(rcit=rCompositionMap.begin(); rcit!=rCompositionMap.end(); rcit++) {
713 Idx x1=rcit->first.first;
714 Idx x2=rcit->first.second;
715 Idx x12=rcit->second;
721 std::string name12= name1 +
"|" + name2;
730 const std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
731 std::map<Idx,Idx>& rCompositionMap1)
733 rCompositionMap1.clear();
734 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
735 for(rcit=rCompositionMap.begin(); rcit!=rCompositionMap.end(); rcit++)
736 rCompositionMap1.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.first));
742 const std::map< std::pair<Idx,Idx>,
Idx>& rCompositionMap,
743 std::map<Idx,Idx>& rCompositionMap2)
745 rCompositionMap2.clear();
746 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
747 for(rcit=rCompositionMap.begin(); rcit!=rCompositionMap.end(); rcit++)
748 rCompositionMap2.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.second));
813 std::pair<Idx,Idx> x12(x1,x2);
816 return x12it->second;
824 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
826 mArg1Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.first));
827 mArg2Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.second));
831 std::map< Idx , Idx >::const_iterator x1it=
mArg1Map.find(x1);
841 std::map< std::pair<Idx,Idx>,
Idx>::const_iterator rcit;
843 mArg1Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.first));
844 mArg2Map.insert(std::pair<Idx,Idx>(rcit->second,rcit->first.second));
848 std::map< Idx , Idx >::const_iterator x2it=
mArg2Map.find(x2);
#define FD_WPC(cntnow, contdone, message)
#define FAUDES_TYPE_IMPLEMENTATION(ftype, ctype, cbase)
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
void Name(const std::string &rName)
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 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 ParallelNB(const GeneratorVector &rGenVec, Generator &rResGen)
void CompositionMap1(const std::map< std::pair< Idx, Idx >, Idx > &rCompositionMap, std::map< Idx, Idx > &rCompositionMap1)
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)