|
Go to the documentation of this file.
48 FD_DF( "LanguageUnionNonDet("<< rGen1. Name()
49 << "," << rGen2. Name() << ")");
57 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
58 pResGen= rResGen. New();
68 std::map<Idx,Idx> Gen1StatesMap;
69 std::map<Idx,Idx> Gen2StatesMap;
72 StateSet::Iterator sit;
74 if (stateNamesEnabled) {
78 Gen1StatesMap[*sit] = pResGen-> InsState();
82 if (stateNamesEnabled) {
86 Gen2StatesMap[*sit] = pResGen-> InsState();
93 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen1StatesMap[tit->X2]);
96 pResGen-> SetTransition(Gen2StatesMap[tit->X1], tit->Ev, Gen2StatesMap[tit->X2]);
119 if(pResGen != &rResGen) {
120 pResGen-> Move(rResGen);
131 << "," << rGen2. Name() << ")");
134 std::string name1 = rGen1. Name();
135 std::string name2 = rGen2. Name();
158 if(rGenVec. Size()==0) {
163 if(rGenVec. Size()==1) {
164 rResGen=rGenVec. At(0);
190 FD_DF( "LanguageIntersection("<< rGen1. Name() << "," << rGen2. Name() << ")");
193 std::string name1 = rGen1. Name();
194 std::string name2 = rGen2. Name();
197 Product(rGen1, rGen2, rResGen);
199 FD_DF( "LanguageIntersection("<< rGen1. Name() << "," << rGen2. Name() << "): done");
209 if(rGenVec. Size()==0) {
214 if(rGenVec. Size()==1) {
215 rResGen=rGenVec. At(0);
228 FD_DF( "EmptyLanguageIntersection("<< rGen1. Name()
229 << "," << rGen2. Name() << ")");
234 if( (!g1_det) || (!g2_det)) {
235 std::stringstream errstr;
236 errstr << "EmptyLanguageIntersection has not been tested for nondeterministic generators";
237 throw Exception( "EmptyLanguageIntersection", errstr.str(), 201);
243 std::stack< std::pair<Idx,Idx> > todo;
244 std::set< std::pair<Idx,Idx> > done;
246 std::pair<Idx,Idx> currentstates, newstates;
247 StateSet::Iterator lit1, lit2;
257 FD_DF( "EmptyLanguageIntersection: push all combinations of initial states to todo:");
260 for (lit1 = init1. Begin(); lit1 != init1. End(); ++lit1) {
261 for (lit2 = init2. Begin(); lit2 != init2. End(); ++lit2) {
262 currentstates = std::make_pair(*lit1, *lit2);
263 todo.push(currentstates);
269 FD_DF( "EmptyLanguageIntersection: processing reachable states:");
270 while (!todo.empty()) {
274 FD_WPC(done.size(),done.size()+todo.size(), "Product(): processing");
276 currentstates = todo.top();
278 done.insert(currentstates);
281 if(mark1. Exists(currentstates.first) && mark2. Exists(currentstates.second)) {
289 tit2_end = rGen2. TransRelEnd(currentstates.second);
290 while((tit1 != tit1_end) && (tit2 != tit2_end)) {
292 if(tit1->Ev == tit2->Ev) {
294 newstates = std::make_pair(tit1->X2, tit2->X2);
295 if(done.find(newstates)==done.end())
296 if(coac1. Exists(newstates.first))
297 if(coac2. Exists(newstates.second))
298 todo.push(newstates);
304 else if (tit1->Ev < tit2->Ev) {
308 else if (tit1->Ev > tit2->Ev) {
318 Product(rGen1, rGen2, ProductGen);
320 if(empty != altempty) {
323 FD_ERR( "EmptyLanguageIntersection(): ERROR -- ref result: " << altempty);
334 << "," << rGen2. Name() << ")");
340 FD_DF( "Automaton("<< rGen. Name() << "," << rAlphabet. Name() << ")");
343 EventSet::Iterator eit;
344 StateSet::Iterator sit;
347 #ifdef FAUDES_CHECKED
349 FD_WARN( "Automaton(): nondeterministic parameter " << rGen. Name() << ".");
372 bool dumpReached= false;
402 FD_DF( "Automaton: processing state " << *sit);
406 if(tit->X1 >= cs) break;
409 if(tit->X1 == cs) found= true;
412 FD_DF( "Automaton: state not found, all transitions go to dump");
415 if(cs!=dump) dumpReached= true;
423 FD_DF( "Automaton: processing " << tit->Str() << " awaiting " << ce);
426 if(ce==tit->Ev) break;
428 FD_DF( "Automaton: add " << cs << "-(" << ce << ")->dump");
430 if(cs!=dump) dumpReached= true;
442 if(tit->X1!=cs) {fin= true; break;}
443 if(tit->Ev!=ce) break;
444 FD_DF( "Automaton: skip " << tit->Str());
454 FD_DF( "Automaton: fin " << cs << "-(" << *eit << ")->dump");
456 if(cs!=dump) dumpReached= true;
470 FD_DF( "Automaton("<< rGen. Name() << ", ...)");
477 FD_DF( "Automaton("<< rGen. Name() << ")");
478 std::string name=rGen. Name();
485 FD_DF( "LanguageComplement("<< rGen. Name() << "," << rAlphabet. Name() << ")");
488 std::string name = rGen. Name();
505 FD_DF( "LanguageComplement("<< rGen. Name() << ")");
506 std::string name=rGen. Name();
534 FD_DF( "LanguageDifference("<< rGen1. Name() << "," << rGen2. Name() << ")");
545 if(&rResGen == &rGen1 || &rResGen== &rGen2) {
546 pResGen = rResGen. New();
550 #ifdef FAUDES_CHECKED
552 std::stringstream errstr;
553 errstr << "Nondeterministic parameter " << rGen2. Name() << ".";
554 throw Exception( "LanguageDifference()", errstr.str(), 101);
568 FD_DF( "LanguageDifference(...): stage 2");
571 if(pResGen != &rResGen) {
572 pResGen-> Move(rResGen);
576 FD_DF( "LanguageDifference(...): done");
583 FD_DF( "LanguageConcatenateNonDet(" << rGen1. Name() << "," << rGen2. Name() << ")");
590 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
591 pResGen= rResGen. New();
601 std::map<Idx,Idx> Gen1StatesMap;
602 std::map<Idx,Idx> Gen2StatesMap;
605 StateSet::Iterator sit;
610 if (stateNamesEnabled) {
613 Gen1StatesMap[*sit] = pResGen-> InsState();
617 if (stateNamesEnabled) {
620 Gen2StatesMap[*sit] = pResGen-> InsState();
626 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen1StatesMap[tit->X2]);
630 pResGen-> SetTransition(Gen2StatesMap[tit->X1], tit->Ev, Gen2StatesMap[tit->X2]);
644 bool concatenateEpsilon1= false;
647 concatenateEpsilon1= true;
657 if(concatenateEpsilon1)
665 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen2StatesMap[*sit]);
674 pResGen-> Name( "ConcatenateNonDet("+rGen1. Name()+ ","+rGen2. Name()+ ")");
677 if(pResGen != &rResGen) {
678 pResGen-> Move(rResGen);
688 FD_DF( "LanguageConcatenate("<< rGen1. Name()
689 << "," << rGen2. Name() << ")");
700 rResGen. Name( "Concatenate("+rGen1. Name()+ ","+rGen2. Name()+ ")");
708 << "," << rResGen. Name() << ")");
715 EventSet::Iterator evit;
729 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
734 rResGen. Name( "FullLanguage("+rAlphabet. Name()+ ")");
741 FD_DF( "AlphabetLanguage("<< rAlphabet. Name()
742 << "," << rResGen. Name() << ")");
748 rResGen. Name( "AlphabetLanguage("+rAlphabet. Name()+ ")");
751 if(rAlphabet. Empty()){
752 FD_WARN( "AlphabetLanguage: empty alphabet.");
758 EventSet::Iterator evit;
774 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
783 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
784 << "," << rResGen. Name() << ")");
805 rResGen. Name( "EmptyStringLanguage("+rAlphabet. Name()+ ")");
812 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
813 << "," << rResGen. Name() << ")");
822 rResGen. Name( "EmptyLanguage("+rAlphabet. Name()+ ")");
839 FD_DF( "LanguageInclusion("<< rGen1. Name() << "," << rGen2. Name() << ")");
853 FD_DF( "LanguageEquality("<< rGen1. Name() << "," << rGen2. Name() << ")");
862 FD_DF( "KleeneClosure("<< rGen. Name() << ")");
885 FD_DF( "KleeneClosure("<< rGen. Name() << ", ... )");
888 if(&rGen==&rResGen) {
916 FD_DF( "KleeneClosureNonDet("<< rGen. Name() << ")");
940 Idx imstate = istate;
945 TransToInsert. Insert(imstate, tit->Ev, tit->X2);
947 for (tit = TransToInsert. Begin(); tit != TransToInsert. End(); ++tit) {
950 TransToInsert. Clear();
961 TransToInsert. Insert(tit->X1, tit->Ev, imstate);
965 for (tit = TransToInsert. Begin(); tit != TransToInsert. End(); ++tit) {
974 FD_DF( "PrefixClosure("<< rGen. Name() << ")");
1027 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << ")");
1035 EventSet::Iterator evit,evbegin,evend;
1036 evbegin = rAlphabet. Begin();
1037 evend = rAlphabet. End();
1038 StateSet::Iterator sit;
1042 for(evit = evbegin; evit != evend; ++evit){
1054 FD_DF( "SelfLoopMarkedStates(" << rGen. Name() << "," << rAlphabet. Name() << ")");
1058 + "," + rAlphabet. Name() + ")");
1064 EventSet::Iterator evit,evbegin,evend;
1065 evbegin = rAlphabet. Begin();
1066 evend = rAlphabet. End();
1067 StateSet::Iterator sit;
1071 for(evit = evbegin; evit != evend; ++evit){
1083 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << "," << rStates. Name() << ")");
1087 + "," + rAlphabet. Name() + "," + rStates. Name() + ")");
1090 #ifdef FAUDES_CHECKED
1091 if( !(rStates <= rGen. States()) ){
1092 std::stringstream errstr;
1093 errstr << "State set " << rStates. Name() <<
1094 " has to be included in state set of "<< rGen. Name() << ".";
1095 throw Exception( "SelfLoop()", errstr.str(), 100);
1103 EventSet::Iterator evit,evbegin,evend;
1104 evbegin = rAlphabet. Begin();
1105 evend = rAlphabet. End();
1106 StateSet::Iterator sit;
1109 for (sit = rStates. Begin(); sit != rStates. End(); ++sit) {
1110 for(evit = evbegin; evit != evend; ++evit){
1121 FD_WARN( "IsPrefixClosed(): API depreciated, use IsClosed()");
#define FD_WPC(cntnow, contdone, message)
const std::string & Name(void) const
std::vector< int >::size_type Position
virtual const T & At(const Position &pos) const
Iterator Begin(void) const
bool Insert(const Transition &rTransition)
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
void Write(const Type *pContext=0) const
StateSet::Iterator StatesBegin(void) 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)
virtual vGenerator & Assign(const Type &rSrc)
virtual vGenerator * Copy(void) const
const StateSet & InitStates(void) const
TransSet::Iterator TransRelBegin(void) const
Idx InitStatesSize(void) const
EventSet::Iterator AlphabetBegin(void) const
virtual vGenerator * New(void) const
bool ExistsTransition(const std::string &rX1, const std::string &rEv, const std::string &rX2) const
void InjectMarkedStates(const StateSet &rNewMarkedStates)
Idx MarkedStatesSize(void) const
void SetInitState(Idx index)
StateSet AccessibleSet(void) const
StateSet::Iterator MarkedStatesBegin(void) const
std::string StateName(Idx index) const
StateSet::Iterator StatesEnd(void) const
void ClrInitState(Idx index)
TransSet::Iterator TransRelEnd(void) const
bool IsDeterministic(void) const
StateSet::Iterator MarkedStatesEnd(void) const
void SetMarkedState(Idx index)
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 UniqueStateName(const std::string &rName) const
const StateSet & States(void) const
void InjectAlphabet(const EventSet &rNewalphabet)
bool Exists(const T &rElem) const
Iterator Begin(void) const
bool IsClosed(const Generator &rGen)
bool EmptyLanguageIntersection(const Generator &rGen1, const Generator &rGen2)
void FullLanguage(const EventSet &rAlphabet, Generator &rResGen)
void LanguageUnion(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void LanguageConcatenateNonDet(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void SelfLoop(Generator &rGen, const EventSet &rAlphabet)
bool LanguageDisjoint(const Generator &rGen1, const Generator &rGen2)
bool LanguageInclusion(const Generator &rGen1, const Generator &rGen2)
void UniqueInit(Generator &rGen)
void KleeneClosure(Generator &rGen)
void PrefixClosure(Generator &rGen)
void Product(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void Deterministic(const Generator &rGen, Generator &rResGen)
void LanguageUnionNonDet(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void Automaton(Generator &rGen, const EventSet &rAlphabet)
void AlphabetLanguage(const EventSet &rAlphabet, Generator &rResGen)
void LanguageConcatenate(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
bool IsEmptyLanguage(const Generator &rGen)
bool LanguageEquality(const Generator &rGen1, const Generator &rGen2)
void LanguageDifference(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void LanguageIntersection(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void EmptyLanguage(const EventSet &rAlphabet, Generator &rResGen)
void Parallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void LanguageComplement(Generator &rGen, const EventSet &rAlphabet)
void EmptyStringLanguage(const EventSet &rAlphabet, Generator &rResGen)
void KleeneClosureNonDet(Generator &rGen)
void SelfLoopMarkedStates(Generator &rGen, const EventSet &rAlphabet)
bool IsNonblocking(const GeneratorVector &rGvec)
bool IsPrefixClosed(const Generator &rGen)
std::string CollapsString(const std::string &rString, unsigned int len)
libFAUDES 2.33h
--- 2025.06.18
--- c++ api documentaion by doxygen
|