TuringSim
C++ framework to simulate abstract computing models
nonDeterministicSimpleAmnesicMachine.h
1 #pragma once
2 
3 #include <machine/amnesic/simpleAmnesicMachine.h>
4 #include <transition/amnesic/simpleAmnesicMachineTransition.h>
5 
16  template<
17  typename StateType,
18  AcceptingStyle acceptingStyle,
19  typename AcceptingConstructorArgs = typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs
20  >
22 
29  template<
30  typename StateType_,
31  AcceptingStyle acceptingStyle,
32  typename... Args
33  >
34  class NonDeterministicSimpleAmnesicMachine<StateType_, acceptingStyle, std::tuple<Args...>>
35  : public SimpleAmnesicMachine<StateType_, false, acceptingStyle> {
38  public:
39  using typename SimpleAmnesicMachine_::StateType;
40  using typename SimpleAmnesicMachine_::IsAccepting;
41  using typename SimpleAmnesicMachine_::StorageType;
42  using typename SimpleAmnesicMachine_::IsAlternating;
43  using typename SimpleAmnesicMachine_::TransitionType;
44  using typename SimpleAmnesicMachine_::ApplyHelperType;
45  using typename SimpleAmnesicMachine_::IsDeterministic;
46  using typename SimpleAmnesicMachine_::TransitionContainer;
47  using typename SimpleAmnesicMachine_::InitialStateContainer;
48  using typename SimpleAmnesicMachine_::OptionalHelpedTransition;
49 
50  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
51  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
52  static_assert(std::is_same_v<TransitionType, TransitionType_>);
53  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
54  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
55  static_assert(std::is_same_v<IsDeterministic, std::false_type>);
56  static_assert(std::is_same_v<TransitionContainer, std::vector<std::pair<const TransitionType&, ApplyHelperType>>>);
57  static_assert(std::is_same_v<InitialStateContainer, std::set<StateType>>);
58  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
59 
60  static_assert(std::is_same_v<StorageType, std::monostate>,
61  "StorageType should be a word.");
62  static_assert(std::is_same_v<TransitionType_, TransitionType>,
63  "TransitionType must be SimpleAmnesicMachineTransition");
64  static_assert(std::is_same_v<std::tuple<Args...>, typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs>,
65  "The only valid value for AcceptingConstructorArgs is the default parameter.");
66 
69 
70 #pragma clang diagnostic push
71 #pragma clang diagnostic ignored "-Wshadow-field"
72 
86  const std::set<StateType>& initialStates,
87  const std::vector<TransitionType>& transitions,
88  const std::set<StateType>& finalStates,
89  Args... args
90  ) :
91  SimpleAmnesicMachine_(finalStates, args...),
92  initialStates(initialStates),
93  transitions() {
94  for (const TransitionType& transition: transitions) {
95  this->transitions[transition.getPreState()].insert(transition);
96  }
97  }
98 
99 #pragma clang diagnostic pop
100 
103 
106 
111 
116 
118  virtual ~NonDeterministicSimpleAmnesicMachine() override = default;
119 
127  virtual InitialStateContainer getInitialStates() const noexcept override final {
128  return initialStates;
129  }
130 
143  virtual TransitionContainer getMatchingTransitionsFromState(const StateType& state) const noexcept override final {
144  if (typename std::map<StateType, std::set<TransitionType>>::const_iterator it = transitions.find(state); it != transitions.end()) {
145  TransitionContainer matchingTransitionsWithHelpers;
146  for (const TransitionType& matchingTransition: it->second) {
147  matchingTransitionsWithHelpers.push_back({matchingTransition, {}});
148  }
149  return matchingTransitionsWithHelpers;
150  }
151  return {};
152  }
153 
154  private:
155  std::set<StateType> initialStates;
156  std::map<StateType, std::set<TransitionType>> transitions;
157  };
158 }
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::NonDeterministicSimpleAmnesicMachine
NonDeterministicSimpleAmnesicMachine(const std::set< StateType > &initialStates, const std::vector< TransitionType > &transitions, const std::set< StateType > &finalStates, Args... args)
Builds a NonDeterministicSimpleAmnesicMachine from its components.
Definition: nonDeterministicSimpleAmnesicMachine.h:85
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::NonDeterministicSimpleAmnesicMachine
NonDeterministicSimpleAmnesicMachine()=delete
The deleted default constructor.
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::getMatchingTransitionsFromState
virtual TransitionContainer getMatchingTransitionsFromState(const StateType &state) const noexcept override final
Get matching transition for the next step.
Definition: nonDeterministicSimpleAmnesicMachine.h:143
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::Amnesic::NonDeterministicSimpleAmnesicMachine
Definition: nonDeterministicSimpleAmnesicMachine.h:21
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::getInitialStates
virtual InitialStateContainer getInitialStates() const noexcept override final
Returns the initial state of the machine.
Definition: nonDeterministicSimpleAmnesicMachine.h:127
TuringSim::Machine::Amnesic::SimpleAmnesicMachine
The base class of amnesic machine with simple state and explicit list of transitions.
Definition: simpleAmnesicMachine.h:46
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::operator=
NonDeterministicSimpleAmnesicMachine & operator=(NonDeterministicSimpleAmnesicMachine &&)=default
The default move assignment operator.
TuringSim::Transition::Amnesic::SimpleAmnesicMachineTransition
A simple transition of an amnesic machine: from an explicit state to an explicit state.
Definition: simpleAmnesicMachineTransition.h:13
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::operator=
NonDeterministicSimpleAmnesicMachine & operator=(const NonDeterministicSimpleAmnesicMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::NonDeterministicSimpleAmnesicMachine
NonDeterministicSimpleAmnesicMachine(NonDeterministicSimpleAmnesicMachine &&)=default
The default move constructor.
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::~NonDeterministicSimpleAmnesicMachine
virtual ~NonDeterministicSimpleAmnesicMachine() override=default
The default virtual destructor.
TuringSim::Machine::Amnesic
Namespace of amnesic machine, that is machines without memory.
TuringSim::Machine::Amnesic::NonDeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::NonDeterministicSimpleAmnesicMachine
NonDeterministicSimpleAmnesicMachine(const NonDeterministicSimpleAmnesicMachine &)=default
The default copy constructor.