DiaDes  0.1
DIAgnosis of Discrete-Event System
ComposableModel.hh
Go to the documentation of this file.
1 #ifndef __DIADES__AUTOMATA__COMPOSABLE_MODEL
2 #define __DIADES__AUTOMATA__COMPOSABLE_MODEL
3 
4 #include <unordered_set>
5 #include <sstream>
8 #include <diades/graph/Graph.hh>
10 #include <diades/automata/Event.hh>
13 
14 namespace Diades
15 {
16  namespace Automata
17  {
18 
19 
20 
36  {
37  public:
38  static string typeName() { return "Diades::Automata::ComposableModel"; }
40 
45  typedef unordered_set<Event>::const_iterator EventIterator;
47  typedef unordered_set<State>::const_iterator InitialStateIterator;
48  typedef const ComposableModel * ConstPointer;
50 
51 
52  private:
53  typedef vector<const ComposableModel *>::size_type SizeType;
54  typedef unordered_map<Event, vector<SizeType> > SupportMap;
55  const unsigned _synchronisationLimit;
56  const SynchronisationRules * const _sync;
57  mutable unordered_set<Event> _usedEvents;
58  mutable unordered_set<State> _initialStates;
59  mutable vector<Event> _componentEventOf;
67  mutable SupportMap _support;
69  const vector<ConstPointer> _models;
72  vector<const Component *> _components;
74  bool _onTheFly;
75  private:
76 
85  bool computeSupport();
86 
87 
88  bool computeInitialStates(list<State> & pendingStates);
89 
90 
91  protected:
92  stringstream _log;
93  const Component * _comp;
96 
106  bool synchronise();
107 
108 
117  void synchronise(State state, Event event) const;
118 
119 
127  void synchronise(State state) const;
128 
129  public:
130 
131  ConstPointer getPointer() const { return this; }
132  Pointer getPointer() { return this; }
133 
134 
135 
147  const SynchronisationRules & synchronisation);
148 
149 
154  bool valid() const { return (_sync != 0) && ((_comp != 0 && _comp->isValid()) || (_result != 0 && _result->isValid())) && (!_initialStates.empty()) && (!_usedEvents.empty()); }
155 
166  ComposableModel(const vector<ConstPointer> & models, const SynchronisationRules & synchronisation,
167  bool onTheFly);
168 
180  ComposableModel(const vector<ConstPointer> & models, const SynchronisationRules & synchronisation,
181  bool onTheFly,
182  Component * result);
183 
184 
185 
191 
192 
193 
197  const string & name() const { return component().name(); }
198 
199 
204  { return *_sync; }
205 
206 
211  EventIterator beginOfEvents() const
212  {
213  return _usedEvents.begin();
214  }
215 
216 
221  EventIterator endOfEvents() const
222  {
223  return _usedEvents.end();
224  }
225 
226 
230  unsigned numberOfInitialStates() const
231  {
232  return _initialStates.size();
233  }
234 
238  unsigned numberOfStates() const
239  {
240  return component().numberOfStates();
241  }
242 
246  unsigned numberOfTransitions() const
247  {
248  return component().numberOfTransitions();
249  }
250 
251 
255  StateIterator stateBegin() const
256  {
257  return component().stateBegin();
258  }
259 
260 
264  StateIterator stateEnd() const
265  {
266  return component().stateEnd();
267  }
268 
269 
270 
274  InitialStateIterator beginOfInitialStates() const
275  {
276  return _initialStates.begin();
277  }
278 
279 
283  InitialStateIterator endOfInitialStates() const
284  {
285  return _initialStates.end();
286  }
287 
288 
294  const Component & component() const
295  {
296  if(_result != nullptr)
297  {
298  return *_result;
299  }
300  return *_comp;
301  }
302 
309  const vector<ConstPointer> & models() const { return _models; }
310 
311 
319  const vector<State> & vectorStateOf(State s) const {
320  if(_components.size() == 1)
321  {
322  if(_vectorStateOf[s].empty())
323  {
324  _vectorStateOf[s].push_back(s);
325  }
326  }
327  return _vectorStateOf[s];
328  }
329 
330 
339  OutputTransitionIterator outputTransitionBegin(State s) const
340  {
341  require(Exception, s.valid(), "outputTransitionBegin: invalid state");
342  require(Exception, &s.owner() == &component().behaviour(), "outputTransitionBegin: invalid state");
343  if(_onTheFly && (_visited[s].empty()))
344  {
345 
346  synchronise(s);
347 
348  }
349  return component().outputTransitionBegin(s);
350  }
351 
360  OutputTransitionIterator outputTransitionEnd(State s) const
361  {
362  require(Exception, s.valid(), "outputTransitionEnd: invalid state");
363  require(Exception, &s.owner() == &component().behaviour(), "outputTransitionEnd: invalid state");
364  if(_onTheFly && (_visited[s].empty()))
365  {
366  synchronise(s);
367  }
368  return component().outputTransitionEnd(s);
369  }
370 
379  OutputEventTransitionIterator outputEventTransitionBegin(State s, const Event & e) const
380  {
381  require(Exception, s.valid(), "outputEventTransitionBegin: invalid state");
382  require(Exception, &s.owner() == &component().behaviour(), "outputEventTransitionBegin: invalid state");
383  require(Exception, e.isValid(), "outputEventTransitionBegin: invalid event");
384  if(_onTheFly && (_visited[s].find(e) == _visited[s].end()))
385  {
386  synchronise(s,e);
387  }
388  cout << " event is " << e << " and _componentEventOf = " << _componentEventOf[e.id()] << endl;
389  return component().outputEventTransitionBegin(s,_componentEventOf[e.id()]);
390  }
391 
400  OutputEventTransitionIterator outputEventTransitionEnd(State s, const Event & e) const
401  {
402  require(Exception, s.valid(), "outputEventTransitionEnd: invalid state");
403  require(Exception, &s.owner() == &component().behaviour(), "outputEventTransitionEnd: invalid state");
404  require(Exception, e.isValid(), "outputEventTransitionEnd: invalid event");
405  if(_onTheFly && (_visited[s].find(e) == _visited[s].end()))
406  {
407  synchronise(s,e);
408  }
409  return component().outputEventTransitionEnd(s,_componentEventOf[e.id()]);
410  }
411 
412 
413  InputEventTransitionIterator inputEventTransitionBegin(State s, const Event & e) const
414  {
415  require(Exception, s.valid(), "inputEventTransitionBegin: invalid state");
416  require(Exception, &s.owner() == &component().behaviour(), "inputEventTransitionBegin: invalid state");
417  require(Exception, e.isValid(), "inputEventTransitionBegin: invalid event");
418  return component().inputEventTransitionBegin(s,_componentEventOf[e.id()]);
419  }
420 
421 
422 
423  InputEventTransitionIterator inputEventTransitionEnd(State s, const Event & e) const
424  {
425  require(Exception, s.valid(), "inputEventTransitionEnd: invalid state");
426  require(Exception, &s.owner() == &component().behaviour(), "inputEventTransitionEnd: invalid state");
427  require(Exception, e.isValid(), "inputEventTransitionEnd: invalid event");
428  return component().inputEventTransitionEnd(s,_componentEventOf[e.id()]);
429  }
430 
431 
432 
433 
434  string log() const {
435  return _log.str();
436  }
437 
438 
439  };
440 
441  };
442 };
443 
444 
445 #endif
Graph::Graph & behaviour()
Definition: Component.hh:215
OutputEventTransitionIterator outputEventTransitionBegin(State s, Event e) const
Definition: Component.hh:832
vector< const ComposableModel * >::size_type SizeType
ConstNodeMap< vector< State > > _vectorStateOf
StateIterator stateBegin() const
Definition: Component.hh:572
vector< const Component * > _components
Component::OutputTransitionIterator OutputTransitionIterator
OutputEventTransitionIterator outputEventTransitionBegin(State s, const Event &e) const
StateIterator stateEnd() const
Definition: Component.hh:579
OutputEventTransitionIterator outputEventTransitionEnd(State s, Event e) const
Definition: Component.hh:850
EventIterator beginOfEvents() const
ConstNodeMap< set< Event > > _visited
InputEventTransitionIterator inputEventTransitionBegin(State s, const Event &e) const
InputEventTransitionIterator inputEventTransitionEnd(State s, Event e) const
Definition: Component.hh:884
const string & name() const
Definition: Component.hh:256
unsigned numberOfTransitions() const
Definition: Component.hh:958
OutputTransitionIterator outputTransitionEnd(State s) const
GraphIterator< Node > NodeIterator
Definition: GraphInt.hh:139
const Component * _comp
stream for logging internal messages
bool computeInitialStates(list< State > &pendingStates)
Component::InputTransitionIterator InputTransitionIterator
Component * _result
true if the composable model has to manage its own result component
unsigned numberOfStates() const
Definition: Component.hh:563
bool isValid() const
Definition: Event.hh:172
bool synchronise()
the underlying Component (if result from synchronisation)
unordered_set< Event > _usedEvents
the synchronisation law of the ComposableModel
Diades::Utils::Exception< ComposableModel > Exception
#define require(Exception, expr, message)
Definition: Assertion.hh:90
Diades::Graph::OutEdgeIterator OutputTransitionIterator
Definition: Component.hh:72
Namespace of the Diades project.
const ComposableModel * ConstPointer
OutputTransitionIterator outputTransitionBegin(State s) const
Definition: Component.hh:913
unordered_map< Event, vector< SizeType > > SupportMap
const SynchronisationRules & synchronisationLaw() const
const vector< ConstPointer > & models() const
Diades::Graph::InEdgeIterator InputTransitionIterator
Definition: Component.hh:71
Diades::Graph::NodeIterator StateIterator
unordered_set< Transition >::const_iterator OutputEventTransitionIterator
Definition: Component.hh:74
Component::InputEventTransitionIterator InputEventTransitionIterator
const Component & component() const
InputEventTransitionIterator inputEventTransitionEnd(State s, const Event &e) const
Diades::Graph::Node State
Definition: BeliefState.hh:36
const vector< ConstPointer > _models
unordered_set< Event >::const_iterator EventIterator
OutputTransitionIterator outputTransitionBegin(State s) const
InitialStateIterator endOfInitialStates() const
ComposableModel(const Component &component, const SynchronisationRules &synchronisation)
bool _embeddedResult
the underlying Component (if associated to a component)
unordered_set< Transition >::const_iterator InputEventTransitionIterator
Definition: Component.hh:75
Component::OutputEventTransitionIterator OutputEventTransitionIterator
vector< Event > _componentEventOf
list of initial states
const SynchronisationRules *const _sync
synchronisation limit (number of states)
unordered_set< State >::const_iterator InitialStateIterator
OutputTransitionIterator outputTransitionEnd(State s) const
Definition: Component.hh:925
OutputEventTransitionIterator outputEventTransitionEnd(State s, const Event &e) const
InitialStateIterator beginOfInitialStates() const
InputEventTransitionIterator inputEventTransitionBegin(State s, Event e) const
Definition: Component.hh:867
unordered_set< State > _initialStates
list of the events of the ComposableModel
const vector< State > & vectorStateOf(State s) const