DiaDes  0.1
DIAgnosis of Discrete-Event System
Trimming.hh
Go to the documentation of this file.
1 
11 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__TRIMMING__HH
12 #define __DIADES__AUTOMATA__EXPERIMENTAL__TRIMMING__HH
13 
14 #include<unordered_map>
15 #include<unordered_set>
16 #include<list>
17 #include<stack>
21 
22 namespace Diades {
23  namespace Automata {
24  namespace Experimental {
25 
26 
42  template<typename Fsm, typename BeliefStateIterator, typename StateIdInsertIterator>
43  void
44  trimmingTraces(Fsm & machine,
45  BeliefStateIterator bfBegin,
46  BeliefStateIterator bfEnd,
47  StateIdInsertIterator insertIt)
48  {
49  using State = typename Fsm::State;
50  using Transition = typename Fsm::Transition;
51  using StateMap = Diades::Graph::NodeMap<char>;
52  list<State> visitingStates;
53  StateMap visited(machine.behaviour());
54  std::for_each(bfBegin,bfEnd,
55  [&](State s){
56  visited[s]=1;
57  visitingStates.push_back(s);
58  });
59  while(!visitingStates.empty())
60  {
61  std::for_each(machine.inputTransitionBegin(visitingStates.front()),
62  machine.inputTransitionEnd(visitingStates.front()),
63  [&](Transition t){
64  if(visited[t.source()]==0)
65  {
66  visitingStates.push_back(t.source());
67  visited[t.source()]=1;
68  }
69  });
70  visitingStates.pop_front();
71  }
72  deleteState(machine,machine.stateBegin(), machine.stateEnd(),[&](State s){ return visited[s]==0; }, insertIt);
73  }
74 
75 
76 
91  template<typename Fsm, typename BeliefStateIterator, typename StateIdInsertIterator>
92  void
94  BeliefStateIterator bfBegin,
95  BeliefStateIterator bfEnd,
96  StateIdInsertIterator insertIt)
97  {
98  using State = typename Fsm::State;
99  using Transition = typename Fsm::Transition;
100  using StateMap = Diades::Graph::NodeMap<char>;
101  list<State> visitingStates;
102  StateMap visited(machine.behaviour());
103  std::for_each(bfBegin,bfEnd,
104  [&](State s){
105  visited[s]=1;
106  visitingStates.push_back(s);
107  });
108  while(!visitingStates.empty())
109  {
110  std::for_each(machine.outputTransitionBegin(visitingStates.front()),
111  machine.outputTransitionEnd(visitingStates.front()),
112  [&](Transition t){
113  if(visited[t.target()]==0)
114  {
115  visitingStates.push_back(t.target());
116  visited[t.target()]=1;
117  }
118  });
119  visitingStates.pop_front();
120  }
121  deleteState(machine,machine.stateBegin(), machine.stateEnd(),[&](State s){ return visited[s]==0; }, insertIt);
122  }
123 
124 
138  template<typename Fsm, typename StateIdInsertIterator>
139  void
141  StateIdInsertIterator insertIt)
142  {
143  trimmingUnreachableStates(machine,machine.initialStateBegin(),machine.initialStateEnd(),insertIt);
144  }
145 
162  template<typename Fsm, typename BeliefStateIterator, typename StateIdInsertIterator>
163  bool
165  BeliefStateIterator bfBegin,
166  BeliefStateIterator bfEnd,
167  StateIdInsertIterator insertIt)
168  {
169  using State = typename Fsm::State;
170  using Transition = typename Fsm::Transition;
171  using StateMap = Diades::Graph::NodeMap<char>;
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)
177  {
178  if(visitingStates.front().outDeg() == 0)
179  {
180  if(visitingStates.front().inDeg() != 0)
181  {
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();
186  }
187  *(insertIt++)=machine.getStatePropertyId(visitingStates.front());
188  machine.deleteState(visitingStates.front());
189  }
190  else
191  {
192  if(toConfirmIt == visitingStates.end())
193  {
194  toConfirmIt = visitingStates.insert(visitingStates.end(),
195  visitingStates.front());
196  }
197  else
198  {
199  visitingStates.insert(visitingStates.end(),
200  visitingStates.front());
201  }
202  }
203  visitingStates.pop_front();
204  }
205  return machine.initialStateBegin() != machine.initialStateEnd();
206  }
207 
208 
222  template<typename Fsm, typename StateIdInsertIterator>
223  bool
225  StateIdInsertIterator insertIt)
226  {
227  return trimmingDeadlockStates(machine,machine.stateBegin(),machine.stateEnd(),insertIt);
228  }
229 
230 
257  template<typename Fsm, typename BeliefStateIterator, typename StateIdInsertIterator, typename DisableInsertIterator>
259  ControlPattern<Fsm> & pattern,
260  BeliefStateIterator bfBegin,
261  BeliefStateIterator bfEnd,
262  StateIdInsertIterator insertIt,
263  DisableInsertIterator disableIt)
264  {
265  using Event = typename Fsm::EventPropertyId;
266  using State = typename Fsm::State;
267  using Transition = typename Fsm::Transition;
268  using StateMap = Diades::Graph::NodeMap<char>;
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())
274  {
275  std::for_each(machine.inputTransitionBegin(visitingStates.front()),
276  machine.inputTransitionEnd(visitingStates.front()),
277  [&](Transition t){
278  if(pattern.enabled(machine.getEvent(t)))
279  {
280  if(visited[t.source()]==0)
281  {
282  visitingStates.push_back(t.source());
283  visited[t.source()]=1;
284  }
285  }
286  else
287  {
288  disabled[t.source()].push_back(machine.getEvent(t));
289  // we are about to delete t.target(). If t.source() has only one output transition
290  // then it will become a deadlock
291  if((t.source().outDeg() == 1) && (visited[t.source()]==0))
292  {
293  visitingStates.push_back(t.source());
294  visited[t.source()]=1;
295  }
296  }
297  });
298  *(insertIt++)=machine.getStatePropertyId(visitingStates.front());
299  disabled.erase(visitingStates.front());
300  machine.deleteState(visitingStates.front());
301  visitingStates.pop_front();
302  }
303  for(const auto & disab : disabled)
304  {
305  for( const auto & event : disab.second)
306  {
307  *(disableIt++)= std::make_pair(machine.getStatePropertyId(disab.first),event);
308  }
309  }
310  return machine.initialStateBegin() != machine.initialStateEnd();
311  }
312  }
313  }
314 }
315 
316 #endif /* __DIADES__AUTOMATA__EXPERIMENTAL__TRIMMING__HH */
317 
void trimmingTraces(Fsm &machine, BeliefStateIterator bfBegin, BeliefStateIterator bfEnd, StateIdInsertIterator insertIt)
Trim the traces of the Fsm that does not reach the given BeliefState.
Definition: Trimming.hh:44
Diades::Graph::Edge Transition
Definition: Component.hh:46
bool trimmingDeadlockStates(Fsm &machine, BeliefStateIterator bfBegin, BeliefStateIterator bfEnd, StateIdInsertIterator insertIt)
Trim the states are the source of a deadlock within a range of states.
Definition: Trimming.hh:164
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
Diades::Graph::GraphNodeSet::Iterator BeliefStateIterator
Definition: BeliefState.hh:40
void trimmingUnreachableStates(Fsm &machine, BeliefStateIterator bfBegin, BeliefStateIterator bfEnd, StateIdInsertIterator insertIt)
Trim the states that cannot be reached from the given BeliefState.
Definition: Trimming.hh:93
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::State State
Definition: Run.cc:72
AutFsm::Transition Transition
Definition: Run.cc:73
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...
Definition: Trimming.hh:258
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
Definition: BeliefState.hh:36