TuringSim
C++ framework to simulate abstract computing models
maybeEpsilonFiniteStateMachineRunner.h
1 #pragma once
2 
3 #include <memory/word.h>
4 #include <runner/machineRunner.h>
5 #include <machine/FSM/maybeEpsilonFiniteStateMachine.h>
6 
7 namespace TuringSim::Runner {
16  template<
17  typename MachineType,
18  typename ListenerType,
19  typename ListenerConstructorArgs = typename MachineRunnerArgs<MachineType, ListenerType>::ListenerConstructorArgs
20  >
22 
30  template<
31  typename MachineType_,
32  typename ListenerType_,
33  typename... ListenerConstructorArgs
34  >
36  MachineType_,
37  ListenerType_,
38  std::tuple<ListenerConstructorArgs...>
39  >
40  : public MachineRunner<MachineType_, ListenerType_> {
42  public:
43  using typename MachineRunner_::StateType;
44  using typename MachineRunner_::MachineType;
45  using typename MachineRunner_::StorageType;
46  using typename MachineRunner_::ListenerType;
47  using typename MachineRunner_::ListenerIdType;
48  using typename MachineRunner_::TransitionType;
49  using typename MachineRunner_::ApplyHelperType;
50 
54  typedef typename MachineType::SymbolType SymbolType;
55 
59  typedef std::integral_constant<bool, !std::is_same_v<ListenerType, void>> IsListened;
62  static constexpr bool IsListened_v = IsListened::value;
63 
67  typedef typename MachineType::IsAccepting IsAccepting;
70  static constexpr bool IsAccepting_v = IsAccepting::value;
71 
75  typedef typename MachineType::IsAlternating IsAlternating;
78  static constexpr bool IsAlternating_v = IsAlternating::value;
79 
94  typedef
95  std::conditional_t<
96  IsListened_v,
97  std::tuple<StateType, size_t, ListenerIdType>,
98  std::tuple<StateType, size_t>
100 
101  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType>>);
102 
104  "Machine must be a NonDeterministicSimpleFiniteStateMachine");
105 
106  static_assert(std::is_same_v<std::tuple<ListenerConstructorArgs...>, typename MachineRunnerArgs<MachineType, ListenerType>::ListenerConstructorArgs>,
107  "The only allowed value for ListenerConstructorArgs is the default one.");
108 
109  static_assert(IsAccepting_v, "The machine must be accepting.");
110  static_assert(!IsAlternating_v, "The machine cannot be alternating.");
111 
113 
119  MaybeEpsilonFiniteStateMachineRunner(const MachineType& machine, ListenerConstructorArgs... listener, const std::vector<SymbolType>& word) :
120  MachineRunner_(machine, listener...),
121  word(word),
122  modifier(this->word),
123  observer(this->word),
124  currentConfigurations(),
125  terminatedConfigurations(),
126  running(true)
127  {
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()});
132  } else {
133  currentConfigurations.insert({state, 0, MachineRunner_::listener.getInitialId()});
134  }
135  } else {
136  if (machine.isHaltingConfiguration(state, word)) {
137  terminatedConfigurations.insert({state, 0});
138  } else {
139  currentConfigurations.insert({state, 0});
140  }
141  }
142  }
143  }
144 
149  MachineRunner_(other.machine, other.listener),
150  word(other.word),
151  modifier(this->word),
152  observer(this->word),
153  currentConfigurations(other.currentConfigurations),
154  terminatedConfigurations(other.terminatedConfigurations),
155  running(other.running)
156  {}
157 
162 
168  if(this != &other) {
169  MachineRunner_::operator=(other);
170  word = other.word;
173  currentConfigurations = other.currentConfigurations;
174  terminatedConfigurations = other.terminatedConfigurations;
175  running = other.running;
176  }
177  return *this;
178  }
179 
185  virtual ~MaybeEpsilonFiniteStateMachineRunner() override = default;
186 
190  const StorageType& getWord() const {
191  return word;
192  }
193 
198  return word;
199  }
200 
204  const std::set<ConfigurationType>& getCurrentConfigurations() const {
205  return currentConfigurations;
206  }
207 
211  const std::set<ConfigurationType>& getTerminatedConfigurations() const {
212  return terminatedConfigurations;
213  }
214 
218  bool isRunning() const {
219  return running;
220  }
221 
222  virtual void step(size_t nbIter = 1) override {
223  for(size_t i = 0; i < nbIter && running; ++i) {
224  this->oneStep();
225  }
226  }
227 
228  virtual void exec() override {
229  while(running) {
230  this->oneStep();
231  }
232  }
233 
237  virtual bool accept() override {
238  exec();
239  for (auto content: terminatedConfigurations) {
240  if (MachineRunner_::machine.isAcceptingState(std::get<0>(content))) {
241  return true;
242  }
243  }
244  return false;
245  }
246 
247  protected:
248  virtual void oneStep() override {
249  if (!running) {
250  return;
251  }
252 
253  running = false;
254 
255  std::set<ConfigurationType> newStates;
256 
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);
263 
264  if (matchingTransitions.empty()) {
265  MachineRunner_::listener.registerNoTransition(currentId, currentState, word);
266  terminatedConfigurations.insert({currentState, position, currentId});
267  } else {
268  for (auto[transition, helper]: matchingTransitions) {
269  ListenerIdType id = MachineRunner_::listener.registerPreTransition(currentState, word, currentId);
270  StateType newState = transition.apply(
271  currentState,
272  word,
273  std::move(helper),
274  running);
275  bool runningNewState = !MachineRunner_::machine.isHaltingConfiguration(newState, word);
276  MachineRunner_::listener.registerPostTransition(id, newState, word, transition, helper,
277  runningNewState);
278  if (runningNewState) {
279  newStates.insert({newState, observer.getPosition(), id});
280  running = true;
281  } else {
282  terminatedConfigurations.insert({newState, observer.getPosition(), id});
283  }
284  }
285  }
286  } else {
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);
291 
292  if (matchingTransitions.empty()) {
293  terminatedConfigurations.insert({currentState, position});
294  } else {
295  for (auto[transition, helper]: matchingTransitions) {
296 
297  StateType newState = transition.apply(
298  currentState,
299  word,
300  std::move(helper),
301  running);
302  bool runningNewState = !MachineRunner_::machine.isHaltingConfiguration(newState, word);
303  if (runningNewState) {
304  newStates.insert({newState, observer.getPosition()});
305  running = true;
306  } else {
307  terminatedConfigurations.insert({newState, observer.getPosition()});
308  }
309  }
310  }
311  }
312  }
313  currentConfigurations = std::move(newStates);
314  }
315 
316 
320 
324 
328 
334  std::set<ConfigurationType> currentConfigurations;
335 
341  std::set<ConfigurationType> terminatedConfigurations;
342 
345  bool running;
346  };
347 }
TuringSim::Memory::Word::Word< SymbolType >
TuringSim::Runner::MachineRunner::ApplyHelperType
MachineType::ApplyHelperType ApplyHelperType
The type of transitions apply helpers of the machine.
Definition: machineRunner.h:163
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner
A class to run a simulate the execution of a MaybeEpsilonFiniteStateMachine.
Definition: maybeEpsilonFiniteStateMachineRunner.h:21
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::operator=
constexpr MaybeEpsilonFiniteStateMachineRunner & operator=(MaybeEpsilonFiniteStateMachineRunner &&other)=default
Move a runner.
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::step
virtual void step(size_t nbIter=1) override
Execute a given number of steps of the machine, one step by default.
Definition: maybeEpsilonFiniteStateMachineRunner.h:222
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::IsAccepting
MachineType::IsAccepting IsAccepting
std::true_type if the machine is accepting or alternating, std::false_type otherwise.
Definition: maybeEpsilonFiniteStateMachineRunner.h:67
TuringSim::Runner::MachineRunner::TransitionType
MachineType::TransitionType TransitionType
The type of transitions of the machine.
Definition: machineRunner.h:158
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::isRunning
bool isRunning() const
Test if the machine is still running.
Definition: maybeEpsilonFiniteStateMachineRunner.h:218
TuringSim::Runner
The namespace of machine runners.
Definition: deterministicMachineRunner.h:5
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::word
Memory::Word::Word< SymbolType > word
Definition: maybeEpsilonFiniteStateMachineRunner.h:319
TuringSim::Runner::MachineRunner::StateType
MachineType::StateType StateType
The type of states of the machine.
Definition: machineRunner.h:148
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::MaybeEpsilonFiniteStateMachineRunner
constexpr MaybeEpsilonFiniteStateMachineRunner(const MaybeEpsilonFiniteStateMachineRunner &other)
Copy a runner.
Definition: maybeEpsilonFiniteStateMachineRunner.h:148
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::getWord
const StorageType & getWord() const
Get a const reference to the memory of the machine.
Definition: maybeEpsilonFiniteStateMachineRunner.h:190
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::oneStep
virtual void oneStep() override
Execute one step of the machine.
Definition: maybeEpsilonFiniteStateMachineRunner.h:248
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::MaybeEpsilonFiniteStateMachineRunner
MaybeEpsilonFiniteStateMachineRunner(const MachineType &machine, ListenerConstructorArgs... listener, const std::vector< SymbolType > &word)
Simple constructor.
Definition: maybeEpsilonFiniteStateMachineRunner.h:119
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::IsListened
std::integral_constant< bool, !std::is_same_v< ListenerType, void > > IsListened
std::true_type if the runner has a listener, std::false_type otherwise.
Definition: maybeEpsilonFiniteStateMachineRunner.h:59
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::terminatedConfigurations
std::set< ConfigurationType > terminatedConfigurations
The set of terminated configurations, each as a 2- or 3-tuple:
Definition: maybeEpsilonFiniteStateMachineRunner.h:341
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::accept
virtual bool accept() override
Check the acceptance of the word.
Definition: maybeEpsilonFiniteStateMachineRunner.h:237
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::currentConfigurations
std::set< ConfigurationType > currentConfigurations
The set of current (unterminated) configurations, each as a 2- or 3-tuple:
Definition: maybeEpsilonFiniteStateMachineRunner.h:334
TuringSim::Runner::MachineRunner::ListenerType
ListenerType_ ListenerType
The type of the listener.
Definition: machineRunner.h:142
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::MaybeEpsilonFiniteStateMachineRunner
constexpr MaybeEpsilonFiniteStateMachineRunner(MaybeEpsilonFiniteStateMachineRunner &&other)=default
Move a runner.
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::modifier
Memory::Word::Word< SymbolType >::Modifier modifier
Definition: maybeEpsilonFiniteStateMachineRunner.h:323
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::running
bool running
Whether the machine is still running.
Definition: maybeEpsilonFiniteStateMachineRunner.h:345
TuringSim::Memory::MemoryStructure< T, Word< T >, WordObserver< T >, WordModifier< T > >::Observer
WordObserver< T > Observer
The type of observers.
Definition: memoryStructure.h:119
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::operator=
constexpr MaybeEpsilonFiniteStateMachineRunner & operator=(const MaybeEpsilonFiniteStateMachineRunner &other)
Copy a runner.
Definition: maybeEpsilonFiniteStateMachineRunner.h:167
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::ConfigurationType
std::conditional_t< IsListened_v, std::tuple< StateType, size_t, ListenerIdType >, std::tuple< StateType, size_t > > ConfigurationType
The type of a configuration.
Definition: maybeEpsilonFiniteStateMachineRunner.h:99
TuringSim::Runner::MachineRunnerArgs::ListenerConstructorArgs
std::tuple< ListenerType & > ListenerConstructorArgs
The tuple of parameters of a runner, excluding the machine parameter.
Definition: machineRunner.h:101
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine
The class to represent a finite state machine with epsilon-transitions.
Definition: maybeEpsilonFiniteStateMachine.h:25
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::getTerminatedConfigurations
const std::set< ConfigurationType > & getTerminatedConfigurations() const
Get a const reference to the set of current state.
Definition: maybeEpsilonFiniteStateMachineRunner.h:211
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::getCurrentConfigurations
const std::set< ConfigurationType > & getCurrentConfigurations() const
Get a const reference to the set of current state.
Definition: maybeEpsilonFiniteStateMachineRunner.h:204
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::SymbolType
MachineType::SymbolType SymbolType
The type of letters used by the FSM.
Definition: maybeEpsilonFiniteStateMachineRunner.h:54
TuringSim::Runner::MachineRunner::ListenerIdType
ListenerType::IdType ListenerIdType
The type of identifiers used by the listener.
Definition: machineRunner.h:169
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::getWord
StorageType & getWord()
Get a reference to the memory of the machine.
Definition: maybeEpsilonFiniteStateMachineRunner.h:197
TuringSim::Memory::MemoryStructure< T, Word< T >, WordObserver< T >, WordModifier< T > >::Modifier
WordModifier< T > Modifier
The type of modifiers.
Definition: memoryStructure.h:120
TuringSim::Runner::MachineRunner::StorageType
MachineType::StorageType StorageType
The type of the memory of the machine.
Definition: machineRunner.h:153
TuringSim::Runner::MachineRunner
A class to run a simulate the execution of a Machine.
Definition: machineRunner.h:132
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::IsAlternating
MachineType::IsAlternating IsAlternating
std::true_type if the machine is alternating, std::false_type otherwise.
Definition: maybeEpsilonFiniteStateMachineRunner.h:75
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::observer
Memory::Word::Word< SymbolType >::Observer observer
Definition: maybeEpsilonFiniteStateMachineRunner.h:327
TuringSim::Runner::MaybeEpsilonFiniteStateMachineRunner< MachineType_, ListenerType_, std::tuple< ListenerConstructorArgs... > >::exec
virtual void exec() override
Run the machine until it halts.
Definition: maybeEpsilonFiniteStateMachineRunner.h:228
TuringSim::Runner::MachineRunner::MachineType
MachineType_ MachineType
The type of the simulated machine.
Definition: machineRunner.h:137