9 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__COMPOSABLEMODEL__HH__ 10 #define __DIADES__AUTOMATA__EXPERIMENTAL__COMPOSABLEMODEL__HH__ 12 #include<unordered_set> 23 namespace Experimental
42 template<
typename Fsm,
typename StateCreator>
50 return "Diades::Automata::Experimental::ComposableModel";
54 using Event =
typename Component::EventPropertyId;
71 vector<typename Ptr<ComposableModel>::ConstP>
_models;
72 std::unordered_map<typename Ptr<Component>::ConstP,
size_t>
_compIds;
82 mutable std::unordered_map<State, std::unordered_set < Event>>
_pendingInputs;
114 return _synchronisedFsm->initialStateBegin();
116 return _comp->initialStateBegin();
130 initialStates.reserve(_models.size());
135 return _synchronisedFsm->initialStateEnd();
137 return _comp->initialStateEnd();
203 _synchronisedFsm(nullptr),
207 _initialStateEnumerator(),
208 _synchronisationEventsInUse(),
209 _synchronisationEventsOfSynchronisedEvent(),
230 _synchronisedFsm(nullptr),
234 _initialStateEnumerator(),
235 _synchronisationEventsInUse(),
236 _synchronisationEventsOfSynchronisedEvent(),
241 _creator(
Ptr<StateCreator>::get(creator))
243 for(
size_t i = 0; i <
models.size(); ++i)
260 StateCreator & creator,
265 _synchronisedFsm(
Ptr<
Fsm>::get(result)),
269 _initialStateEnumerator(),
270 _synchronisationEventsInUse(),
271 _synchronisationEventsOfSynchronisedEvent(),
276 _creator(
Ptr<StateCreator>::get(creator))
278 for(
size_t i = 0; i <
models.size(); ++i)
283 _creator->setStateMachine(result);
299 init(synchronisedFsm);
315 if(_comp ==
nullptr && _synchronisedFsm !=
nullptr)
318 while(!_pendingOutputs.empty())
320 State pendingState = _pendingOutputs.begin()->first;
321 Event pendingEvent = *(_pendingOutputs.begin()->second.begin());
340 if(_notStarted || (!_pendingOutputs.empty()))
344 return _synchronisedFsm->stateBegin();
346 return _comp->stateBegin();
360 if(_notStarted || (!_pendingOutputs.empty()))
364 return _synchronisedFsm->stateEnd();
366 return _comp->stateEnd();
380 if(_notStarted || (!_pendingOutputs.empty()))
384 return _synchronisedFsm->transitionBegin();
386 return _comp->transitionBegin();
400 if(_notStarted || (!_pendingOutputs.empty()))
404 return _synchronisedFsm->transitionEnd();
406 return _comp->transitionEnd();
433 _synchronisedFsm->clear();
434 _stateOfVector.
clear();
435 _vectorOfState.clear();
436 _pendingOutputs.clear();
437 _pendingInputs.clear();
439 if(_creator !=
nullptr)
441 _creator->setStateMachine(synchronisedFsm);
454 std::vector<InitialStateIterator>
start;
455 start.reserve(
models().size());
456 std::vector<InitialStateIterator> end;
457 end.reserve(
models().size());
458 std::for_each(_models.begin(), _models.end(),
461 start.push_back(composableModel->component().initialStateBegin());
462 end.push_back(composableModel->component().initialStateEnd());
464 _initialStateEnumerator.
setup(std::move(start), std::move(end));
476 if(_synchronisedFsm !=
nullptr)
489 const vector<typename Ptr<ComposableModel>::ConstP> &
501 vector<typename Ptr<ComposableModel>::ConstP> &
528 if(_stateOfVector.
getLeaf(states.begin(), states.end(), result))
533 std::tie(result,created) = _creator->newState(states);
535 _vectorOfState[result] =
states;
537 _pendingOutputs[result].insert(
538 KeyIterator(_synchronisationEventsOfSynchronisedEvent.begin()),
539 KeyIterator(_synchronisationEventsOfSynchronisedEvent.end()));
540 _pendingInputs[result].insert(
541 KeyIterator(_synchronisationEventsOfSynchronisedEvent.begin()),
542 KeyIterator(_synchronisationEventsOfSynchronisedEvent.end()));
560 bool isCreated =
false;
561 initialStates.clear();
562 initialStates.reserve(_models.size());
563 while(!isCreated && !_initialStateEnumerator.
completed())
565 std::for_each(_initialStateEnumerator.
current().begin(),
566 _initialStateEnumerator.
current().end(),
569 initialStates.push_back(*it);
572 isCreated =
newState(initialStates, initialState);
575 _initialStateEnumerator.
hasNext();
576 initialStates.clear();
580 _synchronisedFsm->setInitial(initialState);
597 auto evtIt = _synchronisationEventsOfSynchronisedEvent.find(event);
598 if(evtIt != _synchronisationEventsOfSynchronisedEvent.end())
600 const auto & synchronisationEvent = *(evtIt->second);
601 auto stateIt = _vectorOfState.find(state);
602 if(stateIt != _vectorOfState.end())
604 const auto & stateVector = stateIt->second;
606 auto supportIt = _synchronisationEventsInUse.find(
Ptr<SyncEvent>::get(synchronisationEvent));
607 if(supportIt != _synchronisationEventsInUse.end())
609 const auto & support = supportIt->second;
610 std::vector<OutputEventTransitionIterator>
start, end;
611 start.reserve(support.size());
612 end.reserve(support.size());
613 std::for_each(support.begin(), support.end(),
614 [&](
size_t modelIndex)
616 auto & model = _models[modelIndex];
617 auto & compState = stateVector[modelIndex];
618 auto event = synchronisationEvent.getAssociatedEvent(model->component());
619 start.push_back(model->outputEventTransitionBegin(compState, event));
620 end.push_back(model->outputEventTransitionEnd(compState, event));
624 if(!enumerator.empty())
630 for(
auto it = support.begin(); it != support.end(); ++it)
632 targetVector[*it] = (enumerator.current().at(index))->target();
637 _synchronisedFsm->newTransition(state, target, event);
639 while(enumerator.hasNext());
644 _pendingOutputs[state].erase(event);
645 if(_pendingOutputs[state].empty())
647 _pendingOutputs.erase(state);
663 auto evtIt = _synchronisationEventsOfSynchronisedEvent.find(event);
664 if(evtIt != _synchronisationEventsOfSynchronisedEvent.end())
666 const auto & synchronisationEvent = *(evtIt->second);
667 auto stateIt = _vectorOfState.find(state);
668 if(stateIt != _vectorOfState.end())
670 const auto & stateVector = stateIt->second;
672 auto supportIt = _synchronisationEventsInUse.find(
Ptr<SyncEvent>::get(synchronisationEvent));
673 if(supportIt != _synchronisationEventsInUse.end())
675 const auto & support = supportIt->second;
676 std::vector<InputEventTransitionIterator>
start, end;
677 start.reserve(support.size());
678 end.reserve(support.size());
679 std::for_each(support.begin(), support.end(),
680 [&](
size_t modelIndex)
682 auto & model = _models[modelIndex];
683 auto & compState = stateVector[modelIndex];
684 auto event = synchronisationEvent.getAssociatedEvent(model->component());
685 start.push_back(model->inputEventTransitionBegin(compState, event));
686 end.push_back(model->inputEventTransitionEnd(compState, event));
690 if(!enumerator.empty())
697 for(
auto it = support.begin(); it != support.end(); ++it)
699 sourceVector[*it] = (enumerator.current().at(index))->target();
704 _synchronisedFsm->newTransition(source, state, event);
706 while(enumerator.hasNext());
711 _pendingInputs[state].erase(event);
712 if(_pendingInputs[state].empty())
714 _pendingInputs.erase(state);
732 auto it = _pendingOutputs.find(s);
734 if((it != _pendingOutputs.end())
736 (it->second.find(e) != it->second.end()))
740 return _synchronisedFsm->outputEventTransitionBegin(s, e);
742 return _comp->outputEventTransitionBegin(s, e);
758 auto it = _pendingOutputs.find(s);
760 if((it != _pendingOutputs.end())
762 (it->second.find(e) != it->second.end()))
766 return _synchronisedFsm->outputEventTransitionEnd(s, e);
768 return _comp->outputEventTransitionEnd(s, e);
786 auto it = _pendingInputs.find(s);
788 if((it != _pendingInputs.end())
790 (it->second.find(e) != it->second.end()))
794 return _synchronisedFsm->inputEventTransitionBegin(s, e);
796 return _comp->inputEventTransitionBegin(s, e);
812 auto it = _pendingInputs.find(s);
814 if((it != _pendingInputs.end())
816 (it->second.find(e) != it->second.end()))
820 return _synchronisedFsm->inputEventTransitionEnd(s, e);
822 return _comp->inputEventTransitionEnd(s, e);
837 auto it = _pendingOutputs.find(s);
838 if(it != _pendingOutputs.end())
840 auto currentSize = _pendingOutputs.size();
841 while(_pendingOutputs.size() == currentSize)
844 Event pendingEvent = *(it->second.begin());
848 return _synchronisedFsm->outputTransitionBegin(s);
850 return _comp->outputTransitionBegin(s);
865 auto it = _pendingOutputs.find(s);
866 if(it != _pendingOutputs.end())
868 auto currentSize = _pendingOutputs.size();
869 while(_pendingOutputs.size() == currentSize)
872 Event pendingEvent = *(it->second.begin());
877 return _synchronisedFsm->outputTransitionEnd(s);
879 return _comp->outputTransitionEnd(s);
892 auto it = _pendingInputs.find(s);
893 if(it != _pendingInputs.end())
895 auto currentSize = _pendingInputs.size();
896 while(_pendingInputs.size() == currentSize)
899 Event pendingEvent = *(it->second.begin());
903 return _synchronisedFsm->inputTransitionBegin(s);
905 return _comp->inputTransitionBegin(s);
921 auto it = _pendingInputs.find(s);
922 if(it != _pendingInputs.end())
924 auto currentSize = _pendingInputs.size();
925 while(_pendingInputs.size() == currentSize)
928 Event pendingEvent = *(it->second.begin());
932 return _synchronisedFsm->inputTransitionEnd(s);
934 return _comp->inputTransitionEnd(s);
956 auto it = _sync->beginOfSynchronisedEvents();
957 while(it != _sync->endOfSynchronisedEvents())
961 _synchronisationEventsInUse.clear();
983 auto it = syncEvent.beginOfSupport();
984 while(!(isIn && isOut) && it != syncEvent.endOfSupport())
987 bool found = (compIdIt != _compIds.end());
988 isIn = isIn || found;
989 isOut = isOut || (!found);
992 _synchronisationEventsOfSynchronisedEvent[syncEvent.synchronisedEvent()] =
Ptr<SyncEvent>::get(syncEvent);
997 return !(isIn && isOut);
void synchroniseOutputs(State state, Event event) const
static ConstP get(const T &obj)
std::vector< State > StateVector
typename Component::InitialStateIterator InitialStateIterator
const SynchronisationRules< Fsm > & synchronisationLaw() const
InitialStateIterator Value
ComposableModel(const vector< typename Ptr< ComposableModel >::ConstP > &models, const SynchronisationRules< Fsm > &synchronisation, StateCreator &creator)
Leaf & insertSuccessiveBranches(NodeIterator begin, NodeIterator end, const Leaf &info)
void createInitialStates() const
TransitionIterator transitionEnd() const
OutputTransitionIterator outputTransitionBegin(State s) const
ComposableModel()=default
typename Component::State State
const Component & component() const
StateIterator stateBegin() const
OutputEventTransitionIterator outputEventTransitionBegin(State s, Event e) const
SynchronisationEvent< Component > SyncEvent
vector< typename Ptr< ComposableModel >::ConstP > _models
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
const std::string & name() const
InputTransitionIterator inputTransitionBegin(State s) const
typename Component::OutputTransitionIterator OutputTransitionIterator
InputEventTransitionIterator inputEventTransitionEnd(State s, Event e) const
std::unordered_map< State, StateVector > VectorOfState
ComposableModel & operator=(ComposableModel const &other)=default
typename Component::TransitionIterator TransitionIterator
std::unordered_map< Event, typename Ptr< SyncEvent >::ConstP > _synchronisationEventsOfSynchronisedEvent
std::unordered_map< State, std::unordered_set< Event > > _pendingInputs
InitialStateIterator initialStateBegin() const
std::unordered_map< State, std::unordered_set< Event > > _pendingOutputs
InputTransitionIterator inputTransitionEnd(State s) const
typename Component::OutputEventTransitionIterator OutputEventTransitionIterator
unordered_set< State >::const_iterator InitialStateIterator
bool newInitialState(StateVector &initialStates, State &initialState) const
InitialStateEnumerator _initialStateEnumerator
std::unordered_map< typename Ptr< SyncEvent >::ConstP, std::unordered_set< size_t > > _synchronisationEventsInUse
Diades::Graph::NodeIterator StateIterator
ComposableModel(const Component &component, const SynchronisationRules< Fsm > &synchronisation)
ComposableModel(const vector< typename Ptr< ComposableModel >::ConstP > &models, const SynchronisationRules< Fsm > &synchronisation, StateCreator &creator, Fsm &result)
AutFsm::Transition Transition
virtual ~ComposableModel()=default
typename SyncRules::SyncEvent SyncEvent
InputEventTransitionIterator inputEventTransitionBegin(State s, Event e) const
typename Component::InputTransitionIterator InputTransitionIterator
void completeSynchronisation()
OutputTransitionIterator outputTransitionEnd(State s) const
bool computeSynchronisationEventsInUse()
bool getLeaf(NodeIterator begin, NodeIterator end, Leaf &result)
Ptr< Component >::ConstP _comp
IsIn< InputIterator > isIn(InputIterator first, InputIterator last)
bool newState(const StateVector &states, State &result) const
Diades::Graph::OutEdgeIterator OutputTransitionIterator
Namespace of the Diades project.
StateIterator stateEnd() const
typename Component::StateIterator StateIterator
void init(Fsm &synchronisedFsm)
void setup(std::vector< T > &&start, const std::vector< T > &&end)
TransitionIterator transitionBegin() const
Ptr< SyncRules >::ConstP _sync
typename Component::EventPropertyId Event
bool checkSynchronisationEvent(const SyncEvent &syncEvent)
Diades::Graph::InEdgeIterator InputTransitionIterator
const vector< typename Ptr< ComposableModel >::ConstP > & models() const
unordered_set< Transition >::const_iterator OutputEventTransitionIterator
void initInitialStateEnumeration()
Diades::Graph::EdgeIterator TransitionIterator
StateOfVector _stateOfVector
const std::vector< T > & current() const
vector< typename Ptr< ComposableModel >::ConstP > & models()
typename Component::Transition Transition
InitialStateIterator initialStateEnd() const
typename Component::InputEventTransitionIterator InputEventTransitionIterator
unordered_set< Transition >::const_iterator InputEventTransitionIterator
void synchroniseInputs(State state, Event event) const
Ptr< StateCreator >::P _creator
OutputEventTransitionIterator outputEventTransitionEnd(State s, Event e) const
Ptr< Component >::P _synchronisedFsm
VectorOfState _vectorOfState
std::unordered_map< typename Ptr< Component >::ConstP, size_t > _compIds
bool completeSynchronisation(Fsm &synchronisedFsm)