8 #ifndef __DIADES__SDMDL_EXPERIMENTAL__BDDSTATEMACHINE__HH__ 9 #define __DIADES__SDMDL_EXPERIMENTAL__BDDSTATEMACHINE__HH__ 12 #include <unordered_map> 21 namespace Experimental
43 return "Diades::Sdmdl::Experimental::BddStateMachine";
145 mutable std::vector< std::reference_wrapper<FormulaFactory> >
_factory;
167 _nextStateVariable(),
172 _factory.push_back(_internalFactory);
174 _behaviour.push_back(_internalFactory.
isFalse());
175 _events.push_back(_internalFactory.
isFalse());
176 _setOfEvents.push_back(_internalFactory.
isFalse());
194 _factory.push_back(factory);
195 return _factory[0].get();
211 _factory.push_back(_internalFactory);
213 if (!_eventVariable.empty())
218 if (!_stateVariable.empty())
223 if (!_nextStateVariable.empty())
227 _internalFactory.
reset(varSet);
230 _behaviour.push_back(_internalFactory.
isFalse());
232 _events.push_back(_internalFactory.
isFalse());
233 _setOfEvents.clear();
234 _setOfEvents.push_back(_internalFactory.
isFalse());
235 return _factory[0].get();
244 return _eventVariable[0].get();
253 return _eventVariable[0].get();
265 _eventVariable.clear();
266 _eventVariable.push_back(event);
267 return _eventVariable[0].get();
276 return _stateVariable[0].get();
285 return _stateVariable[0].get();
297 _stateVariable.clear();
298 _stateVariable.push_back(stateVar);
299 return _stateVariable[0].get();
308 return _nextStateVariable[0].get();
317 return _nextStateVariable[0].get();
329 _nextStateVariable.clear();
330 _nextStateVariable.push_back(nextStateVar);
331 return _nextStateVariable[0].get();
353 "initialStates: not initialised");
354 return _initialState[0].get();
371 _initialState.clear();
372 _initialState.push_back(newInitialStates);
373 return _initialState.back();
388 _eventOfValue[value.label()].push_back(_events.back());
389 _formulaOfEvent[evt].push_back(_events.back());
390 const SlEvents & currentSetOfEvent = _setOfEvents[0].get();
391 _setOfEvents.clear();
392 _setOfEvents.push_back(currentSetOfEvent || _events.back());
393 return _events.back();
403 auto it = _eventOfValue.find(eventValue.
label());
404 return (it->second)[0].get();
414 auto it = _formulaOfEvent.find(evt);
415 return (it->second)[0].get();
425 return _factory[0].get().newFormula(
stateVariable(),sourceStateValue);
434 template<
typename ValueIterator>
440 tmp.push_back(_factory[0].
get().isTrue());
444 tmp.push_back(_factory[0].
get().isFalse());
450 tmp.push_back(current &&
sources(*first));
474 template<
typename ValueIterator>
480 tmp.push_back(_factory[0].
get().isTrue());
484 tmp.push_back(_factory[0].
get().isFalse());
490 tmp.push_back(current &&
targets(*first));
503 const SlTransitions & currentTransitions = _behaviour[0].get();
505 _behaviour.push_back(currentTransitions
518 "transitions: not initialised");
519 return _behaviour[0].get();
530 "transitions: not initialised");
531 return _behaviour[0].get() &&
event;
552 "transitions: not initialised");
553 return (_behaviour[0].
get() && sources &&
events);
561 return _setOfEvents[0].get();
567 template<
typename EventIterator>
571 tmp.push_back(
factory().isFalse());
576 tmp.push_back(current ||
event(*first));
579 const SlEvents & result = tmp[0].get();
626 "BddComponent::factory: not initialised");
627 return _factory[0].get();
const SlEvents & events(EventIterator first, EventIterator last)
Variable & nextStateVariable()
Formula::FormulaVector FormulaVector
Variable & stateVariable()
FormulaFactory & resetInternalFormulaFactory()
const Value & getValue(const string &label) const
const SlEvents & event(Event evt) const
VariableVector _stateVariable
std::unordered_map< Event, FormulaVector > _formulaOfEvent
Variable & eventVariable()
const SlStates & addInitialStates(const SlStates &newInitialStates)
const SlTransitions & transitions(const SlEvents &event) const
const SlStates & setInitialStates(const SlStates &newInitialStates)
VariableVector _nextStateVariable
FormulaVector _noTransitions
const Variable & eventVariable() const
const SlStates & initialStates() const
FormulaVector _initialState
const SlEvents & targets(ValueIterator first, ValueIterator last) const
Variable & setStateVariable(Variable &stateVar)
const SlEvents & targets(const Value &targetStateValue) const
Variable & setEventVariable(Variable &event)
std::vector< Reference > VariableVector
const SlEvents & sources(ValueIterator first, ValueIterator last) const
const SlEvents & event(const Value &eventValue) const
FormulaVector _setOfEvents
FormulaFactory & factory()
#define require(Exception, expr, message)
Namespace of the Diades project.
const SlTransitions & transitions(const SlStates &sources, const SlEvents &events) const
std::vector< std::reference_wrapper< FormulaFactory > > _factory
const SlStates & synchronousTrigger(const SlStates &sources, const SlEvents &events) const
const Variable & nextStateVariable() const
const SlEvents & addEvent(Event evt)
FormulaFactory & setFormulaFactory(FormulaFactory &factory)
std::unordered_map< std::string, FormulaVector > _eventOfValue
const SlStates & trigger(const SlStates &sources, const SlEvents &events) const
const std::string & label() const
const SlTransitions & noTransitions() const
const SlStates & reach(const SlStates &sources, const SlEvents &nonObservables, const SlEvents &observations)
const SlEvents & events() const
const SlEvents & sources(const Value &sourceStateValue) const
const SlTransitions & transitions() const
Variable::VariableVector VariableVector
Variable & setNextStateVariable(Variable &nextStateVar)
FormulaFactory _internalFactory
const SlTransitions & addTransitions(const SlTransitions &transition)
const Variable & stateVariable() const
VariableVector _eventVariable