DiaDes  0.1
DIAgnosis of Discrete-Event System
BeliefState.hh
Go to the documentation of this file.
1 
9 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__BELIEFSTATE__HH
10 #define __DIADES__AUTOMATA__EXPERIMENTAL__BELIEFSTATE__HH
11 #include<stack>
17 
18 namespace Diades
19 {
20  namespace Automata
21  {
22  namespace Experimental
23  {
24 
25  template<typename StateMachine>
27  {
28  public:
30  using Fsm = StateMachine;
31  using State = typename Fsm::State;
32  using Transition = typename Fsm::Transition;
34  using SharedPtr = std::shared_ptr<BeliefState>;
36  //using Iterator = typename std::set<State>::const_iterator;
37  private:
38  const Fsm & _fsm;
39  //std::set<State> _states;
40 
41  public:
42 
48  BeliefState(const Fsm & fsm) : Gns(fsm.behaviour()), _fsm(fsm)
49  {
50  }
51 
52 
57  void
59  {
60  insertNode(s);
61  }
62 
63 
69  template<class InputStateIterator>
70  void
71  insertStates(InputStateIterator first, InputStateIterator last)
72  {
73  insertNodes(first, last);
74  }
75 
76 
83  {
84  removeNode(s);
85  }
86 
92  Iterator
93  findState(State s) const
94  {
95  return findNode(s);
96  }
97 
98 
99 
100 
107  template<typename IsGoal>
108  SharedPtr
110  {
111  SharedPtr result = std::make_shared<BeliefState>(_fsm);
112  for(auto state : _nodes) //nodes)
113  {
114  std::for_each(_fsm.outputTransitionBegin(state),
115  _fsm.outputTransitionEnd(state),
116  [&](typename Fsm::Transition trans)
117  {
118  if(isGoal(trans))
119  {
120  result->insertState(trans.target());
121  }
122  });
123  }
124  return result;
125  }
126 
127 
134  template<typename IsGoal>
135  SharedPtr
137  {
138  SharedPtr result = std::make_shared<BeliefState>(_fsm);
139  for(auto state : _nodes) //_nodes)
140  {
141  std::for_each(_fsm.inputTransitionBegin(state),
142  _fsm.inputTransitionEnd(state),
143  [&](typename Fsm::Transition trans)
144  {
145  if(isGoal(trans))
146  {
147  result->insertState(trans.source());
148  }
149  });
150  }
151  return result;
152  }
153 
160  SharedPtr
161  nextBeliefState(const EventPropertyId & event) const
162  {
163  SharedPtr result = std::make_shared<BeliefState>(_fsm);
164  for(auto state : _nodes) //_nodes)
165  {
166  std::for_each(_fsm.outputEventTransitionBegin(state,event),
167  _fsm.outputEventTransitionEnd(state,event),
168  [&](typename Fsm::Transition trans)
169  {
170  result->insertState(trans.target());
171  });
172  }
173  return result;
174  }
175 
182  SharedPtr
183  prevBeliefState(const EventPropertyId & event) const
184  {
185  SharedPtr result = std::make_shared<BeliefState>(_fsm);
186  for(auto state : _nodes) //_nodes)
187  {
188  std::for_each(_fsm.inputEventTransitionBegin(state,event),
189  _fsm.inputEventTransitionEnd(state,event),
190  [&](typename Fsm::Transition trans)
191  {
192  result->insertState(trans.source());
193  });
194  }
195  return result;
196  }
197 
198 
199 
205  SharedPtr
207  {
208  SharedPtr result = std::make_shared<BeliefState>(_fsm);
209  for(auto state : _nodes)//_nodes)
210  {
211  std::for_each(_fsm.outputTransitionBegin(state),
212  _fsm.outputTransitionEnd(state),
213  [&](typename Fsm::Transition trans)
214  {
215  result->insertState(trans.target());
216  });
217  }
218  return result;
219  }
220 
226  SharedPtr
228  {
229  SharedPtr result = std::make_shared<BeliefState>(_fsm);
230  for(auto state : _nodes)
231  {
232  std::for_each(_fsm.inputEventTransitionBegin(state),
233  _fsm.inputEventTransitionEnd(state),
234  [&](typename Fsm::Transition trans)
235  {
236  result->insertState(trans.source());
237  });
238  }
239  return result;
240  }
241 
242 
249  template<typename Predicate>
250  SharedPtr
251  nextBeliefState(Predicate predicate) const
252  {
253  SharedPtr result = std::make_shared<BeliefState>(_fsm);
254  for(auto state : _nodes)
255  {
256  std::for_each(_fsm.outputTransitionBegin(state),
257  _fsm.outputTransitionEnd(state),
258  [&](typename Fsm::Transition trans)
259  {
260  if(predicate(trans.target()))
261  {
262  result->insertState(trans.target());
263  }
264  });
265  }
266  return result;
267  }
268 
275  template<typename Predicate>
276  SharedPtr
277  prevBeliefState(Predicate predicate) const
278  {
279  SharedPtr result = std::make_shared<BeliefState>(_fsm);
280  for(auto state : _nodes)
281  {
282  std::for_each(_fsm.inputEventTransitionBegin(state),
283  _fsm.inputEventTransitionEnd(state),
284  [&](typename Fsm::Transition trans)
285  {
286  if(predicate(trans.source()))
287  {
288  result->insertState(trans.source());
289  }
290  });
291  }
292  return result;
293  }
294 
295 
296 
328  template<typename TransitionPredicate, typename TransitionInsertIterator>
329  SharedPtr
330  nextReachableBeliefState(TransitionPredicate isGoal,
331  TransitionInsertIterator transInsertIterator,
332  TransitionInsertIterator targetTransInsertIterator)
333  {
334  return nextReachableBeliefState(isGoal,
335  [&](Transition t){ return false; },
336  transInsertIterator,
337  targetTransInsertIterator);
338  }
339 
340 
376  template<typename IsGoal, typename IsForbidden, typename TransitionInsertIterator>
377  SharedPtr
378  nextReachableBeliefState(IsGoal isGoal, IsForbidden isForbidden,
379  TransitionInsertIterator transInsertIterator,
380  TransitionInsertIterator targetTransInsertIterator)
381  {
382 
383  using TransitionMap = Diades::Graph::ConstEdgeMap<char>;
384  SharedPtr result = std::make_shared<BeliefState>(_fsm);
385  TransitionMap visited(_fsm.behaviour());
386  std::stack<Transition> visitingTransitions;
387  list<Transition> resultTransitions;
388  std::for_each(begin(),end(),
389  [&](State s)
390  {
391  std::for_each(_fsm.outputTransitionBegin(s),
392  _fsm.outputTransitionEnd(s),
393  [&](Transition t){
394  if(!isForbidden(t))
395  {
396  visitingTransitions.push(t);
397  }
398  });
399  });
400  while (!visitingTransitions.empty()) {
401  auto current = visitingTransitions.top();
402  visitingTransitions.pop();
403  if (visited[current] == 0)
404  {
405  visited[current] = 1;
406  if(!isGoal(current))
407  {
408  std::for_each(_fsm.outputTransitionBegin(current.target()),
409  _fsm.outputTransitionEnd(current.target()),
410  [&](Transition t){
411  if(!isForbidden(t) && visited[t] ==0)
412  {
413  visitingTransitions.push(t);
414  }
415  });
416  }
417  else
418  {
419  resultTransitions.push_back(current);
420  }
421  }
422  }
423  while(!resultTransitions.empty())
424  {
425  result->insertState(resultTransitions.front().target());
426 
427  std::stack<Transition> visitingTransitions2;
428  visitingTransitions2.push(resultTransitions.front());
429  while (!visitingTransitions2.empty()) {
430  auto current = visitingTransitions2.top();
431  visitingTransitions2.pop();
432  if(visited[current]!=2)
433  {
434  if(isGoal(current))
435  {
436  *targetTransInsertIterator++=current;
437  }
438  else
439  {
440  *transInsertIterator++=current;
441  }
442  visited[current] = 2;
443  std::for_each(_fsm.inputTransitionBegin(current.source()),
444  _fsm.inputTransitionEnd(current.source()),
445  [&](Transition t){
446  if(visited[t] ==1)
447  {
448  visitingTransitions2.push(t);
449  }
450  });
451  }
452  }
453 
454  resultTransitions.pop_front();
455  }
456  return result;
457  }
458  };
459 
460 
461 
465  template<typename Fsm>
467 
468 
473  template<typename Fsm>
475 
476 
481  template<typename Fsm>
483 
484  }
485  }
486 }
487 
488 #endif /* __DIADES__AUTOMATA__EXPERIMENTAL__BELIEFSTATE__HH */
489 
OutputEventTransitionIterator outputEventTransitionBegin(State s, const EventPropertyId &e) const
Diades::Graph::ConstNodeMap< Type > CstStMap
OutputTransitionIterator outputTransitionBegin(State s) const
InputTransitionIterator inputTransitionBegin(State s) const
void insertStates(InputStateIterator first, InputStateIterator last)
Definition: BeliefState.hh:71
CstStMap< BsPtr< Fsm > > CstBsMap
Definition: BeliefState.hh:474
std::shared_ptr< BeliefState > SharedPtr
Definition: BeliefState.hh:34
InputEventTransitionIterator inputEventTransitionEnd(State s, const EventPropertyId &e) const
typename BeliefState< Fsm >::SharedPtr BsPtr
Definition: BeliefState.hh:466
SharedPtr nextReachableBeliefState(TransitionPredicate isGoal, TransitionInsertIterator transInsertIterator, TransitionInsertIterator targetTransInsertIterator)
nextReachableBeliefState
Definition: BeliefState.hh:330
Iterator findNode(Node n) const
Namespace of the Diades project.
SharedPtr prevBeliefState(const EventPropertyId &event) const
Definition: BeliefState.hh:183
OutputTransitionIterator outputTransitionEnd(State s) const
InputTransitionIterator inputTransitionEnd(State s) const
Definition: Run.cc:83
ConstIterator on the Net.
SharedPtr prevPredicateBeliefState(IsGoal isGoal)
Definition: BeliefState.hh:136
typename Fsm::EventPropertyId EventPropertyId
Definition: BeliefState.hh:33
OutputEventTransitionIterator outputEventTransitionEnd(State s, const EventPropertyId &e) const
SharedPtr prevBeliefState(Predicate predicate) const
Definition: BeliefState.hh:277
SharedPtr nextReachableBeliefState(IsGoal isGoal, IsForbidden isForbidden, TransitionInsertIterator transInsertIterator, TransitionInsertIterator targetTransInsertIterator)
nextReachableBeliefState
Definition: BeliefState.hh:378
SharedPtr nextPredicateBeliefState(IsGoal isGoal)
Definition: BeliefState.hh:109
Diades::Graph::NodeMap< Type > StMap
InputEventTransitionIterator inputEventTransitionBegin(State s, const EventPropertyId &e) const
SharedPtr nextBeliefState(Predicate predicate) const
Definition: BeliefState.hh:251
StMap< BsPtr< Fsm > > BsMap
Definition: BeliefState.hh:482
void insertNodes(InputNodeIterator first, InputNodeIterator last)
SharedPtr nextBeliefState(const EventPropertyId &event) const
Definition: BeliefState.hh:161