|
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() << ")");
471 std::string name=rGen. Name();
478 FD_DF( "LanguageComplement("<< rGen. Name() << "," << rAlphabet. Name() << ")");
481 std::string name = rGen. Name();
498 FD_DF( "LanguageComplement("<< rGen. Name() << ")");
499 std::string name=rGen. Name();
527 FD_DF( "LanguageDifference("<< rGen1. Name() << "," << rGen2. Name() << ")");
538 if(&rResGen == &rGen1 || &rResGen== &rGen2) {
539 pResGen = rResGen. New();
543 #ifdef FAUDES_CHECKED
545 std::stringstream errstr;
546 errstr << "Nondeterministic parameter " << rGen2. Name() << ".";
547 throw Exception( "LanguageDifference()", errstr.str(), 101);
561 FD_DF( "LanguageDifference(...): stage 2");
564 if(pResGen != &rResGen) {
565 pResGen-> Move(rResGen);
569 FD_DF( "LanguageDifference(...): done");
576 FD_DF( "LanguageConcatenateNonDet(" << rGen1. Name() << "," << rGen2. Name() << ")");
583 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
584 pResGen= rResGen. New();
594 std::map<Idx,Idx> Gen1StatesMap;
595 std::map<Idx,Idx> Gen2StatesMap;
598 StateSet::Iterator sit;
603 if (stateNamesEnabled) {
606 Gen1StatesMap[*sit] = pResGen-> InsState();
610 if (stateNamesEnabled) {
613 Gen2StatesMap[*sit] = pResGen-> InsState();
619 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen1StatesMap[tit->X2]);
623 pResGen-> SetTransition(Gen2StatesMap[tit->X1], tit->Ev, Gen2StatesMap[tit->X2]);
637 bool concatenateEpsilon1= false;
640 concatenateEpsilon1= true;
650 if(concatenateEpsilon1)
658 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen2StatesMap[*sit]);
667 pResGen-> Name( "ConcatenateNonDet("+rGen1. Name()+ ","+rGen2. Name()+ ")");
670 if(pResGen != &rResGen) {
671 pResGen-> Move(rResGen);
681 FD_DF( "LanguageConcatenate("<< rGen1. Name()
682 << "," << rGen2. Name() << ")");
693 rResGen. Name( "Concatenate("+rGen1. Name()+ ","+rGen2. Name()+ ")");
701 << "," << rResGen. Name() << ")");
708 EventSet::Iterator evit;
722 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
727 rResGen. Name( "FullLanguage("+rAlphabet. Name()+ ")");
734 FD_DF( "AlphabetLanguage("<< rAlphabet. Name()
735 << "," << rResGen. Name() << ")");
741 rResGen. Name( "AlphabetLanguage("+rAlphabet. Name()+ ")");
744 if(rAlphabet. Empty()){
745 FD_WARN( "AlphabetLanguage: empty alphabet.");
751 EventSet::Iterator evit;
767 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
776 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
777 << "," << rResGen. Name() << ")");
798 rResGen. Name( "EmptyStringLanguage("+rAlphabet. Name()+ ")");
805 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
806 << "," << rResGen. Name() << ")");
815 rResGen. Name( "EmptyLanguage("+rAlphabet. Name()+ ")");
832 FD_DF( "LanguageInclusion("<< rGen1. Name() << "," << rGen2. Name() << ")");
846 FD_DF( "LanguageEquality("<< rGen1. Name() << "," << rGen2. Name() << ")");
855 FD_DF( "KleeneClosure("<< rGen. Name() << ")");
878 FD_DF( "KleeneClosure("<< rGen. Name() << ", ... )");
881 if(&rGen==&rResGen) {
909 FD_DF( "KleeneClosureNonDet("<< rGen. Name() << ")");
933 Idx imstate = istate;
938 TransToInsert. Insert(imstate, tit->Ev, tit->X2);
940 for (tit = TransToInsert. Begin(); tit != TransToInsert. End(); ++tit) {
943 TransToInsert. Clear();
954 TransToInsert. Insert(tit->X1, tit->Ev, imstate);
958 for (tit = TransToInsert. Begin(); tit != TransToInsert. End(); ++tit) {
967 FD_DF( "PrefixClosure("<< rGen. Name() << ")");
1020 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << ")");
1028 EventSet::Iterator evit,evbegin,evend;
1029 evbegin = rAlphabet. Begin();
1030 evend = rAlphabet. End();
1031 StateSet::Iterator sit;
1035 for(evit = evbegin; evit != evend; ++evit){
1047 FD_DF( "SelfLoopMarkedStates(" << rGen. Name() << "," << rAlphabet. Name() << ")");
1051 + "," + rAlphabet. Name() + ")");
1057 EventSet::Iterator evit,evbegin,evend;
1058 evbegin = rAlphabet. Begin();
1059 evend = rAlphabet. End();
1060 StateSet::Iterator sit;
1064 for(evit = evbegin; evit != evend; ++evit){
1076 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << "," << rStates. Name() << ")");
1080 + "," + rAlphabet. Name() + "," + rStates. Name() + ")");
1083 #ifdef FAUDES_CHECKED
1084 if( !(rStates <= rGen. States()) ){
1085 std::stringstream errstr;
1086 errstr << "State set " << rStates. Name() <<
1087 " has to be included in state set of "<< rGen. Name() << ".";
1088 throw Exception( "SelfLoop()", errstr.str(), 100);
1096 EventSet::Iterator evit,evbegin,evend;
1097 evbegin = rAlphabet. Begin();
1098 evend = rAlphabet. End();
1099 StateSet::Iterator sit;
1102 for (sit = rStates. Begin(); sit != rStates. End(); ++sit) {
1103 for(evit = evbegin; evit != evend; ++evit){
#define FD_WPC(cntnow, contdone, message)
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
void Name(const std::string &rName)
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
const std::string & Name(void) const
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)
bool IsPrefixClosed(const Generator &rGen)
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)
std::string CollapsString(const std::string &rString, unsigned int len)
libFAUDES 2.33c
--- 2025.05.15
--- c++ api documentaion by doxygen
|