|
Go to the documentation of this file.
43 FD_DF( "LanguageUnionNonDet("<< rGen1. Name()
44 << "," << rGen2. Name() << ")");
52 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
53 pResGen= rResGen. New();
63 std::map<Idx,Idx> Gen1StatesMap;
64 std::map<Idx,Idx> Gen2StatesMap;
67 StateSet::Iterator sit;
69 if (stateNamesEnabled) {
73 Gen1StatesMap[*sit] = pResGen-> InsState();
77 if (stateNamesEnabled) {
81 Gen2StatesMap[*sit] = pResGen-> InsState();
88 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen1StatesMap[tit->X2]);
91 pResGen-> SetTransition(Gen2StatesMap[tit->X1], tit->Ev, Gen2StatesMap[tit->X2]);
114 if(pResGen != &rResGen) {
115 pResGen-> Move(rResGen);
126 << "," << rGen2. Name() << ")");
129 std::string name1 = rGen1. Name();
130 std::string name2 = rGen2. Name();
153 if(rGenVec. Size()==0) {
158 if(rGenVec. Size()==1) {
159 rResGen=rGenVec. At(0);
185 FD_DF( "LanguageIntersection("<< rGen1. Name()
186 << "," << rGen2. Name() << ")");
189 std::string name1 = rGen1. Name();
190 std::string name2 = rGen2. Name();
193 Product(rGen1, rGen2, rResGen);
204 if(rGenVec. Size()==0) {
209 if(rGenVec. Size()==1) {
210 rResGen=rGenVec. At(0);
223 FD_DF( "EmptyLanguageIntersection("<< rGen1. Name()
224 << "," << rGen2. Name() << ")");
229 if( (!g1_det) || (!g2_det)) {
230 std::stringstream errstr;
231 errstr << "EmptyLanguageIntersection has not been tested for nondeterministic generators";
232 throw Exception( "Product", errstr.str(), 201);
238 std::stack< std::pair<Idx,Idx> > todo;
239 std::set< std::pair<Idx,Idx> > done;
241 std::pair<Idx,Idx> currentstates, newstates;
242 StateSet::Iterator lit1, lit2;
252 FD_DF( "EmptyLanguageIntersection: push all combinations of initial states to todo:");
255 for (lit1 = init1. Begin(); lit1 != init1. End(); ++lit1) {
256 for (lit2 = init2. Begin(); lit2 != init2. End(); ++lit2) {
257 currentstates = std::make_pair(*lit1, *lit2);
258 todo.push(currentstates);
264 FD_DF( "EmptyLanguageIntersection: processing reachable states:");
265 while (!todo.empty()) {
269 FD_WPC(done.size(),done.size()+todo.size(), "Product(): processing");
271 currentstates = todo.top();
273 done.insert(currentstates);
274 FD_DF( "EmptyLanguageIntersection: processing " << currentstates.first << "|" << currentstates.second);
276 if(mark1. Exists(currentstates.first) && mark2. Exists(currentstates.second)) {
284 tit2_end = rGen2. TransRelEnd(currentstates.second);
285 while((tit1 != tit1_end) && (tit2 != tit2_end)) {
287 if(tit1->Ev == tit2->Ev) {
289 newstates = std::make_pair(tit1->X2, tit2->X2);
290 if(done.find(newstates)==done.end())
291 if(coac1. Exists(newstates.first))
292 if(coac2. Exists(newstates.second))
293 todo.push(newstates);
299 else if (tit1->Ev < tit2->Ev) {
303 else if (tit1->Ev > tit2->Ev) {
313 Product(rGen1, rGen2, ProductGen);
315 if(empty != altempty) {
318 FD_ERR( "EmptyLanguageIntersection(): ERROR -- ref result: " << altempty);
329 << "," << rGen2. Name() << ")");
335 FD_DF( "Automaton("<< rGen. Name() << "," << rAlphabet. Name() << ")");
338 #ifdef FAUDES_CHECKED
340 FD_WARN( "Automaton(): nondeterministic parameter " << rGen. Name() << ".");
355 bool dumpReached= false;
371 StateSet::Iterator sit;
372 EventSet::Iterator eit;
381 if(*sit!=dump) dumpReached= true;
393 FD_DF( "Automaton("<< rGen. Name() << ")");
394 std::string name=rGen. Name();
401 FD_DF( "LanguageComplement("<< rGen. Name() << "," << rAlphabet. Name() << ")");
404 std::string name = rGen. Name();
421 FD_DF( "LanguageComplement("<< rGen. Name() << ")");
422 std::string name=rGen. Name();
450 FD_DF( "LanguageDifference("<< rGen1. Name() << "," << rGen2. Name() << ")");
461 if(&rResGen == &rGen1 || &rResGen== &rGen2) {
462 pResGen = rResGen. New();
466 #ifdef FAUDES_CHECKED
468 std::stringstream errstr;
469 errstr << "Nondeterministic parameter " << rGen2. Name() << ".";
470 throw Exception( "LanguageDifference()", errstr.str(), 101);
486 if(pResGen != &rResGen) {
487 pResGen-> Move(rResGen);
497 FD_DF( "LanguageConcatenateNonDet(" << rGen1. Name() << "," << rGen2. Name() << ")");
504 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
505 pResGen= rResGen. New();
515 std::map<Idx,Idx> Gen1StatesMap;
516 std::map<Idx,Idx> Gen2StatesMap;
519 StateSet::Iterator sit;
524 if (stateNamesEnabled) {
527 Gen1StatesMap[*sit] = pResGen-> InsState();
531 if (stateNamesEnabled) {
534 Gen2StatesMap[*sit] = pResGen-> InsState();
540 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen1StatesMap[tit->X2]);
544 pResGen-> SetTransition(Gen2StatesMap[tit->X1], tit->Ev, Gen2StatesMap[tit->X2]);
558 bool concatenateEpsilon1= false;
561 concatenateEpsilon1= true;
571 if(concatenateEpsilon1)
579 pResGen-> SetTransition(Gen1StatesMap[tit->X1], tit->Ev, Gen2StatesMap[*sit]);
588 pResGen-> Name( "ConcatenateNonDet("+rGen1. Name()+ ","+rGen2. Name()+ ")");
591 if(pResGen != &rResGen) {
592 pResGen-> Move(rResGen);
602 FD_DF( "LanguageConcatenate("<< rGen1. Name()
603 << "," << rGen2. Name() << ")");
614 rResGen. Name( "Concatenate("+rGen1. Name()+ ","+rGen2. Name()+ ")");
622 << "," << rResGen. Name() << ")");
629 EventSet::Iterator evit;
643 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
648 rResGen. Name( "FullLanguage("+rAlphabet. Name()+ ")");
655 FD_DF( "AlphabetLanguage("<< rAlphabet. Name()
656 << "," << rResGen. Name() << ")");
662 rResGen. Name( "AlphabetLanguage("+rAlphabet. Name()+ ")");
665 if(rAlphabet. Empty()){
666 FD_WARN( "AlphabetLanguage: empty alphabet.");
672 EventSet::Iterator evit;
688 for (evit = rAlphabet. Begin(); evit != rAlphabet. End(); ++evit) {
697 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
698 << "," << rResGen. Name() << ")");
719 rResGen. Name( "EmptyStringLanguage("+rAlphabet. Name()+ ")");
726 FD_DF( "EmptyStringLanguage("<< rAlphabet. Name()
727 << "," << rResGen. Name() << ")");
736 rResGen. Name( "EmptyLanguage("+rAlphabet. Name()+ ")");
753 FD_DF( "LanguageInclusion("<< rGen1. Name() << "," << rGen2. Name() << ")");
767 FD_DF( "LanguageEquality("<< rGen1. Name() << "," << rGen2. Name() << ")");
776 FD_DF( "KleeneClosure("<< rGen. Name() << ")");
799 FD_DF( "KleeneClosure("<< rGen. Name() << ", ... )");
802 if(&rGen==&rResGen) {
830 FD_DF( "KleeneClosureNonDet("<< rGen. Name() << ")");
851 Idx imstate = istate;
856 TransToInsert. Insert(imstate, tit->Ev, tit->X2);
865 TransToInsert. Insert(tit->X1, tit->Ev, imstate);
869 for (tit = TransToInsert. Begin(); tit != TransToInsert. End(); ++tit) {
878 FD_DF( "PrefixClosure("<< rGen. Name() << ")");
931 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << ")");
939 EventSet::Iterator evit,evbegin,evend;
940 evbegin = rAlphabet. Begin();
941 evend = rAlphabet. End();
942 StateSet::Iterator sit;
946 for(evit = evbegin; evit != evend; ++evit){
958 FD_DF( "SelfLoopMarkedStates(" << rGen. Name() << "," << rAlphabet. Name() << ")");
962 + "," + rAlphabet. Name() + ")");
968 EventSet::Iterator evit,evbegin,evend;
969 evbegin = rAlphabet. Begin();
970 evend = rAlphabet. End();
971 StateSet::Iterator sit;
975 for(evit = evbegin; evit != evend; ++evit){
987 FD_DF( "SelfLoop(" << rGen. Name() << "," << rAlphabet. Name() << "," << rStates. Name() << ")");
991 + "," + rAlphabet. Name() + "," + rStates. Name() + ")");
994 #ifdef FAUDES_CHECKED
995 if( !(rStates <= rGen. States()) ){
996 std::stringstream errstr;
997 errstr << "State set " << rStates. Name() <<
998 " has to be included in state set of "<< rGen. Name() << ".";
999 throw Exception( "SelfLoop()", errstr.str(), 100);
1007 EventSet::Iterator evit,evbegin,evend;
1008 evbegin = rAlphabet. Begin();
1009 evend = rAlphabet. End();
1010 StateSet::Iterator sit;
1013 for (sit = rStates. Begin(); sit != rStates. End(); ++sit) {
1014 for(evit = evbegin; evit != evend; ++evit){
1026 #undef Product //see define above for comment
libFAUDES 2.26g
--- 2015.08.17
--- c++ api documentaion by doxygen
|