11 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__TRIMMING__HH 12 #define __DIADES__AUTOMATA__EXPERIMENTAL__TRIMMING__HH 14 #include<unordered_map> 15 #include<unordered_set> 24 namespace Experimental {
42 template<
typename Fsm,
typename BeliefStateIterator,
typename StateIdInsertIterator>
47 StateIdInsertIterator insertIt)
52 list<State> visitingStates;
53 StateMap visited(machine.behaviour());
54 std::for_each(bfBegin,bfEnd,
57 visitingStates.push_back(s);
59 while(!visitingStates.empty())
61 std::for_each(machine.inputTransitionBegin(visitingStates.front()),
62 machine.inputTransitionEnd(visitingStates.front()),
64 if(visited[t.source()]==0)
66 visitingStates.push_back(t.source());
67 visited[t.source()]=1;
70 visitingStates.pop_front();
72 deleteState(machine,machine.stateBegin(), machine.stateEnd(),[&](
State s){
return visited[s]==0; }, insertIt);
91 template<
typename Fsm,
typename BeliefStateIterator,
typename StateIdInsertIterator>
96 StateIdInsertIterator insertIt)
101 list<State> visitingStates;
102 StateMap visited(machine.behaviour());
103 std::for_each(bfBegin,bfEnd,
106 visitingStates.push_back(s);
108 while(!visitingStates.empty())
110 std::for_each(machine.outputTransitionBegin(visitingStates.front()),
111 machine.outputTransitionEnd(visitingStates.front()),
113 if(visited[t.target()]==0)
115 visitingStates.push_back(t.target());
116 visited[t.target()]=1;
119 visitingStates.pop_front();
121 deleteState(machine,machine.stateBegin(), machine.stateEnd(),[&](
State s){
return visited[s]==0; }, insertIt);
138 template<
typename Fsm,
typename StateIdInsertIterator>
141 StateIdInsertIterator insertIt)
162 template<
typename Fsm,
typename BeliefStateIterator,
typename StateIdInsertIterator>
167 StateIdInsertIterator insertIt)
172 std::list<State> visitingStates;
173 StateMap visited(machine.behaviour());
174 std::for_each(bfBegin, bfEnd, [&](
State s) {
if(s.outDeg()==0) { visitingStates.push_back(s); } });
175 auto toConfirmIt = visitingStates.end();
176 while(visitingStates.begin() != toConfirmIt)
178 if(visitingStates.front().outDeg() == 0)
180 if(visitingStates.front().inDeg() != 0)
182 std::for_each(machine.inputTransitionBegin(visitingStates.front()),
183 machine.inputTransitionEnd(visitingStates.front()),
184 [&](
Transition t){ visitingStates.push_back(t.source()); });
185 toConfirmIt = visitingStates.end();
187 *(insertIt++)=machine.getStatePropertyId(visitingStates.front());
188 machine.deleteState(visitingStates.front());
192 if(toConfirmIt == visitingStates.end())
194 toConfirmIt = visitingStates.insert(visitingStates.end(),
195 visitingStates.front());
199 visitingStates.insert(visitingStates.end(),
200 visitingStates.front());
203 visitingStates.pop_front();
205 return machine.initialStateBegin() != machine.initialStateEnd();
222 template<
typename Fsm,
typename StateIdInsertIterator>
225 StateIdInsertIterator insertIt)
257 template<
typename Fsm,
typename BeliefStateIterator,
typename StateIdInsertIterator,
typename DisableInsertIterator>
262 StateIdInsertIterator insertIt,
263 DisableInsertIterator disableIt)
265 using Event =
typename Fsm::EventPropertyId;
269 std::list<State> visitingStates;
270 std::unordered_map<State,std::list<Event>> disabled;
271 StateMap visited(machine.behaviour(),machine.numberOfStates(),0);
272 std::for_each(bfBegin, bfEnd, [&](
State s) {
if(s.outDeg()==0) { visited[s]=1; visitingStates.push_back(s); } });
273 while(!visitingStates.empty())
275 std::for_each(machine.inputTransitionBegin(visitingStates.front()),
276 machine.inputTransitionEnd(visitingStates.front()),
278 if(pattern.
enabled(machine.getEvent(t)))
280 if(visited[t.source()]==0)
282 visitingStates.push_back(t.source());
283 visited[t.source()]=1;
288 disabled[t.source()].push_back(machine.getEvent(t));
291 if((t.source().outDeg() == 1) && (visited[t.source()]==0))
293 visitingStates.push_back(t.source());
294 visited[t.source()]=1;
298 *(insertIt++)=machine.getStatePropertyId(visitingStates.front());
299 disabled.erase(visitingStates.front());
300 machine.deleteState(visitingStates.front());
301 visitingStates.pop_front();
303 for(
const auto & disab : disabled)
305 for(
const auto & event : disab.second)
307 *(disableIt++)= std::make_pair(machine.getStatePropertyId(disab.first),event);
310 return machine.initialStateBegin() != machine.initialStateEnd();
void trimmingTraces(Fsm &machine, BeliefStateIterator bfBegin, BeliefStateIterator bfEnd, StateIdInsertIterator insertIt)
Trim the traces of the Fsm that does not reach the given BeliefState.
Diades::Graph::Edge Transition
bool trimmingDeadlockStates(Fsm &machine, BeliefStateIterator bfBegin, BeliefStateIterator bfEnd, StateIdInsertIterator insertIt)
Trim the states are the source of a deadlock within a range of states.
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
Diades::Graph::GraphNodeSet::Iterator BeliefStateIterator
void trimmingUnreachableStates(Fsm &machine, BeliefStateIterator bfBegin, BeliefStateIterator bfEnd, StateIdInsertIterator insertIt)
Trim the states that cannot be reached from the given BeliefState.
void deleteState(StateMachine< StatePropertyId, EventPropertyId, NullStateProperty, NullEventProperty > &m, InputIterator first, InputIterator last)
A control pattern is a mapping between the set of Events of a StateMachine and a Boolean.
AutFsm::Transition Transition
bool controlledTrimmingDeadlockState(Fsm &machine, ControlPattern< Fsm > &pattern, BeliefStateIterator bfBegin, BeliefStateIterator bfEnd, StateIdInsertIterator insertIt, DisableInsertIterator disableIt)
remove deadlock states of the machine by exploiting the events that are disabled in the current Contr...
This file implements the control patterns of Ramadge and Wonham.
Namespace of the Diades project.
bool enabled(const Event &e) const
Check whether the event is currently enabled.
Diades::Graph::Node State