1 #ifndef __DIADES__AUTOMATA__COMPOSABLE_MODEL 2 #define __DIADES__AUTOMATA__COMPOSABLE_MODEL 4 #include <unordered_set> 38 static string typeName() {
return "Diades::Automata::ComposableModel"; }
53 typedef vector<const ComposableModel *>::size_type
SizeType;
54 typedef unordered_map<Event, vector<SizeType> >
SupportMap;
154 bool valid()
const {
return (_sync != 0) && ((_comp != 0 && _comp->
isValid()) || (_result != 0 && _result->
isValid())) && (!_initialStates.empty()) && (!_usedEvents.empty()); }
213 return _usedEvents.begin();
223 return _usedEvents.end();
232 return _initialStates.size();
276 return _initialStates.begin();
285 return _initialStates.end();
296 if(_result !=
nullptr)
320 if(_components.size() == 1)
322 if(_vectorStateOf[s].empty())
324 _vectorStateOf[s].push_back(s);
327 return _vectorStateOf[s];
341 require(Exception, s.valid(),
"outputTransitionBegin: invalid state");
343 if(_onTheFly && (_visited[s].empty()))
362 require(Exception, s.valid(),
"outputTransitionEnd: invalid state");
364 if(_onTheFly && (_visited[s].empty()))
381 require(Exception, s.valid(),
"outputEventTransitionBegin: invalid state");
383 require(Exception, e.
isValid(),
"outputEventTransitionBegin: invalid event");
384 if(_onTheFly && (_visited[s].find(e) == _visited[s].end()))
388 cout <<
" event is " << e <<
" and _componentEventOf = " << _componentEventOf[e.
id()] << endl;
402 require(Exception, s.valid(),
"outputEventTransitionEnd: invalid state");
404 require(Exception, e.
isValid(),
"outputEventTransitionEnd: invalid event");
405 if(_onTheFly && (_visited[s].find(e) == _visited[s].end()))
415 require(Exception, s.valid(),
"inputEventTransitionBegin: invalid state");
417 require(Exception, e.
isValid(),
"inputEventTransitionBegin: invalid event");
425 require(Exception, s.valid(),
"inputEventTransitionEnd: invalid state");
427 require(Exception, e.
isValid(),
"inputEventTransitionEnd: invalid event");
StateIterator stateBegin() const
Graph::Graph & behaviour()
unsigned numberOfInitialStates() const
OutputEventTransitionIterator outputEventTransitionBegin(State s, Event e) const
const string & name() const
vector< const ComposableModel * >::size_type SizeType
ConstPointer getPointer() const
ConstNodeMap< vector< State > > _vectorStateOf
StateIterator stateBegin() const
const unsigned _synchronisationLimit
vector< const Component * > _components
ComposableModel * Pointer
Component::OutputTransitionIterator OutputTransitionIterator
OutputEventTransitionIterator outputEventTransitionBegin(State s, const Event &e) const
StateIterator stateEnd() const
unsigned numberOfTransitions() const
OutputEventTransitionIterator outputEventTransitionEnd(State s, Event e) const
EventIterator beginOfEvents() const
ConstNodeMap< set< Event > > _visited
InputEventTransitionIterator inputEventTransitionBegin(State s, const Event &e) const
InputEventTransitionIterator inputEventTransitionEnd(State s, Event e) const
const string & name() const
unsigned numberOfTransitions() const
OutputTransitionIterator outputTransitionEnd(State s) const
GraphIterator< Node > NodeIterator
const Component * _comp
stream for logging internal messages
bool computeInitialStates(list< State > &pendingStates)
StateIterator stateEnd() const
Component::InputTransitionIterator InputTransitionIterator
Component * _result
true if the composable model has to manage its own result component
unsigned numberOfStates() const
bool synchronise()
the underlying Component (if result from synchronisation)
unordered_set< Event > _usedEvents
the synchronisation law of the ComposableModel
unsigned numberOfStates() const
Diades::Utils::Exception< ComposableModel > Exception
#define require(Exception, expr, message)
Diades::Graph::OutEdgeIterator OutputTransitionIterator
Namespace of the Diades project.
const ComposableModel * ConstPointer
OutputTransitionIterator outputTransitionBegin(State s) const
unordered_map< Event, vector< SizeType > > SupportMap
StateTable _stateOfVector
const SynchronisationRules & synchronisationLaw() const
const vector< ConstPointer > & models() const
Diades::Graph::InEdgeIterator InputTransitionIterator
EventIterator endOfEvents() const
Diades::Graph::NodeIterator StateIterator
unordered_set< Transition >::const_iterator OutputEventTransitionIterator
Component::InputEventTransitionIterator InputEventTransitionIterator
const Component & component() const
InputEventTransitionIterator inputEventTransitionEnd(State s, const Event &e) const
Diades::Graph::Node State
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
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
OutputEventTransitionIterator outputEventTransitionEnd(State s, const Event &e) const
InitialStateIterator beginOfInitialStates() const
InputEventTransitionIterator inputEventTransitionBegin(State s, Event e) const
unordered_set< State > _initialStates
list of the events of the ComposableModel
const vector< State > & vectorStateOf(State s) const
State _pendingGlobalState