DiaDes  0.1
DIAgnosis of Discrete-Event System
Node.hh
Go to the documentation of this file.
1 #ifndef __DIADES__ALTARICA__NODE__HH
2 #define __DIADES__ALTARICA__NODE__HH
3 #include <map>
4 #include <graph/Graph.hh>
5 #include <graph/NodeMap.hh>
7 #include "Transition.hh"
8 #include "Parameter.hh"
9 #include "Variable.hh"
10 #include "Event.hh"
11 
12 namespace Diades
13 {
14  namespace Altarica
15  {
16 
18 
19  /****************************************************************************/
20  //class NodeInstance;
21 
28  class NodeData
29  {
30 
31  private:
32 
33  unsigned _id;
34  string _name;
35  unordered_map<Identifier,unsigned> _idParam;
36  vector<Parameter> _param;
37  vector<Transition> _trans;
38  vector<Variable> _flowVar;
39  vector<Variable> _stateVar;
40  vector<Variable> _nodeVar;
41  unordered_map<Identifier, Variable> _flowVarOfLabel;
42  unordered_map<Identifier, Variable> _stateVarOfLabel;
43  unordered_map<Identifier, Variable> _nodeVarOfLabel;
44  set<Identifier> _attributes;
45  set<Event> _eventSet;
46  unordered_map<Identifier,Event> _eventOfLabel;
49  vector<Expression *> _assertions;
50  vector< NodeData *> _subNodes;
51  vector< Identifier > _subNodesName;
52  unordered_map<Identifier, NodeData *> _subNodesMap;
53  list< vector< list<Identifier> > > _synchros;
54  set<Assignment> _initialisations;
55 
60  NodeData(unsigned id):_id(id),_name("Invalid_but_non_empty_Altarica_Node"),
61  _idParam(),_param(),_flowVar(),_stateVar(),_nodeVar(),
62  _flowVarOfLabel(),_stateVarOfLabel(),_nodeVarOfLabel(),
63  _attributes(),_eventSet(),_eventOfLabel(),
64  _eventDag(),_events(_eventDag),_assertions(),_subNodes(),_subNodesMap(),_synchros(),
65  _initialisations(){}
66 
67 
68 
72  Event newEvent(const Identifier & id);
73 
74 
78  Event getEvent(const Identifier & id) const
79  {
80  unordered_map<Identifier,Event>::const_iterator it = _eventOfLabel.find(id);
81  if(it != _eventOfLabel.end())
82  {
83  return it->second;
84  }
85  return Event();
86  }
87 
93  void setPriorities(const set<Event> & lowEvents, const set<Event> & highEvents);
94 
98  void addAttribute(const Identifier & attribute);
99 
100 
109  Variable addVariable(const Identifier & id, NodeVariableType type, Domain domain, const set<Identifier> & attributes);
110 
117  Variable addStructureVariable(const Identifier & id, const set<Variable> & structure);
118 
123  {
124  _assertions.push_back(assertion);
125  }
126 
127 
133  void addParameter(const Identifier & id, Domain domain);
134 
135 
139  void addTransition(const Transition & transition)
140  {
141  _trans.push_back(transition);
142  }
143 
144  typedef vector<Transition>::const_iterator TransitionIterator;
145 
149  TransitionIterator transitionBegin() const
150  {
151  return _trans.begin();
152  }
153 
154 
158  TransitionIterator transitionEnd() const
159  {
160  return _trans.end();
161  }
162 
163 
170  {
171  unordered_map<Identifier,unsigned>::const_iterator it = _idParam.find(id);
172  if(it == _idParam.end())
173  {
174  return Parameter();
175  }
176  return _param[it->second];
177  }
183  Variable getVariable(const Identifier & id) const
184  {
185  Variable result;
186  unordered_map<Identifier,Variable >::const_iterator it = _flowVarOfLabel.find(id);
187  if(it == _flowVarOfLabel.end())
188  {
189  it = _stateVarOfLabel.find(id);
190  if(it != _stateVarOfLabel.end())
191  {
192  result = it->second;
193  }
194  else
195  {
196  it = _nodeVarOfLabel.find(id);
197  if(it != _nodeVarOfLabel.end())
198  {
199  result = it->second;
200  }
201  }
202  }
203  else
204  {
205  result = it->second;
206  }
207  return result;
208  }
209 
215  void addSubNode(const Identifier & name, const Node & nodeType);
216 
217 
222  void addSyncVector(const vector< list<Identifier> > & paths);
223 
224 
229  void addInitialisation(const Assignment & assignment);
230 
231 
232 
233 
234  friend class AltaricaModel;
235  friend class Node;
236  friend class NodeInstance;
237  };
238 
239 
240 
241  // /****************************************************************************/
242 
243 
249  class Node
250  {
251  public:
252  typedef set<Event>::const_iterator EventIterator;
253  typedef vector<Parameter>::const_iterator ParameterIterator;
254  typedef vector<Transition>::const_iterator TransitionIterator;
255  typedef vector<Variable>::const_iterator VariableIterator;
256  typedef set<Identifier>::const_iterator AttributeIterator;
257  typedef vector<Expression *>::const_iterator ExpressionPtrIterator;
258 
259  protected:
261 
267  Node(NodeData * data):_data(data){}
268 
269 
270  public:
271 
274  Node():_data(0) {}
275 
280  Node(const Node & node):_data(node._data) {}
281 
282 
288  Node & operator=(const Node & node)
289  {
290  if(this != &node)
291  {
292  _data = node._data;
293  }
294  return *this;
295  }
296 
297 
300  ~Node() {}
301 
302 
306  unsigned id() const { if(!valid()) { return 0;} return _data->_id; }
307 
311  bool valid() const { return _data != 0; }
312 
313 
317  string name() const
318  {
319  if(!valid()) { return "Invalid_Altarica_Node"; }
320  return _data->_name;
321  }
322 
326  ExpressionPtrIterator assertionBegin() const
327  {
328  return _data->_assertions.begin();
329  }
333  ExpressionPtrIterator assertionEnd() const
334  {
335  return _data->_assertions.end();
336  }
337 
341  unsigned numberOfSubNodes() const
342  {
343  return _data->_subNodes.size();
344  }
345 
347  typedef vector<NodeData *>::size_type SubNodeIndex;
348 
352  SubNodeIndex subNodeFirst() const
353  {
354  return 0;
355  }
356 
360  SubNodeIndex subNodeLast() const
361  {
362  return _data->_subNodes.size()-1;
363  }
364 
369  Node getSubNode(SubNodeIndex index) const
370  {
371  return Node(_data->_subNodes[index]);
372  }
373 
378  const string & getSubNodeName(SubNodeIndex index) const
379  {
380  return _data->_subNodesName[index];
381  }
382 
383 
387  EventIterator eventBegin() const
388  {
389  return _data->_eventSet.begin();
390  }
391 
392 
396  EventIterator eventEnd() const
397  {
398  return _data->_eventSet.end();
399  }
403  ParameterIterator parameterBegin() const
404  {
405  return _data->_param.begin();
406  }
407 
408 
412  ParameterIterator parameterEnd() const
413  {
414  return _data->_param.end();
415  }
416 
420  TransitionIterator transitionBegin() const
421  {
422  return _data->_trans.begin();
423  }
424 
425 
429  TransitionIterator transitionEnd() const
430  {
431  return _data->_trans.end();
432  }
433 
434 
438  VariableIterator flowVariableBegin() const
439  {
440  return _data->_flowVar.begin();
441  }
442 
446  VariableIterator flowVariableEnd() const
447  {
448  return _data->_flowVar.end();
449  }
453  unsigned numberOfFlowVariables() const
454  {
455  return _data->_flowVar.size();
456  }
460  VariableIterator nodeVariableBegin() const
461  {
462  return _data->_nodeVar.begin();
463  }
464 
468  VariableIterator nodeVariableEnd() const
469  {
470  return _data->_nodeVar.end();
471  }
475  unsigned numberOfNodeVariables() const
476  {
477  return _data->_nodeVar.size();
478  }
479 
480 
481 
485  VariableIterator stateVariableBegin() const
486  {
487  return _data->_stateVar.begin();
488  }
489 
493  VariableIterator stateVariableEnd() const
494  {
495  return _data->_stateVar.end();
496  }
497 
501  unsigned numberOfStateVariables() const
502  {
503  return _data->_stateVar.size();
504  }
505 
509  AttributeIterator attributeBegin() const
510  {
511  return _data->_attributes.begin();
512  }
513 
517  AttributeIterator attributeEnd() const
518  {
519  return _data->_attributes.end();
520  }
521 
525  NodeData * data() { return _data; }
526 
527  Event getEvent(const Identifier & id) const
528  {
529  if(_data!=0)
530  {
531  return _data->getEvent(id);
532  }
533  return Event();
534  }
535 
536 
543  {
544  Parameter result;
545  if(_data!=0)
546  {
547  result = _data->getParameter(id);
548  }
549  return result;
550  }
556  Variable getVariable(const Identifier & id) const
557  {
558  Variable result;
559  if(_data!=0)
560  {
561  result = _data->getVariable(id);
562  }
563  return result;
564  }
565 
566 
567  typedef set<Assignment>::const_iterator InitialisationIterator;
568 
572  InitialisationIterator initialisationBegin() const
573  {
574  return _data->_initialisations.begin();
575  }
576 
577 
581  InitialisationIterator initialisationEnd() const
582  {
583  return _data->_initialisations.end();
584  }
585 
586 
587  friend class Event;
588  friend class NodeData;
589  friend class Parameter;
590  friend class Variable;
591  friend class AltaricaModel;
592  friend class NodeInstance;
593  };
594 
595 
596  };
597 };
598 
599 #endif
VariableIterator nodeVariableEnd() const
Definition: Node.hh:468
VariableIterator nodeVariableBegin() const
Definition: Node.hh:460
vector< Transition > _trans
Definition: Node.hh:37
vector< Variable > _stateVar
Definition: Node.hh:39
InitialisationIterator initialisationEnd() const
Definition: Node.hh:581
VariableIterator stateVariableEnd() const
Definition: Node.hh:493
unsigned numberOfSubNodes() const
Definition: Node.hh:341
void setPriorities(const set< Event > &lowEvents, const set< Event > &highEvents)
set< Event >::const_iterator EventIterator
Definition: Node.hh:252
NodeData * _data
Definition: Node.hh:260
Parameter getParameter(const Identifier &id) const
Definition: Node.hh:169
bool valid() const
Definition: Node.hh:311
vector< Variable >::const_iterator VariableIterator
Definition: Node.hh:255
Node(const Node &node)
Definition: Node.hh:280
TransitionIterator transitionBegin() const
Definition: Node.hh:420
void addParameter(const Identifier &id, Domain domain)
Parameter
NodeData * data()
Definition: Node.hh:525
Variable addStructureVariable(const Identifier &id, const set< Variable > &structure)
void addAttribute(const Identifier &attribute)
Parameter getParameter(const Identifier &id) const
Definition: Node.hh:542
vector< Transition >::const_iterator TransitionIterator
Definition: Node.hh:144
Variable addVariable(const Identifier &id, NodeVariableType type, Domain domain, const set< Identifier > &attributes)
Diades::Graph::NodeMap< Event > _events
Definition: Node.hh:48
friend class Event
Definition: Node.hh:587
unordered_map< Identifier, unsigned > _idParam
Definition: Node.hh:35
void addSyncVector(const vector< list< Identifier > > &paths)
vector< NodeData * > _subNodes
Definition: Node.hh:50
set< Identifier > _attributes
Definition: Node.hh:44
SubNodeIndex subNodeLast() const
Definition: Node.hh:360
VariableIterator flowVariableBegin() const
Definition: Node.hh:438
ParameterIterator parameterEnd() const
Definition: Node.hh:412
Node getSubNode(SubNodeIndex index) const
Definition: Node.hh:369
SubNodeIndex subNodeFirst() const
Definition: Node.hh:352
ExpressionPtrIterator assertionBegin() const
Definition: Node.hh:326
EventIterator eventBegin() const
Definition: Node.hh:387
const string & getSubNodeName(SubNodeIndex index) const
Definition: Node.hh:378
VariableIterator flowVariableEnd() const
Definition: Node.hh:446
set< Assignment >::const_iterator InitialisationIterator
Definition: Node.hh:567
InitialisationIterator initialisationBegin() const
Definition: Node.hh:572
vector< Transition >::const_iterator TransitionIterator
Definition: Node.hh:254
Diades::Graph::Graph _eventDag
Definition: Node.hh:47
std::string Identifier
Definition: Type.hh:24
Variable getVariable(const Identifier &id) const
Definition: Node.hh:183
void addAssertion(Expression *assertion)
Definition: Node.hh:122
vector< Parameter > _param
Definition: Node.hh:36
vector< Expression * >::const_iterator ExpressionPtrIterator
Definition: Node.hh:257
Variable getVariable(const Identifier &id) const
Definition: Node.hh:556
NodeData(unsigned id)
Definition: Node.hh:60
Event getEvent(const Identifier &id) const
Definition: Node.hh:527
vector< Variable > _flowVar
Definition: Node.hh:38
Namespace of the Diades project.
unordered_map< Identifier, Variable > _nodeVarOfLabel
Definition: Node.hh:43
vector< Identifier > _subNodesName
Definition: Node.hh:51
list< vector< list< Identifier > > > _synchros
Definition: Node.hh:53
vector< Expression * > _assertions
Definition: Node.hh:49
unsigned id() const
Definition: Node.hh:306
Event getEvent(const Identifier &id) const
Definition: Node.hh:78
void addSubNode(const Identifier &name, const Node &nodeType)
AttributeIterator attributeEnd() const
Definition: Node.hh:517
set< Assignment > _initialisations
Definition: Node.hh:54
unordered_map< Identifier, NodeData * > _subNodesMap
Definition: Node.hh:52
ExpressionPtrIterator assertionEnd() const
Definition: Node.hh:333
unordered_map< Identifier, Variable > _flowVarOfLabel
Definition: Node.hh:41
unordered_map< Identifier, Variable > _stateVarOfLabel
Definition: Node.hh:42
vector< Parameter >::const_iterator ParameterIterator
Definition: Node.hh:253
set< Event > _eventSet
Definition: Node.hh:45
Node & operator=(const Node &node)
Definition: Node.hh:288
unsigned numberOfFlowVariables() const
Definition: Node.hh:453
TransitionIterator transitionBegin() const
Definition: Node.hh:149
vector< Variable > _nodeVar
Definition: Node.hh:40
TransitionIterator transitionEnd() const
Definition: Node.hh:429
Event newEvent(const Identifier &id)
VariableIterator stateVariableBegin() const
Definition: Node.hh:485
unsigned numberOfNodeVariables() const
Definition: Node.hh:475
void addTransition(const Transition &transition)
Definition: Node.hh:139
TransitionIterator transitionEnd() const
Definition: Node.hh:158
unordered_map< Identifier, Event > _eventOfLabel
Definition: Node.hh:46
vector< NodeData * >::size_type SubNodeIndex
Definition: Node.hh:347
Node(NodeData *data)
data associated to a Node
Definition: Node.hh:267
set< Identifier >::const_iterator AttributeIterator
Definition: Node.hh:256
ParameterIterator parameterBegin() const
Definition: Node.hh:403
AttributeIterator attributeBegin() const
Definition: Node.hh:509
void addInitialisation(const Assignment &assignment)
unsigned numberOfStateVariables() const
Definition: Node.hh:501
EventIterator eventEnd() const
Definition: Node.hh:396
#define assertion(Exception, expr, message)
Definition: Assertion.hh:72
string name() const
Definition: Node.hh:317