TuringSim
C++ framework to simulate abstract computing models
maybeEpsilonFiniteStateMachine.h
1 #pragma once
2 
3 #include <machine/FSM/stateAcceptingFiniteStateMachine.h>
4 #include <transition/FSM/maybeEpsilonFiniteStateMachineTransition.h>
5 
6 namespace TuringSim::Machine::FSM {
19  template <
20  typename StateType,
21  typename SymbolType,
22  AcceptingStyle acceptingStyle = AcceptingStyle::Accepting,
23  typename AcceptingConstructorArgs = typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs
24  >
26 
38  template <
39  typename StateType_,
40  typename SymbolType_,
41  AcceptingStyle acceptingStyle,
42  typename... Args
43  >
44  class MaybeEpsilonFiniteStateMachine<StateType_, SymbolType_, acceptingStyle, std::tuple<Args...>>
45  : public StateAcceptingFiniteStateMachine<Transition::FSM::MaybeEpsilonFiniteStateMachineTransition<StateType_, SymbolType_>, false, acceptingStyle, std::set, std::set>{
48  public:
49  using typename StateAcceptingFiniteStateMachine_::StateType;
50  using typename StateAcceptingFiniteStateMachine_::SymbolType;
51  using typename StateAcceptingFiniteStateMachine_::IsAccepting;
52  using typename StateAcceptingFiniteStateMachine_::StorageType;
53  using typename StateAcceptingFiniteStateMachine_::IsAlternating;
54  using typename StateAcceptingFiniteStateMachine_::TransitionType;
55  using typename StateAcceptingFiniteStateMachine_::ApplyHelperType;
56  using typename StateAcceptingFiniteStateMachine_::IsDeterministic;
57  using typename StateAcceptingFiniteStateMachine_::TransitionContainer;
58  using typename StateAcceptingFiniteStateMachine_::InitialStateContainer;
59  using typename StateAcceptingFiniteStateMachine_::OptionalHelpedTransition;
60 
61  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
62  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
63  static_assert(std::is_same_v<TransitionType, TransitionType_>);
64  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
65  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
66  static_assert(std::is_same_v<IsDeterministic, std::false_type>);
67  static_assert(std::is_same_v<TransitionContainer, std::set<std::pair<const TransitionType&, ApplyHelperType>>>);
68  static_assert(std::is_same_v<InitialStateContainer, std::set<StateType>>);
69  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
70 
71  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType>>,
72  "StorageType should be a word.");
73  static_assert(std::is_same_v<TransitionType_, TransitionType>,
74  "TransitionType must be MaybeEpsilonFiniteStateMachineTransition");
75  static_assert(std::is_same_v<std::tuple<Args...>, typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs>,
76  "The only valid value for AcceptingConstructorArgs is the default parameter.");
77 
80 
87  const std::set<StateType>& initialStates,
88  const std::vector<TransitionType>& transitions,
89  Args... acceptingArgs
90  ) :
91  StateAcceptingFiniteStateMachine_(acceptingArgs...),
92  initialStates(initialStates),
93  nonEpsilonTransitions(),
94  epsilonTransitions()
95  {
96  for(const TransitionType& transition: transitions) {
97  if(transition.getPreLetter()) {
98  this->nonEpsilonTransitions[transition.getPreState()][*transition.getPreLetter()].insert(transition);
99  }
100  else {
101  this->epsilonTransitions[transition.getPreState()].insert(transition);
102  }
103  }
104  }
105 
119  virtual ~MaybeEpsilonFiniteStateMachine() override = default;
120 
128  virtual InitialStateContainer getInitialStates() const noexcept override final {
129  return initialStates;
130  }
131 
146  const std::set<TransitionType>& getMatchingNonEpsilonTransitionsWithoutHelper(const StateType& state, const SymbolType& symbol) const {
147  return nonEpsilonTransitions.at(state).at(symbol);
148  }
149 
163  const std::set<TransitionType>& getMatchingEpsilonTransitionsWithoutHelper(const StateType& state) const {
164  return epsilonTransitions.at(state);
165  }
166 
177  virtual TransitionContainer getMatchingTransitionsFromCurrentLetter(const StateType& state, const std::optional<SymbolType>& symbol) const noexcept override final {
178  std::set<std::pair<const TransitionType&, ApplyHelperType>> r;
179  try {
180  for(const TransitionType& transition : getMatchingNonEpsilonTransitionsWithoutHelper(state, symbol.value())) {
181  r.insert({transition, std::monostate()});
182  }
183  }
184  catch (std::out_of_range) {
185  }
186  catch (std::bad_optional_access) {
187  }
188  try {
189  for(const TransitionType& transition : getMatchingEpsilonTransitionsWithoutHelper(state)) {
190  r.insert({transition, std::monostate()});
191  }
192  }
193  catch (std::out_of_range) {
194  }
195  return r;
196  }
197 
198 #pragma clang diagnostic push
199 #pragma clang diagnostic ignored "-Wunused-parameter"
200 
220  virtual bool isHaltingConfiguration(const StateType& state, const StorageType& storage) const noexcept override final {
221  if constexpr (acceptingStyle == AcceptingStyle::NonAccepting) {
222  } else if constexpr (acceptingStyle == AcceptingStyle::Accepting) {
223  if(StateAcceptingFiniteStateMachine_::isAcceptingState(state) && storage.isEndOfWord()) {
224  return true;
225  }
226  } else {
227  std::optional<bool> acceptance = Acceptance::toBool(StateAcceptingFiniteStateMachine_::isAcceptingState(state));
228  if (acceptance && *acceptance && storage.isEndOfWord()) {
229  return true;
230  }
231  }
232  typename std::map<StateType, std::set<TransitionType>>::const_iterator it = epsilonTransitions.find(state);
233  if (it != epsilonTransitions.end() && !it->second.empty()) {
234  return false;
235  }
236  return storage.isEndOfWord();
237  }
238 #pragma clang diagnostic pop
239 
240  protected:
243  std::set<StateType> initialStates;
244 
247  std::map<StateType, std::map<SymbolType, std::set<TransitionType>>> nonEpsilonTransitions;
248 
251  std::map<StateType, std::set<TransitionType>> epsilonTransitions;
252  };
253 }
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::MaybeEpsilonFiniteStateMachine
MaybeEpsilonFiniteStateMachine(const MaybeEpsilonFiniteStateMachine &)=default
The default copy constructor.
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::epsilonTransitions
std::map< StateType, std::set< TransitionType > > epsilonTransitions
Set of epsilon-transitions classified by pre-state.
Definition: maybeEpsilonFiniteStateMachine.h:251
TuringSim::Memory::Word::Word< SymbolType >
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::nonEpsilonTransitions
std::map< StateType, std::map< SymbolType, std::set< TransitionType > > > nonEpsilonTransitions
Set of non-epsilon-transitions in a 2-level maps, whose keys are pre-elements.
Definition: maybeEpsilonFiniteStateMachine.h:247
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::isHaltingConfiguration
virtual bool isHaltingConfiguration(const StateType &state, const StorageType &storage) const noexcept override final
Test if a given configuration is a halting one.
Definition: maybeEpsilonFiniteStateMachine.h:220
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::MaybeEpsilonFiniteStateMachine
MaybeEpsilonFiniteStateMachine()=delete
The deleted default constructor.
TuringSim::Machine::impl_details_::StateAcceptingMachineArgs
This class provide a single type AcceptingConstructorArgs that is the tuple of parameters used to dec...
Definition: stateAcceptingMachine.h:38
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::initialStates
std::set< StateType > initialStates
Definition: maybeEpsilonFiniteStateMachine.h:243
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::~MaybeEpsilonFiniteStateMachine
virtual ~MaybeEpsilonFiniteStateMachine() override=default
The default virtual destructor.
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::MaybeEpsilonFiniteStateMachine
MaybeEpsilonFiniteStateMachine(const std::set< StateType > &initialStates, const std::vector< TransitionType > &transitions, Args... acceptingArgs)
Builds a NonDeterministicSimpleFiniteStateMachine from its components.
Definition: maybeEpsilonFiniteStateMachine.h:86
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::getMatchingTransitionsFromCurrentLetter
virtual TransitionContainer getMatchingTransitionsFromCurrentLetter(const StateType &state, const std::optional< SymbolType > &symbol) const noexcept override final
Returns matching transition from the current state and symbol.
Definition: maybeEpsilonFiniteStateMachine.h:177
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::getMatchingNonEpsilonTransitionsWithoutHelper
const std::set< TransitionType > & getMatchingNonEpsilonTransitionsWithoutHelper(const StateType &state, const SymbolType &symbol) const
Returns matching non-epsilon transition without helpers from the current state and symbol.
Definition: maybeEpsilonFiniteStateMachine.h:146
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::operator=
MaybeEpsilonFiniteStateMachine & operator=(MaybeEpsilonFiniteStateMachine &&)=default
The default move assignment operator.
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::MaybeEpsilonFiniteStateMachine
MaybeEpsilonFiniteStateMachine(MaybeEpsilonFiniteStateMachine &&)=default
The default move constructor.
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition
Transition of finite state machines, i.e. transition on a word, without epsilon-transitions.
Definition: maybeEpsilonFiniteStateMachineTransition.h:18
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::operator=
MaybeEpsilonFiniteStateMachine & operator=(const MaybeEpsilonFiniteStateMachine &)=default
The default copy assignment operator.
TuringSim::Machine::FSM
Namespace of finite-state machines, that is whose storage is a word.
Definition: deterministicSimpleFiniteStateMachine.h:6
TuringSim::Machine::StateAcceptingMachine
Definition: stateAcceptingMachine.h:93
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine
The class to represent a finite state machine with epsilon-transitions.
Definition: maybeEpsilonFiniteStateMachine.h:25
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::getMatchingEpsilonTransitionsWithoutHelper
const std::set< TransitionType > & getMatchingEpsilonTransitionsWithoutHelper(const StateType &state) const
Returns matching epsilon transition without helpers from the current state.
Definition: maybeEpsilonFiniteStateMachine.h:163
TuringSim::Machine::FSM::MaybeEpsilonFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::getInitialStates
virtual InitialStateContainer getInitialStates() const noexcept override final
Returns the initial states of the machine.
Definition: maybeEpsilonFiniteStateMachine.h:128