9 #ifndef __DIADES__AUTOMATA__DETERMINE__HH 10 #define __DIADES__AUTOMATA__DETERMINE__HH 25 namespace Experimental
33 template<
typename Fsm>
38 return std::find_if(machine.stateBegin(), machine.stateEnd(),
40 return std::find_if(machine.outputTransitionBegin(s), machine.outputTransitionEnd(s),
42 auto evt = machine.getEvent(t);
43 return (++machine.outputEventTransitionBegin(s, evt)) !=
44 machine.outputEventTransitionEnd(s, evt);
45 }) != machine.outputTransitionEnd(s);
46 }) == machine.stateEnd();
63 template<
typename Fsm,
typename StateCreator>
66 Fsm & deterministicMachine,
67 StateCreator & creator)
70 &machine != &deterministicMachine,
71 "determine: the determination algorithm cannot be applied on the current StateMachine");
72 deterministicMachine.clear();
73 deterministicMachine.setName(
"deterministic_" + machine.name());
74 deterministicMachine.copyEventPropertyIds(machine);
75 if (machine.isEmpty() || machine.numberOfInitialStates() == 0) {
80 BeliefStateTable bsTable;
81 std::list<typename FsmBs::SharedPtr> bs;
82 std::list<typename Fsm::State>
states;
83 bs.push_back(std::make_shared<FsmBs>(machine));
84 bs.back()->insertStates(machine.initialStateBegin(), machine.initialStateEnd());
85 bool found = !bs.back()->isEmpty();
90 std::tie(initialState,result) = creator.newState(*bs.back());
95 states.push_back(bsTable.insertIfNotFound(*bs.back().get(), initialState, found));
96 deterministicMachine.setInitial(initialState);
99 auto currentBs = bs.front();
100 auto sourceState = states.front();
101 for (
auto & event : machine.events()) {
102 typename FsmBs::SharedPtr newBs = currentBs->nextBeliefState(event);
103 if (newBs->isEmpty()) {
106 auto targetState = bsTable.getInfo(*newBs.get(),found);
108 std::tie(targetState,result) = creator.newState(*newBs.get());
109 targetState = bsTable.insertIfNotFound(*newBs.get(),targetState,found);
111 states.push_back(targetState);
115 deterministicMachine.newTransition(sourceState, targetState, event);
Diades::Graph::Edge Transition
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
void determine(const Fsm &machine, Fsm &deterministicMachine, StateCreator &creator)
AutFsm::Transition Transition
#define require(Exception, expr, message)
Namespace of the Diades project.
bool isDeterministic(const Fsm &machine)
Diades::Graph::Node State