28 const std::map<Idx,StateSet>& rEntryStatesMap,
const TransSetX2EvX1& rLowRevTransRel,
33 LowExitStates(rHighAlph, rEntryStatesMap, rLowRevTransRel, highState, lo_exitstates);
42 FD_DF(
"LowExitStates: computing low level exit states for high level"
43 <<
" state " << rLowExitStates.
Str(highState));
45 std::map<Idx,StateSet>::const_iterator esmap_it;
46 StateSet::Iterator lit;
50 esmap_it = rEntryStatesMap.find(highState);
52 if (esmap_it == rEntryStatesMap.end()) {
53 std::stringstream errstr;
54 errstr <<
"Hi level state " << rHighAlph.
Str(highState)
55 <<
" not found in entry states map";
56 throw Exception(
"LowExitStates", errstr.str(), 502);
60 for (lit = esmap_it->second.Begin(); lit != esmap_it->second.End(); ++lit) {
61 FD_DF(
"LowExitStates: current low level entry state "
62 << rLowExitStates.
Str(*lit));
64 rtit_end = rLowRevTransRel.
EndByX2(*lit);
65 for (; rtit != rtit_end; ++rtit) {
66 if (rHighAlph.
Exists(rtit->Ev)) {
67 FD_DF(
"LowExitStates: found low level exit state "
68 << rLowExitStates.
Str(rtit->X1));
69 rLowExitStates.
Insert(rtit->X1);
83 return reachable_events;
100 rReachableEvents.
Clear();
105 while (! todo.empty()) {
106 const Idx current = todo.top();
110 for (; tit != tit_end; ++tit) {
111 if (rHighAlph.
Exists(tit->Ev)) {
112 rReachableEvents.
Insert(tit->Ev);
114 if (rReachableEvents.
Size() == rHighAlph.
Size()) {
119 else if (! done.
Exists(tit->X2)) {
136 std::stack<Idx> todo;
140 rCoaccessibleReach.
Insert(lowState);
141 while (! todo.empty()) {
142 const Idx current = todo.top();
145 tit_end = rRevTransRel.
EndByX2(current);
146 for (; tit != tit_end; ++tit) {
148 if (rHighAlph.
Exists(tit->Ev)) {
152 else if (! rCoaccessibleReach.
Exists(tit->X1)) {
154 rCoaccessibleReach.
Insert(tit->X1);
168 std::stack<Idx> todo;
172 rAccessibleReach.
Insert(lowState);
173 while (! todo.empty()) {
174 const Idx current = todo.top();
178 for (; tit != tit_end; ++tit) {
180 if (rHighAlph.
Exists(tit->Ev)) {
184 if (! rAccessibleReach.
Exists(tit->X2)) {
186 rAccessibleReach.
Insert(tit->X2);
std::string Str(const Idx &rIndex) const
bool Exists(const Idx &rIndex) const
std::string Str(const Idx &rIndex) const
bool Insert(const Idx &rIndex)
Iterator BeginByX2(Idx x2) const
Iterator EndByX2(Idx x2) const
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
TransSet::Iterator TransRelBegin(void) const
EventSet NewEventSet(void) const
TransSet::Iterator TransRelEnd(void) const
bool Exists(const T &rElem) const
EventSet ReachableEvents(const Generator &rLowGen, const EventSet &rHighAlph, Idx lowState)
StateSet LowExitStates(const Generator &rLowGen, const EventSet &rHighAlph, const std::map< Idx, StateSet > &rEntryStatesMap, const TransSetX2EvX1 &rLowRevTransRel, Idx highState)
void LocalCoaccessibleReach(const TransSetX2EvX1 &rRevTransRel, const EventSet &rHighAlph, Idx lowState, StateSet &rCoaccessibleReach)
void LocalAccessibleReach(const Generator &rLowGen, const EventSet &rHighAlph, Idx lowState, StateSet &rAccessibleReach)