|
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( "Product", 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);
279 FD_DF( "EmptyLanguageIntersection: processing " << currentstates.first << "|" << currentstates.second);
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 #ifdef FAUDES_CHECKED
345 FD_WARN( "Automaton(): nondeterministic parameter " << rGen. Name() << ".");
360 bool dumpReached= false;
376 StateSet::Iterator sit;
377 EventSet::Iterator eit;
386 if(*sit!=dump) dumpReached= true;
398 FD_DF( "Automaton("<< rGen. Name() << ")");
399 std::string name=rGen. Name();
406 FD_DF( "LanguageComplement("<< rGen. Name() << "," << rAlphabet. Name() << ")");
409 std::string name = rGen. Name();
426 FD_DF( "LanguageComplement("<< rGen. Name() << ")");
427 std::string name=rGen. Name();
455 FD_DF( "LanguageDifference("<< rGen1. Name() << "," << rGen2. Name() << ")");
466 if(&rResGen == &rGen1 || &rResGen== &rGen2) {
467 pResGen = rResGen. New();
471 #ifdef FAUDES_CHECKED
473 std::stringstream errstr;
474 errstr << "Nondeterministic parameter " << rGen2. Name() << ".";
475 throw Exception( "LanguageDifference()", errstr.str(), 101);
489 FD_DF( "LanguageDifference("<< rGen1. Name() << "," << rGen2. Name() << "): stage 2");
492 if(pResGen != &rResGen) {
493 pResGen-> Move(rResGen);
497 FD_DF( "LanguageDifference("<< rGen1. Name() << "," << rGen2. Name() << "): done");
504 FD_DF( "LanguageConcatenateNonDet(" << rGen1. Name() << "," << rGen2. Name() << ")");
511 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
512 pResGen= rResGen. New();
522 std::map<Idx,Idx> Gen1StatesMap;
523 std::map<Idx,Idx> Gen2StatesMap;
526 StateSet::Iterator sit;
531 if (stateNamesEnabled) {
534 Gen1StatesMap[*sit] = pResGen-> InsState();
538 if (stateNamesEnabled) {
541 Gen2StatesMap[*sit] = pResGen-> InsState();
547 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen1StatesMap[tit->X2]);
551 pResGen-> SetTransition(Gen2StatesMap[tit->X1], tit->Ev, Gen2StatesMap[tit->X2]);
565 bool concatenateEpsilon1= false;
568 concatenateEpsilon1= true;
578 if(concatenateEpsilon1)
586 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen2StatesMap[*sit]);
595 pResGen-> Name( "ConcatenateNonDet("+rGen1. Name()+ ","+rGen2. Name()+ ")");
598 if(pResGen != &rResGen) {
599 pResGen-> Move(rResGen);
609 FD_DF( "LanguageConcatenate("<< rGen1. Name()
610 << "," << rGen2. Name() << ")");
621 rResGen. Name( "Concatenate("+rGen1. Name()+ ","+rGen2. Name()+ ")");
629 << "," << rResGen. Name() << ")");
636 EventSet::Iterator evit;
650 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
655 rResGen. Name( "FullLanguage("+rAlphabet. Name()+ ")");
662 FD_DF( "AlphabetLanguage("<< rAlphabet. Name()
663 << "," << rResGen. Name() << ")");
669 rResGen. Name( "AlphabetLanguage("+rAlphabet. Name()+ ")");
672 if(rAlphabet. Empty()){
673 FD_WARN( "AlphabetLanguage: empty alphabet.");
679 EventSet::Iterator evit;
695 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
704 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
705 << "," << rResGen. Name() << ")");
726 rResGen. Name( "EmptyStringLanguage("+rAlphabet. Name()+ ")");
733 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
734 << "," << rResGen. Name() << ")");
743 rResGen. Name( "EmptyLanguage("+rAlphabet. Name()+ ")");
760 FD_DF( "LanguageInclusion("<< rGen1. Name() << "," << rGen2. Name() << ")");
774 FD_DF( "LanguageEquality("<< rGen1. Name() << "," << rGen2. Name() << ")");
783 FD_DF( "KleeneClosure("<< rGen. Name() << ")");
806 FD_DF( "KleeneClosure("<< rGen. Name() << ", ... )");
809 if(&rGen==&rResGen) {
837 FD_DF( "KleeneClosureNonDet("<< rGen. Name() << ")");
858 Idx imstate = istate;
863 TransToInsert. Insert(imstate, tit->Ev, tit->X2);
872 TransToInsert. Insert(tit->X1, tit->Ev, imstate);
876 for (tit = TransToInsert. Begin(); tit != TransToInsert. End(); ++tit) {
885 FD_DF( "PrefixClosure("<< rGen. Name() << ")");
938 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << ")");
946 EventSet::Iterator evit,evbegin,evend;
947 evbegin = rAlphabet. Begin();
948 evend = rAlphabet. End();
949 StateSet::Iterator sit;
953 for(evit = evbegin; evit != evend; ++evit){
965 FD_DF( "SelfLoopMarkedStates(" << rGen. Name() << "," << rAlphabet. Name() << ")");
969 + "," + rAlphabet. Name() + ")");
975 EventSet::Iterator evit,evbegin,evend;
976 evbegin = rAlphabet. Begin();
977 evend = rAlphabet. End();
978 StateSet::Iterator sit;
982 for(evit = evbegin; evit != evend; ++evit){
994 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << "," << rStates. Name() << ")");
998 + "," + rAlphabet. Name() + "," + rStates. Name() + ")");
1001 #ifdef FAUDES_CHECKED
1002 if( !(rStates <= rGen. States()) ){
1003 std::stringstream errstr;
1004 errstr << "State set " << rStates. Name() <<
1005 " has to be included in state set of "<< rGen. Name() << ".";
1006 throw Exception( "SelfLoop()", errstr.str(), 100);
1014 EventSet::Iterator evit,evbegin,evend;
1015 evbegin = rAlphabet. Begin();
1016 evend = rAlphabet. End();
1017 StateSet::Iterator sit;
1020 for (sit = rStates. Begin(); sit != rStates. End(); ++sit) {
1021 for(evit = evbegin; evit != evend; ++evit){
1033 #undef Product //see define above for comment
libFAUDES 2.28a
--- 2016.09.13
--- c++ api documentaion by doxygen
|