|
Go to the documentation of this file.
66 mpStateSymbolTable(&mStateSymbolTable),
67 mpEventSymbolTable(GlobalEventSymbolTablep()),
69 mStateNamesEnabled(msStateNamesEnabledDefault),
70 mReindexOnWrite(msReindexOnWriteDefault),
77 pAlphabetPrototype(&AlphabetVoid()),
78 pStatesPrototype(&StatesVoid()),
79 pTransRelPrototype(&TransRelVoid()),
80 pGlobalPrototype(&GlobalVoid())
83 FD_DG( "vGenerator(" << this << ")::vGenerator()");
99 mpStateSymbolTable(&mStateSymbolTable),
100 mpEventSymbolTable(GlobalEventSymbolTablep()),
102 mStateNamesEnabled(msStateNamesEnabledDefault),
103 mReindexOnWrite(msReindexOnWriteDefault),
108 mpGlobalAttribute(0),
110 pAlphabetPrototype(&AlphabetVoid()),
111 pStatesPrototype(&StatesVoid()),
112 pTransRelPrototype(&TransRelVoid()),
113 pGlobalPrototype(&GlobalVoid())
116 FD_DG( "vGenerator(" << this << ")::vGenerator(" << &rOtherGen << ")");
129 mMyName( "Generator"),
131 mpStateSymbolTable(&mStateSymbolTable),
132 mpEventSymbolTable(GlobalEventSymbolTablep()),
134 mStateNamesEnabled(msStateNamesEnabledDefault),
135 mReindexOnWrite(msReindexOnWriteDefault),
140 mpGlobalAttribute(0),
142 pAlphabetPrototype(&AlphabetVoid()),
143 pStatesPrototype(&StatesVoid()),
144 pTransRelPrototype(&TransRelVoid()),
145 pGlobalPrototype(&GlobalVoid())
148 FD_DG( "vGenerator(" << this << ")::vGenerator(" << rFileName << ")");
160 Read(rFileName, "Generator");
167 FD_DG( "vGenerator(" << this << ")::New()");
179 FD_DG( "vGenerator(" << this << ")::Copy()");
187 return dynamic_cast< const vGenerator* > (pOther);
201 const TransSet* pNewTransRelPrototype) {
202 FD_DG( "vGenerator(" << this << ")::ConfigureAtributes(..)");
207 FD_DG( "vGenerator(" << this << ")::ConfigureAtributes(): done");
254 FD_DG( "vGenerator(" << this << ")::Assign(" << &rGen << ")");
256 if(&rGen== this) return * this;
274 #ifdef FAUDES_DEBUG_CODE
276 FD_DG( "vGenerator()::Copy(): invalid generator");
286 FD_DG( "vGenerator(" << this << ")::Assign([type] " << &rSrc << ")");
288 if(&rSrc== this) return * this;
297 FD_DG( "vGenerator(" << this << ")::Assign(" << &rGen << ")");
314 #ifdef FAUDES_DEBUG_CODE
316 FD_DG( "vGenerator()::Copy(): invalid generator");
327 FD_DG( "vGenerator(" << this << ")::Move(" << &rGen << ")");
335 FD_DG( "vGenerator(" << this << ")::Move(" << &rGen << "): using std copy");
376 FD_DG( "vGenerator(" << this << ")::operator = " << &rOtherGen);
382 FD_DG( "vGenerator(" << this << ")::Version(" << version << ")");
383 std::ostringstream o;
390 FD_DG( "vGenerator(" << this << ")::Version(" << rVersion << ")");
393 std::stringstream errstr;
394 errstr << "Destination must not match source.";
395 throw Exception( "vGenerator::Version(string)", errstr.str(), 96);
400 EventSet::Iterator eit;
401 StateSet::Iterator lit;
403 std::map<Idx,Idx> eventoldnewmap;
408 eventoldnewmap[*eit] = newevent;
434 FD_DG( "vGenerator(" << this << ")::Version(" << rPattern << ", " << rReplacement << ", ...)");
437 std::stringstream errstr;
438 errstr << "Destination must not match source.";
439 throw Exception( "vGenerator::Version(string,string)", errstr.str(), 96);
442 if(rPattern.empty()) {
447 if(rPattern==rReplacement) {
455 EventSet::Iterator eit;
456 StateSet::Iterator lit;
458 std::map<Idx,Idx> eventoldnewmap;
460 std::string newstring;
461 std::string::size_type pos = 0;
462 int patternlength=rPattern.size();
463 int replacementlength=rReplacement.size();
468 while( (pos = newstring.find(rPattern, pos)) != std::string::npos ) {
469 newstring.replace(pos, patternlength, rReplacement);
471 pos=pos+replacementlength;
474 eventoldnewmap[*eit] = newevent;
480 while( (pos = newstring.find(rPattern, pos)) != std::string::npos ) {
481 newstring.replace(pos, patternlength, rReplacement);
482 pos=pos+replacementlength;
484 rResGen. Name(newstring);
508 FD_DV( "vGenerator(" << this << ")::Name(\"" << rName << "\")");
519 FD_DG( "vGenerator(" << this << ")::Valid()");
527 StateSet::Iterator lit;
535 if(! ExistsState(static_cast<Idx>(*lit))) return false;
537 if(! ExistsState(static_cast<Idx>(*lit))) return false;
544 NameSet::Iterator eit;
564 FD_DG( "vGenerator(" << this << ")::Clear()");
655 FD_DG( "vGenerator::ClearMinStateIndexMap()");
669 FD_DG( "vGenerator::SetMinStateIndexMap()");
674 StateSet::Iterator it;
680 if( StateName(static_cast<Idx>(*it)) != "") {
687 if( StateName(static_cast<Idx>(*it)) != "") {
712 #ifdef FAUDES_DEBUG_CONTAINER
713 std::map<Idx,Idx>::const_iterator _it;
715 FD_DC( "vGenerator::MinStateIndexMap: " << _it->first
716 << " <-- " << SStr(_it->second));
724 std::map<Idx,Idx>::const_iterator minit;
727 return minit->second;
748 StateSet::Iterator sit;
825 FD_DG( "vGenerator(" << this << ")::EventName("
826 << index << ",\"" << rName << "\")");
827 #ifdef FAUDES_CHECKED
829 std::stringstream errstr;
830 errstr << "event \"" << index << "\" not found in generator \""
832 throw Exception( "vGenerator::EventName(name)", errstr.str(), 89);
840 std::string name=rName;
841 if(name== "") name= "ev";
849 FD_DG( "vGenerator(" << this << ")::EventRename(" << EStr(event) << ", " << rNewName << ")");
850 #ifdef FAUDES_CHECKED
852 std::stringstream errstr;
853 errstr << "event \"" << event << "\" not found in generator \""
855 throw Exception( "vGenerator::EventReame(name)", errstr.str(), 89);
863 if(newidx==event) return true;
871 if(tit->Ev!=event) {++tit; continue;}
878 for(tit=newtrans-> Begin(); tit!=newtrans-> End(); tit++) {
887 FD_DG( "vGenerator(" << this << ")::EventRename(" << EStr(event) << ", " << rNewName << "):OK");
935 FD_DG( "vGenerator(" << this << ")::StateName("
936 << index << ",\"" << rName << "\")");
937 #ifdef FAUDES_CHECKED
939 std::stringstream errstr;
940 errstr << "state name \"" << rName << "\" not found in generator \""
942 throw Exception( "vGenerator::StateName(name)", errstr.str(), 90);
951 FD_DG( "vGenerator(" << this << ")::ClearStateNames()");
958 FD_DG( "Generator(" << this << ")::ClrStateName(\"" << index << "\")");
959 #ifdef FAUDES_CHECKED
961 std::stringstream errstr;
962 errstr << "state \"" << index << "\" not found in generator \""
964 throw Exception( "vGenerator::ClrStateName(name)", errstr.str(), 90);
972 FD_DG( "vGenerator(" << this << ")::ClrStateName(\"" << rName << "\")");
996 FD_DG( "vGenerator(" << this << ")::SetDefaultStateNames()");
998 StateSet::Iterator it;
1008 FD_DG( "vGenerator(" << this << ")::EnforceStateNames(temp)");
1009 StateSet::Iterator it;
1020 std::string name=rName;
1021 if(name== "") name= "st";
1088 const std::string& rX1, const std::string& rEv, const std::string& rX2) const
1105 const std::string& rX1, const std::string& rEv, const std::string& rX2) const
1151 FD_DG( "vGenerator::InjectAlphabet() " << rNewAlphabet. ToString());
1152 #ifdef FAUDES_CHECKED
1154 std::stringstream errstr;
1155 errstr << "symboltable mismatch aka not implemented" << std::endl;
1156 throw Exception( "vGenerator::InjectAlphabet", errstr.str(), 88);
1165 FD_DG( "vGenerator::RestrictAlphabet() " << rNewAlphabet. ToString());
1166 #ifdef FAUDES_CHECKED
1168 std::stringstream errstr;
1169 errstr << "symboltable mismatch aka not implemented" << std::endl;
1170 throw Exception( "vGenerator::RestrictAlphabet", errstr.str(), 88);
1179 FD_DG( "vGenerator(" << this << ")::InsEvent(" << index << ")");
1185 FD_DG( "vGenerator(" << this << ")::InsEvent(\"" << rName << "\")");
1196 FD_DG( "vGenerator(" << this << ")::DelEvent(" << index << ")");
1203 FD_DG( "vGenerator(" << this << ")::DelEvent(\"" << rName << "\")");
1211 FD_DG( "vGenerator(" << this << ")::DelEvents(\""
1213 EventSet::Iterator it;
1214 for (it = rEvents. Begin(); it != rEvents. End(); ++it) {
1221 FD_DG( "vGenerator(" << this << ")::DelEventFromAlphabet("
1228 FD_DG( "vGenerator(" << this << ")::InsState()");
1234 FD_DG( "vGenerator(" << this << ")::InsState(" << index << ")");
1240 FD_DG( "vGenerator(" << this << ")::InsState(\"" << rName << "\")");
1253 FD_DG( "vGenerator(" << this << ")::InjectState(\"" << SStr(index) << "\")");
1259 FD_DG( "vGenerator(" << this << ")::InjectStates(" << rNewStates. ToString() << ")");
1261 mpStates-> Name( "States");
1263 FD_DG( "vGenerator(" << this << ")::InjectStates(): report " << mpStates->ToString());
1268 FD_DG( "vGenerator(" << this << ")::InsInitState()");
1277 FD_DG( "vGenerator(" << this << ")::InsInitState(\"" << rName << "\")");
1299 FD_DG( "vGenerator(" << this << ")::InsMarkedState()");
1315 FD_DG( "vGenerator(" << this << ")::InsMarkedState(\"" << rName << "\")");
1331 FD_DG( "vGenerator(" << this << ")::DelState(" << index << ")");
1346 FD_DG( "vGenerator(" << this << ")::DelState(\"" << rName << "\")");
1349 #ifdef FAUDES_CHECKED
1351 std::stringstream errstr;
1352 errstr << "state name \"" << rName << "\" not found in generator \""
1354 throw Exception( "vGenerator::DelState(name)", errstr.str(), 90);
1362 FD_DG( "vGenerator(" << this << ")::DelStates("
1364 StateSet::Iterator cit;
1365 StateSet::Iterator cit_end;
1367 for (cit = rDelStates. Begin(); cit != rDelStates. End(); ++cit) {
1380 FD_DG( "vGenerator(" << this << ")::DelStateFromStates(" << index << ")");
1387 FD_DG( "vGenerator(" << this << ")::DelState(" << *pos << ")");
1393 FD_DG( "vGenerator(" << this << ")::RestrictStates("
1396 StateSet::Iterator cit;
1397 StateSet::Iterator cit_end;
1413 FD_DG( "vGenerator(" << this << ")::SetInitState(" << index << ")");
1414 #ifdef FAUDES_CHECKED
1416 std::stringstream errstr;
1417 errstr << "vGenerator::SetMarkedState: index " << index
1418 << " not in stateset";
1419 throw Exception( "vGenerator::SetInitState(..)", errstr.str(), 91);
1427 FD_DG( "vGenerator(" << this << ")::SetInitState(\"" << rName << "\")");
1429 #ifdef FAUDES_CHECKED
1431 std::stringstream errstr;
1432 errstr << "State name \"" << rName << "\" not known in Generator";
1433 throw Exception( "vGenerator::SetInitState(..)", errstr.str(), 90);
1441 FD_DG( "vGenerator(" << this << ")::InjectInitStates("
1442 << rNewInitStates. ToString() << ")");
1444 mInitStates. Name( "InitStates");
1449 FD_DG( "vGenerator(" << this << ")::ClrInitState(" << index << ")");
1450 #ifdef FAUDES_CHECKED
1452 std::stringstream errstr;
1453 errstr << "vGenerator::SetMarkedState: index " << index
1454 << " not in stateset";
1455 throw Exception( "vGenerator::ClrInitState(..)", errstr.str(), 91);
1463 FD_DG( "vGenerator(" << this << ")::ClrInitState(\"" << rName << "\")");
1465 #ifdef FAUDES_CHECKED
1467 std::stringstream errstr;
1468 errstr << "State name \"" << rName << "\" not known in Generator";
1469 throw Exception( "vGenerator::ClrInitState(..)", errstr.str(), 90);
1477 FD_DG( "vGenerator(" << this << ")::ClrInitState(" << *pos << ")");
1488 FD_DG( "vGenerator(" << this << ")::SetMarkedState(" << index << ")");
1489 #ifdef FAUDES_CHECKED
1491 std::stringstream errstr;
1492 errstr << "vGenerator::SetMarkedState: index " << index
1493 << " not in stateset";
1494 throw Exception( "vGenerator::SetMarkedState(..)", errstr.str(), 91);
1502 FD_DG( "vGenerator(" << this << ")::SetMarkedState(\"" << rName << "\")");
1504 #ifdef FAUDES_CHECKED
1506 std::stringstream errstr;
1507 errstr << "State name \"" << rName << "\" not known in Generator";
1508 throw Exception( "vGenerator::SetMarkedState(..)", errstr.str(), 90);
1516 FD_DG( "vGenerator(" << this << ")::InjectMarkedStates("
1517 << rNewMarkedStates. ToString() << ")");
1519 mMarkedStates. Name( "MarkedStates");
1524 FD_DG( "vGenerator(" << this << ")::ClrMarkedState(" << index << ")");
1525 #ifdef FAUDES_CHECKED
1527 std::stringstream errstr;
1528 errstr << "vGenerator::ClrMarkedState: index " << index
1529 << " not in stateset";
1530 throw Exception( "vGenerator::ClrMarkedState(..)", errstr.str(), 91);
1538 FD_DG( "vGenerator(" << this << ")::ClrMarkedState(\"" << rName << "\")");
1540 #ifdef FAUDES_CHECKED
1542 std::stringstream errstr;
1543 errstr << "State name \"" << rName << "\" not known in Generator";
1544 throw Exception( "vGenerator::ClrMarkedState(..)", errstr.str(), 90);
1552 FD_DG( "vGenerator(" << this << ")::ClrMarkedState(" << *pos << ")");
1563 FD_DG( "vGenerator::InjectTransition(" << TStr(rTrans) << ")");
1569 FD_DG( "vGenerator::InjectTransRel(...)");
1576 FD_DG( "vGenerator(" << this << ")::SetTransition(\""
1577 << rX1 << "\", \"" << rEv << "\", \"" << rX2 << "\")");
1580 #ifdef FAUDES_CHECKED
1582 FD_ERR( "vGenerator::SetTransition: state " << rX1
1583 << " not in stateset");
1584 std::stringstream errstr;
1585 errstr << "State name " << rX1 << " not found in Generator";
1586 throw Exception( "vGenerator::SetTransition(..)", errstr.str(), 90);
1589 FD_ERR( "vGenerator::SetTransition: event " << rEv << " not in alphabet");
1590 std::stringstream errstr;
1591 errstr << "Event name " << rEv << " not found in event domain of Generator";
1592 throw Exception( "vGenerator::SetTransition(..)", errstr.str(), 95);
1595 FD_ERR( "vGenerator::SetTransition: state " << rX2 << " not in stateset");
1596 std::stringstream errstr;
1597 errstr << "State name " << rX2 << " not found in Generator";
1598 throw Exception( "vGenerator::SetTransition(..)", errstr.str(), 90);
1612 FD_DG( "vGenerator(" << this << ")::SetTransition(" << rTransition. X1 << ","
1613 << rTransition. Ev << "," << rTransition. X2 << ")");
1614 #ifdef FAUDES_CHECKED
1616 std::stringstream errstr;
1617 errstr << "vGenerator::SetTransition: state " << SStr(rTransition. X1)
1618 << " not in stateset";
1619 throw Exception( "vGenerator::SetTransition(..)", errstr.str(), 95);
1622 std::stringstream errstr;
1623 errstr << "vGenerator::SetTransition: event " << EStr(rTransition. Ev)
1624 << " not in alphabet ";
1625 throw Exception( "vGenerator::SetTransition(..)", errstr.str(), 95);
1628 std::stringstream errstr;
1629 errstr << "vGenerator::SetTransition: state " << SStr(rTransition. X2)
1630 << " not in stateset";
1631 throw Exception( "vGenerator::SetTransition(..)", errstr.str(), 95);
1641 FD_DG( "vGenerator(" << this << ")::ClrTransition("
1642 << x1 << "," << ev << "," << x2 << ")");
1648 FD_DG( "vGenerator(" << this << ")::ClrTransition(" << TStr(rTransition) << ")");
1654 FD_DG( "vGenerator(" << this << ")::ClrTransition(" << TStr(*it)<< ")" );
1660 FD_DG( "vGenerator(" << this << ")::ClrTransition("
1661 << x1 << "," << ev << ")");
1667 FD_DG( "vGenerator(" << this << ")::ClrTransition("
1674 FD_DG( "vGenerator(" << this << ")::TransAttribute("
1675 << TStr(rTrans) << ",\"" << rAttr. ToString() << "\")");
1703 FD_DG( "vGenerator(" << this << ")::EventAttribute("
1711 FD_DG( "vGenerator(" << this << ")::EventAttributes("
1718 FD_DG( "vGenerator(" << this << ")::ClrEventAttribute(\"" << EStr(index) << "\")");
1724 FD_DG( "vGenerator(" << this << ")::StateAttribute("
1731 FD_DG( "vGenerator(" << this << ")::ClrStateAttribute(\"" << index << "\")");
1827 FD_DG( "vGenerator(" << this << ")::GlobalAttribute("
1832 std::stringstream errstr;
1833 errstr << "cannot cast global attribute " << rAttr. ToString() << " for generator " << Name();
1834 throw Exception( "vGenerator::GlobalAttribute", errstr.str(), 63);
1839 FD_DG( "vGenerator(" << this << ")::GlobalAttributeTry("
1846 FD_DG( "vGenerator(" << this << ")::GlobalAttribute()");
1852 FD_DG( "vGenerator(" << this << ")::GlobalAttributep()");
1883 const std::string& rX1, const std::string& rEv, const std::string& rX2) const {
1907 resultset. Insert(it->Ev);
1963 if(it==it_end) return 0;
1965 #ifdef FAUDES_CHECKED
1968 std::stringstream errstr;
1969 errstr << "successor state does not exist uniquely" << std::endl;
1970 throw Exception( "vGenerator::SuccessorState", errstr.str(), 92);
1980 std::stack<Idx> todo;
1981 StateSet::Iterator sit;
1989 while(!todo.empty()) {
1994 if(accessibleset. Exists(x1)) continue;
1996 accessibleset. Insert(x1);
2000 for(; tit != tit_end; ++tit)
2005 accessibleset. Name( "AccessibleSet");
2006 return accessibleset;
2016 FD_DF( "vGenerator::accessible: generator is accessible");
2019 FD_DF( "vGenerator::accessible: generator is accessible but empty");
2026 FD_DF( "vGenerator::accessible: generator is accessible");
2029 FD_DF( "vGenerator::accessible: generator is not accessible");
2039 StateSet::Iterator sit;
2040 std::stack<Idx> todo;
2048 while(!todo.empty()) {
2053 if(coaccessibleset. Exists(x2)) continue;
2055 coaccessibleset. Insert(x2);
2059 for(; tit != tit_end; ++tit)
2064 coaccessibleset. Name( "CoaccessibleSet");
2065 return coaccessibleset;
2075 FD_DF( "vGenerator::coaccessible: generator is coaccessible");
2078 FD_DF( "vGenerator::coaccessible: generator is not coaccessible");
2085 FD_DF( "vGenerator::coaccessible: generator is coaccessible");
2088 FD_DF( "vGenerator::coaccessible: generator is not coaccessible");
2094 FD_DF( "vGenerator::trimset: trim states: "
2097 res. Name( "TrimSet");
2108 if(accessiblebool && coaccessiblebool) {
2109 FD_DF( "vGenerator::Trim(): generator is nontrivial");
2112 FD_DF( "vGenerator::Trim(): generator is trivial");
2122 FD_DF( "vGenerator::IsTrim(): result " << res);
2129 FD_DF( "vGenerator::BlockingSet: blocking states: "
2141 StateSet::Iterator sit=rStates. Begin();
2142 StateSet::Iterator sit_end=rStates. End();
2143 for(;sit!=sit_end;sit++){
2146 if(tit==tit_end) break;
2149 return sit==sit_end;
2157 std::stack<Idx> todo;
2160 while(tit!=tit_end){
2161 if(!rSigmaO. Exists(tit->Ev)) { ++tit; continue; }
2170 while(!todo.empty()) {
2175 if(good. Exists(x2)) continue;
2181 for(; tit != tit_end; ++tit)
2182 if(tit->X1 != x2) todo.push(tit->X1);
2184 FD_DG( "IsComplete(" << Name() << "): done");
2204 StateSet::Iterator sit_end = States(). End();
2206 for(; sit!=sit_end; ++sit) {
2207 if(termset. Exists(*sit)) continue;
2210 for (; tit != tit_end; ++tit) {
2211 if(!termset. Exists(tit->X2)) break;
2242 while(tit!=tit_end) {
2243 if(!rSigmaO. Exists(tit->Ev)) { ++tit; continue; }
2244 if(!domain. Exists(tit->X2)) { ++tit; continue; }
2251 StateSet::Iterator sit;
2252 std::stack<Idx> todo;
2253 for(sit = target. Begin(); sit != target. End(); ++sit)
2255 while(!todo.empty()) {
2260 if(good. Exists(x2)) continue;
2266 for(; tit != tit_end; ++tit)
2267 if(tit->X1 != x2) todo.push(tit->X1);
2271 if(domain <= good) break;
2274 domain = domain * good;
2289 FD_DG( "Generator::TerminalStates(" << Name() << ")");
2295 StateSet::Iterator sit=rStates. Begin();
2296 StateSet::Iterator sit_end=rStates. End();
2297 for(;sit!=sit_end;sit++){
2300 if(tit==tit_end) res. Insert(*sit);
2303 res. Name( "TerminalStates");
2340 FD_DF( "vGenerator::IsOmegaTrim(): result " << res);
2350 FD_DG( "vGenerator::IsDeterministic: more than one initial state");
2358 if ((it1->X1 == it2->X1) && (it1->Ev == it2->Ev)) {
2359 FD_DG( "IsDeterministic(): at least one state "
2360 << "contains more than on transition with same event: "
2404 std::string label=rLabel;
2405 if(label== "") label= "Generator";
2406 FD_DG( "vGenerator(" << this << ")::DoWrite(): section " << label);
2435 std::string label=rLabel;
2436 if(label== "") label= "Generator";
2437 FD_DG( "vGenerator(" << this << ")::DoDWrite(): section " << label);
2465 std::string label=rLabel;
2467 if(label== "") label= "Generator";
2474 FD_DG( "vGenerator(" << this << ")::DoXWrite(..): section " << btag. StringValue() << " #" << Size());
2546 std::map<Idx,Idx> reversemap;
2547 std::map<Idx,Idx>::const_iterator minit;
2548 StateSet::Iterator sit;
2552 for(minit = reversemap.begin(); minit != reversemap.end(); ++minit) {
2554 std::map<Idx,Idx>::const_iterator conit=minit;
2555 Idx start = conit->first;
2557 for(; conit != reversemap.end(); ++conit) {
2558 if( StateName(conit->second) != "") break;
2560 if(conit->first != start+anoncount) break;
2567 rTw << start+anoncount-1;
2572 if(minit == reversemap.end()) break;
2574 std::string statename = StateName(minit->second);
2575 if (statename != "") rTw << statename;
2576 else rTw << minit->first;
2587 StateSet::Iterator sit;
2590 StateSet::Iterator conit=sit;
2596 if(*conit != start+anoncount) break;
2603 rTw << start+anoncount-1;
2610 std::string statename = StateName(*sit);
2611 if((statename != "") && symexpl) {
2613 } else if(statename != "") {
2638 std::map<Idx,Idx> reversemap;
2639 std::map<Idx,Idx>::const_iterator minit;
2640 StateSet::Iterator sit;
2641 for (sit = rStateSet. Begin(); sit != rStateSet. End(); ++sit)
2644 for(minit = reversemap.begin(); minit != reversemap.end(); ++minit) {
2646 std::map<Idx,Idx>::const_iterator conit=minit;
2647 Idx start = conit->first;
2649 for(; conit != reversemap.end(); ++conit) {
2650 if( StateName(conit->second) != "") break;
2652 if(conit->first != start+anoncount) break;
2659 rTw << start+anoncount-1;
2664 if(minit == reversemap.end()) break;
2666 std::string statename = StateName(minit->second);
2667 if (statename != "") rTw << statename;
2668 else rTw << minit->first;
2678 StateSet::Iterator sit;
2679 for(sit = rStateSet. Begin(); sit != rStateSet. End(); ++sit) {
2681 StateSet::Iterator conit=sit;
2684 for(; conit != rStateSet. End(); ++conit) {
2687 if(*conit != start+anoncount) break;
2694 rTw << start+anoncount-1;
2699 if(sit == rStateSet. End()) break;
2701 std::string statename = StateName(*sit);
2702 if (statename != "") rTw << statename;
2717 StateSet::Iterator sit;
2718 for(sit = rStateSet. Begin(); sit != rStateSet. End(); ++sit) {
2730 std::string label=rLabel;
2731 if(label== "") label=rStateSet. Name();
2732 if(label== "") label= "StateSet";
2737 std::map<Idx,Idx> reversemap;
2738 std::map<Idx,Idx>::const_iterator minit;
2739 StateSet::Iterator sit;
2740 for (sit = rStateSet. Begin(); sit != rStateSet. End(); ++sit) {
2744 for(minit = reversemap.begin(); minit != reversemap.end(); ++minit) {
2746 std::map<Idx,Idx>::const_iterator conit=minit;
2747 Idx start = conit->first;
2749 for(; conit != reversemap.end(); ++conit) {
2750 if( StateName(conit->second) != "") break;
2754 if(conit->first != start+anoncount) break;
2767 if(minit == reversemap.end() )
2771 std::string statename = StateName(minit->second);
2772 Idx index=minit->first;
2837 int oldcolumns = rTw. Columns();
2847 if (smalltransrel) {
2848 std::string x1name = StateName(tit->X1);
2863 if (smalltransrel) {
2864 std::string x2name = StateName(tit->X2);
2885 int oldcolumns = rTw. Columns();
2891 std::ostringstream ox1;
2895 ox1 << x1name << "[" << x1 << "]";
2901 std::ostringstream oev;
2904 oev << evname << "[" << ev << "]";
2907 std::ostringstream ox2;
2911 ox2 << x2name << "[" << x2 << "]";
2959 rTw. WriteEnd( "TransitionRelation");
2980 FD_DG( "vGenerator(" << this << ")::DotWrite(" << rFileName << ")");
2982 StateSet::Iterator lit;
2985 std::ofstream stream;
2986 stream.exceptions(std::ios::badbit|std::ios::failbit);
2987 stream.open(rFileName.c_str());
2988 stream << "// dot output generated by libFAUDES vGenerator" << std::endl;
2989 stream << "digraph \"" << Name() << "\" {" << std::endl;
2990 stream << " rankdir=LR" << std::endl;
2991 stream << " node [shape=circle];" << std::endl;
2992 stream << std::endl;
2993 stream << " // initial states" << std::endl;
2998 stream << " dot_dummyinit_" << i << " [shape=none, label=\"\", width=\"0.0\", height=\"0.0\" ];" << std::endl;
2999 stream << " dot_dummyinit_" << i << " -> \"" << xname << "\";" << std::endl;
3002 stream << std::endl;
3003 stream << " // mstates" << std::endl;
3007 stream << " \"" << xname << "\" [shape=doublecircle];" << std::endl;
3009 stream << std::endl;
3010 stream << " // rest of stateset" << std::endl;
3015 stream << " \"" << xname << "\";" << std::endl;
3018 stream << std::endl;
3019 stream << " // transition relation" << std::endl;
3025 stream << " \"" << x1name << "\" -> \"" << x2name
3026 << "\" [label=\"" << EventName(tit->Ev) << "\"];" << std::endl;
3028 stream << "};" << std::endl;
3031 catch (std::ios::failure&) {
3033 "Exception opening/writing dotfile \""+rFileName+ "\"", 2);
3040 FD_DG( "vGenerator(" << this << ")::DDotWrite(" << rFileName << ")");
3041 StateSet::Iterator lit;
3044 std::ofstream stream;
3045 stream.exceptions(std::ios::badbit|std::ios::failbit);
3046 stream.open(rFileName.c_str());
3047 stream << "digraph \"" << Name() << "\" {" << std::endl;
3048 stream << " rankdir=LR" << std::endl;
3049 stream << " node [shape=circle];" << std::endl;
3050 stream << std::endl;
3051 stream << " // istates" << std::endl;
3054 stream << " dot_dummyinit_" << i << " [shape=none, label=\"\" ];" << std::endl;
3055 stream << " dot_dummyinit_" << i << " -> \""
3056 << SStr(*lit) << "\";" << std::endl;
3059 stream << std::endl;
3060 stream << " // mstates" << std::endl;
3062 stream << " \"" << SStr(*lit) << "\" [shape=doublecircle];" << std::endl;
3064 stream << std::endl;
3065 stream << " // rest of stateset" << std::endl;
3069 stream << " \"" << SStr(*lit) << "\";" << std::endl;
3072 stream << std::endl;
3073 stream << " // transition relation" << std::endl;
3075 stream << " \"" << SStr(tit->X1)
3076 << "\" -> \"" << SStr(tit->X2)
3077 << "\" [label=\"" << EventName(tit->Ev) << "\"];" << std::endl;
3079 stream << "};" << std::endl;
3082 catch (std::ios::failure&) {
3084 "Exception opening/writing dotfile \""+rFileName+ "\"", 2);
3091 FD_DG( "vGenerator(" << this << ")::XDotWrite(" << rFileName << ")");
3092 StateSet::Iterator lit;
3095 std::ofstream stream;
3096 stream.exceptions(std::ios::badbit|std::ios::failbit);
3097 stream.open(rFileName.c_str());
3098 stream << "digraph \"___" << Name() << "___\" {" << std::endl;
3099 stream << " rankdir=LR" << std::endl;
3100 stream << " node [shape=circle];" << std::endl;
3101 stream << std::endl;
3102 stream << " // stateset" << std::endl;
3104 stream << " \"s" << *lit << "\";" << std::endl;
3107 stream << " \"s" << *lit << "\";" << std::endl;
3112 stream << " \"s" << *lit << "\";" << std::endl;
3114 stream << std::endl;
3115 stream << " // transition relation" << std::endl;
3117 stream << " \"s" << tit->X1
3118 << "\" -> \"s" << tit->X2
3119 << "\" [label=\"e" << tit->Ev << "\" " << "polyline" << "];" << std::endl;
3121 stream << "};" << std::endl;
3124 catch (std::ios::failure&) {
3125 throw Exception( "vGenerator::XDotWrite",
3126 "Exception opening/writing dotfile \""+rFileName+ "\"", 2);
3133 std::string label=rLabel;
3134 if(label== "") label= "Generator";
3135 FD_DG( "vGenerator(" << this << ")::DoRead(): file " << rTr. FileName() << " section " << label);
3144 std::string name= "generator";
3157 if(token. IsBegin( "InitStates"))
3163 if(token. IsBegin( "MarkedStates"))
3173 std::string name= "generator";
3192 FD_DG( "vGenerator(" << this << ")::DoRead(): done");
3197 FD_DG( "vGenerator(" << this << ")::ReadAlphabet(\""
3201 if(token.IsBegin( "Alphabet"))
3203 if(token.IsBegin( "A"))
3209 FD_DG( "vGenerator(" << this << ")::ReadStates(\"" << rTr. FileName() << "\")");
3212 std::string label= "";
3214 if(token.IsBegin( "States")) label=token.StringValue();
3215 if(token.IsBegin( "S")) label=token.StringValue();
3216 if(label== "") return;
3218 FD_DG( "vGenerator(" << this << ")::ReadStates(..): attribute type " << typeid(*attrp).name());
3229 while(!rTr. Eos(label)) {
3233 if(token.IsInteger()) {
3235 Idx index = token.IntegerValue();
3236 FD_DG( "vGenerator(" << this << ")::ReadStates(\"" << rTr. FileName() << "\"): by index " << index);
3239 std::stringstream errstr;
3240 errstr << "Token " << token.IntegerValue() << " appears twice in stateset"
3242 throw Exception( "vGenerator::ReadStates", errstr.str(), 80);
3245 attrp-> Read(rTr, "", this);
3255 if(token.IsString()) {
3257 FD_DG( "vGenerator(" << this << ")::ReadStates(\"" << rTr. FileName() << "\"): by name " << token.StringValue());
3259 std::string statename=token.StringValue();
3261 std::size_t pos= statename.find_first_of( '#');
3262 if(pos==std::string::npos) symimpl= true;
3263 if(pos!=std::string::npos) symexpl= true;
3264 if(pos!=std::string::npos && pos < statename.size()-1) {
3265 std::string suffix=statename.substr(pos+1);
3266 index= ToIdx(suffix);
3267 statename=statename.substr(0,pos);
3268 FD_DG( "vGenerator(" << this << ")::ReadStates(\"" << rTr. FileName() << "\"): extracted suffix from " << token.StringValue() << ": " << statename << " idx " << index);
3273 std::stringstream errstr;
3274 errstr << "State " << statename << "(idx " << index << ") appears twice in stateset"
3276 throw Exception( "vGenerator::ReadStates", errstr.str(), 80);
3279 attrp-> Read(rTr, "", this);
3290 if(token.IsBegin( "Consecutive")) {
3292 Token token1,token2;
3295 FD_DG( "vGenerator(" << this << ")::ReadStates(\"" << rTr. FileName() << "\"): consecutive range");
3298 std::stringstream errstr;
3299 errstr << "Invalid range of consecutive states" << rTr. FileLine();
3300 throw Exception( "vGenerator::ReadStates", errstr.str(), 80);
3305 std::stringstream errstr;
3306 errstr << "Index " << index << " appears twice in stateset"
3308 throw Exception( "vGenerator::ReadStates", errstr.str(), 80);
3318 std::stringstream errstr;
3319 errstr << "Invalid token" << rTr. FileLine();
3320 throw Exception( "vGenerator::ReadStates", errstr.str(), 80);
3324 if(symimpl && symexpl) {
3326 std::stringstream errstr;
3327 errstr << "StateSet with inconsitent explicit symboltable" << rTr. FileLine();
3328 throw Exception( "vGenerator::ReadStates", errstr.str(), 80);
3332 FD_DG( "vGenerator(" << this << ")::ReadStates(\"" << rTr. FileName() << "\"): done");
3338 FD_DG( "vGenerator(" << this << ")::ReadStateSet(\"" << rLabel<< "\")");
3342 FD_DG( "vGenerator(" << this << ")::ReadStateSet(..): attribute type " << typeid(*attrp).name());
3346 rStateSet. Name(rLabel);
3348 while(!rTr. Eos(rLabel)) {
3357 std::stringstream errstr;
3358 errstr << "Token " << token. IntegerValue() << " not in stateset"
3360 throw Exception( "vGenerator::ReadStateSet", errstr.str(), 80);
3363 attrp-> Read(rTr, "", this);
3376 std::size_t pos= statename.find_first_of( '#');
3377 if(pos!=std::string::npos) {
3379 std::stringstream errstr;
3380 errstr << "invalid symbolic name: " << token. StringValue()
3381 << " (no suffix allowed in external state sets)" << rTr. FileLine();
3382 throw Exception( "vGenerator::ReadStateSet", errstr.str(), 80);
3387 std::stringstream errstr;
3388 errstr << "Symbolic name " << token. StringValue() << " not in stateset"
3390 throw Exception( "vGenerator::ReadStateSet", errstr.str(), 80);
3393 attrp-> Read(rTr, "", this);
3404 Token token1,token2;
3409 std::stringstream errstr;
3410 errstr << "Invalid range of consecutive states" << rTr. FileLine();
3411 throw Exception( "vGenerator::ReadStateSet", errstr.str(), 80);
3415 std::stringstream errstr;
3416 errstr << "Token " << token. IntegerValue() << " not in stateset"
3418 throw Exception( "vGenerator::ReadStateSet", errstr.str(), 80);
3427 std::stringstream errstr;
3428 errstr << "Invalid token" << rTr. FileLine();
3429 throw Exception( "vGenerator::ReadStateSet", errstr.str(), 50);
3438 FD_DG( "vGenerator(" << this << ")::XReadStateSet(\"" << rLabel<< "\")");
3440 FD_DG( "vGenerator(" << this << ")::ReadStateSet(..): attribute type " << typeid(*attrp).name());
3444 std::string label=rLabel;
3445 if(label== "") label=rStateSet. Name();
3446 if(label== "") label= "StateSet";
3455 while(!rTr. Eos(label)) {
3459 if(sttag. IsBegin( "Consecutive")) {
3468 if(idx1==0 || idx2 < idx1) {
3470 std::stringstream errstr;
3471 errstr << "Invalid range of consecutive states" << rTr. FileLine();
3472 throw Exception( "vGenerator::XReadStates", errstr.str(), 80);
3474 FD_DG( "vGenerator(" << this << ")::XReadStates(\"" << rTr. FileName() << "\"): consecutive range " << idx1 << " to " << idx2);
3475 for( Idx index = idx1; index <= idx2; ++index) {
3476 if(rStateSet. Exists(index)) {
3478 std::stringstream errstr;
3479 errstr << "Doublet state index " << index << " " << rTr. FileLine();
3480 throw Exception( "vGenerator::XReadStates", errstr.str(), 80);
3495 std::string name= "";
3501 FD_DG( "vGenerator::XReadStateSet(): got idx " << index << " " << name);
3509 std::stringstream errstr;
3510 errstr << "Cannot figure index for state token " << sttag. Str() << rTr. FileLine();
3511 throw Exception( "vGenerator::XReadStateSet", errstr.str(), 80);
3514 if(rStateSet. Exists(index)) {
3516 std::stringstream errstr;
3517 errstr << "Doublet state from token " << sttag. Str() << rTr. FileLine();
3518 throw Exception( "vGenerator::XReadStateSet", errstr.str(), 80);
3528 while(!rTr. Eos( "State")) {
3552 FD_DG( "vGenerator(" << this << ")::XReadStates(\"" << rTr. FileName() << "\"): attribute ?");
3553 attrp-> Read(rTr, "", this);
3564 FD_DG( "vGenerator(" << this << ")::XReadStates(\"" << rTr. FileName() << "\"): done");
3571 FD_DG( "vGenerator(" << this << ")::ReadTransRel(\"" << rTr. FileName() << "\")");
3573 FD_DG( "vGenerator(" << this << ")::ReadTransRel(..): attribute type " << typeid(*attrp).name());
3576 std::string label= "";
3579 if(token. IsBegin( "TransRel")) label= "TransRel";
3580 if(token. IsBegin( "T")) label= "T";
3582 std::stringstream errstr;
3583 errstr << "Reading TransRel failed in " << rTr. FileLine() << ": no valid begin token";
3584 throw Exception( "vGenerator::ReadTransRel", errstr.str(), 50);
3595 while(!rTr. Eos(label)) {
3603 Idx x1 = 0, ev = 0, x2 = 0;
3607 if(x1t.IsInteger()) {
3610 } else if(x1t.IsString()) {
3612 if(x1==0 && isn) { x1= InsState(x1t.StringValue()); isx= false; };
3617 if(evt.IsString()) {
3625 if(x2t.IsInteger()) {
3628 } else if(x2t.IsString()) {
3630 if(x2==0 && isn) { x2= InsState(x2t.StringValue()); isx= false; };
3634 attrp->Read(rTr, "", this);
3641 std::stringstream errstr;
3642 errstr << "invalid state x1 " << x1t.StringValue() << " " << rTr. FileLine();
3643 throw Exception( "vGenerator::ReadTransRel", errstr.str(), 85);
3646 std::stringstream errstr;
3647 errstr << "invalid state x2 " << x2t.StringValue() << " " << rTr. FileLine();
3648 throw Exception( "vGenerator::ReadTransRel", errstr.str(), 85);
3651 std::stringstream errstr;
3652 errstr << "invalid event " << evt.StringValue() << " " << rTr. FileLine();
3653 throw Exception( "vGenerator::ReadTransRel", errstr.str(), 85);
3666 std::stringstream errstr;
3667 errstr << "Reading TransRel failed in " << rTr. FileLine() << oex. What();
3668 throw Exception( "vGenerator::ReadTransRel", errstr.str(), 50);
3675 FD_DG( "vGenerator(" << this << ")::ReadTransRel(\"" << rTr. FileName() << "\"): done");
3684 FD_DG( "vGenerator(" << this << ")::XReadTransRel()");
3686 FD_DG( "vGenerator(" << this << ")::ReadTransRel(..): attribute type " << typeid(*attrp).name());
3692 rTr. ReadBegin( "TransitionRelation",btag);
3694 while(!rTr. Eos( "TransitionRelation")) {
3698 if(!trtag. IsBegin( "Transition")) {
3727 if(x1==0 || x2==0 || ev==0) {
3729 std::stringstream errstr;
3730 errstr << "Invalid transition at token " << trtag. Str() << rTr. FileLine();
3731 throw Exception( "vGenerator::XReadTransRel", errstr.str(), 80);
3736 std::stringstream errstr;
3737 errstr << "Doublet transition at token " << trtag. Str() << rTr. FileLine();
3738 throw Exception( "vGenerator::XReadTransRel", errstr.str(), 80);
3743 std::stringstream errstr;
3744 errstr << "Invalid state x1 " << x1 << " " << rTr. FileLine();
3745 throw Exception( "vGenerator::XReadTransRel", errstr.str(), 80);
3749 std::stringstream errstr;
3750 errstr << "Invalid state x2 " << x2 << " " << rTr. FileLine();
3751 throw Exception( "vGenerator::XReadTransRel", errstr.str(), 80);
3755 std::stringstream errstr;
3756 errstr << "Invalid event " << evname << " " << rTr. FileLine();
3757 throw Exception( "vGenerator::XReadTransRel", errstr.str(), 80);
3764 if(!token. IsEnd( "Transition")) {
3766 attrp-> Read(rTr, "", this);
3772 rTr. ReadEnd( "TransitionRelation");
3775 FD_DG( "vGenerator(" << this << ")::XReadTransRel(\"" << rTr. FileName() << "\"): done");
3799 const std::string& rDotExec) const {
3800 FD_DG( "vGenerator::GraphWrite(...): " << typeid(*this).name());
3804 std::stringstream errstr;
3805 errstr << "Exception opening temp file";
3806 throw Exception( "vGenerator::GraphWrite", errstr.str(), 2);
3813 std::stringstream errstr;
3814 errstr << "Exception writing dot input file";
3815 throw Exception( "vGenerator::GraphWrite", errstr.str(), 2);
3822 std::stringstream errstr;
3823 errstr << "Exception processing dot file";
3824 throw Exception( "vGenerator::GraphWrite", errstr.str(), 3);
3956 if(rGenVec. Size()==0) return;
3958 rRes. Assign(rGenVec. At(0).Alphabet());
3970 if(rGenVec. Size()==0) return;
3972 rRes. Assign(rGenVec. At(0).Alphabet());
3975 SetUnion(rGenVec. At(i).Alphabet(),rRes,rRes);
libFAUDES 2.24g
--- 2014.09.15
--- c++ api documentaion by doxygen
|