3 #include <memory/word.h>
4 #include <runner/machineRunner.h>
5 #include <machine/FSM/maybeEpsilonFiniteStateMachine.h>
18 typename ListenerType,
31 typename MachineType_,
32 typename ListenerType_,
33 typename... ListenerConstructorArgs
38 std::tuple<ListenerConstructorArgs...>
59 typedef std::integral_constant<bool, !std::is_same_v<ListenerType, void>>
IsListened;
62 static constexpr
bool IsListened_v = IsListened::value;
70 static constexpr
bool IsAccepting_v = IsAccepting::value;
78 static constexpr
bool IsAlternating_v = IsAlternating::value;
97 std::tuple<StateType, size_t, ListenerIdType>,
98 std::tuple<StateType, size_t>
104 "Machine must be a NonDeterministicSimpleFiniteStateMachine");
107 "The only allowed value for ListenerConstructorArgs is the default one.");
109 static_assert(IsAccepting_v,
"The machine must be accepting.");
110 static_assert(!IsAlternating_v,
"The machine cannot be alternating.");
122 modifier(this->word),
123 observer(this->word),
124 currentConfigurations(),
125 terminatedConfigurations(),
128 for(
const StateType& state: machine.getInitialStates()) {
129 if constexpr (IsListened_v) {
130 if (machine.isHaltingConfiguration(state, word)) {
131 terminatedConfigurations.insert({state, 0, MachineRunner_::listener.getInitialId()});
133 currentConfigurations.insert({state, 0, MachineRunner_::listener.getInitialId()});
136 if (machine.isHaltingConfiguration(state, word)) {
137 terminatedConfigurations.insert({state, 0});
139 currentConfigurations.insert({state, 0});
151 modifier(this->word),
152 observer(this->word),
153 currentConfigurations(other.currentConfigurations),
154 terminatedConfigurations(other.terminatedConfigurations),
155 running(other.running)
169 MachineRunner_::operator=(other);
173 currentConfigurations = other.currentConfigurations;
174 terminatedConfigurations = other.terminatedConfigurations;
175 running = other.running;
205 return currentConfigurations;
212 return terminatedConfigurations;
222 virtual void step(
size_t nbIter = 1)
override {
223 for(
size_t i = 0; i < nbIter && running; ++i) {
239 for (
auto content: terminatedConfigurations) {
240 if (MachineRunner_::machine.isAcceptingState(std::get<0>(content))) {
255 std::set<ConfigurationType> newStates;
257 for(
const auto& currentConfiguration: currentConfigurations) {
258 if constexpr (IsListened_v) {
259 const auto&[currentState, position, currentId] = currentConfiguration;
260 modifier.setPosition(position);
261 std::set<std::pair<const TransitionType &, ApplyHelperType>> matchingTransitions =
262 MachineRunner_::machine.getMatchingTransitions(currentState, word);
264 if (matchingTransitions.empty()) {
265 MachineRunner_::listener.registerNoTransition(currentId, currentState, word);
266 terminatedConfigurations.insert({currentState, position, currentId});
268 for (
auto[transition, helper]: matchingTransitions) {
269 ListenerIdType id = MachineRunner_::listener.registerPreTransition(currentState, word, currentId);
275 bool runningNewState = !MachineRunner_::machine.isHaltingConfiguration(newState, word);
276 MachineRunner_::listener.registerPostTransition(
id, newState, word, transition, helper,
278 if (runningNewState) {
279 newStates.insert({newState, observer.getPosition(),
id});
282 terminatedConfigurations.insert({newState, observer.getPosition(),
id});
287 const auto&[currentState, position] = currentConfiguration;
288 modifier.setPosition(position);
289 std::set<std::pair<const TransitionType &, ApplyHelperType>> matchingTransitions =
290 MachineRunner_::machine.getMatchingTransitions(currentState, word);
292 if (matchingTransitions.empty()) {
293 terminatedConfigurations.insert({currentState, position});
295 for (
auto[transition, helper]: matchingTransitions) {
302 bool runningNewState = !MachineRunner_::machine.isHaltingConfiguration(newState, word);
303 if (runningNewState) {
304 newStates.insert({newState, observer.getPosition()});
307 terminatedConfigurations.insert({newState, observer.getPosition()});
313 currentConfigurations = std::move(newStates);