53 #if !defined(LIBEVOCOSM_FSM_H)
54 #define LIBEVOCOSM_FSM_H
65 #include "evocommon.h"
67 #include "machine_tools.h"
86 template <
typename InputT,
typename OutputT>
113 state_machine(
size_t a_size,
const std::vector<t_input> & a_inputs,
const std::vector<t_output> & a_outputs);
164 void mutate(
double a_rate,
const std::vector<t_input> & a_inputs,
const std::vector<t_output> & a_outputs, mutation_selector & a_selector = g_default_selector);
186 t_state_table get_table()
const;
193 size_t get_init_state()
const;
200 size_t get_current_state()
const;
220 t_input_map create_input_map(
const std::vector<t_input> & a_inputs,
const std::vector<t_output> & a_outputs);
224 template <
typename InputT,
typename OutputT>
228 template <
typename InputT,
typename OutputT>
236 if ((a_size < 2) || (a_inputs.size() < 1) || (a_outputs.size() < 1))
237 throw std::runtime_error(
"invalid state_machine creation parameters");
239 for (
size_t n = 0; n <
m_size; ++n)
242 m_state_table.push_back(create_input_map(a_inputs,a_outputs));
251 template <
typename InputT,
typename OutputT>
253 : m_state_table(a_parent1.m_state_table),
265 for (
size_t n = 0; n <
m_size; ++n)
285 template <
typename InputT,
typename OutputT>
287 : m_state_table(a_source.m_state_table),
288 m_init_state(a_source.m_init_state),
289 m_current_state(a_source.m_current_state),
290 m_size(a_source.m_size)
296 template <
typename InputT,
typename OutputT>
303 template <
typename InputT,
typename OutputT>
306 if (
this != &a_source)
318 template <
typename InputT,
typename OutputT>
320 const std::vector<t_input> & a_inputs,
321 const std::vector<t_output> & a_outputs,
322 mutation_selector & a_selector)
324 if (g_random.get_real() < a_rate)
327 switch (a_selector.get_index())
329 case MUTATE_OUTPUT_SYMBOL:
332 size_t state = rand_index(m_size);
333 size_t input = rand_index(a_inputs.size());
334 size_t output = rand_index(a_outputs.size());
335 m_state_table[state][a_inputs[input]].first = a_outputs[output];
338 case MUTATE_TRANSITION:
341 size_t state = rand_index(m_size);
342 size_t input = rand_index(a_inputs.size());
343 size_t new_state = rand_index(m_size);
344 m_state_table[state][a_inputs[input]].second = new_state;
347 case MUTATE_REPLACE_STATE:
350 size_t state = rand_index(m_size);
351 m_state_table[state] = create_input_map(a_inputs,a_outputs);
353 case MUTATE_SWAP_STATES:
356 size_t state1 = rand_index(m_size);
360 state2 = rand_index(m_size);
361 while (state2 == state1);
364 m_state_table[state1] = m_state_table[state2];
365 m_state_table[state2] = temp;
368 case MUTATE_INIT_STATE:
371 m_init_state = rand_index(m_size);
378 m_current_state = m_init_state;
382 template <
typename InputT,
typename OutputT>
386 t_transition & trans = m_state_table[m_current_state][a_input];
389 m_current_state = trans.second;
396 template <
typename InputT,
typename OutputT>
399 m_current_state = m_init_state;
403 template <
typename InputT,
typename OutputT>
406 return m_state_table;
410 template <
typename InputT,
typename OutputT>
417 template <
typename InputT,
typename OutputT>
420 return m_current_state;
424 template <
typename InputT,
typename OutputT>
428 size_t max_output = a_outputs.size();
431 t_input_map input_map;
434 for (
typename std::vector<t_input>::const_iterator input = a_inputs.begin(); input != a_inputs.end(); ++input)
437 t_output out_symbol = a_outputs[rand_index(max_output)];
438 size_t new_state = rand_index(m_size);
441 input_map[*input] = std::make_pair(out_symbol,new_state);
size_t get_init_state() const
Get initial state.
Definition: state_machine.h:411
InputT t_input
Exported input type.
Definition: state_machine.h:91
static mutation_selector g_default_selector
A static, default mutation selector.
Definition: state_machine.h:216
t_output transition(const state_machine< InputT, OutputT >::t_input &a_input)
Cause state transition.
Definition: state_machine.h:383
size_t m_current_state
Current state.
Definition: state_machine.h:213
void mutate(double a_rate, const std::vector< t_input > &a_inputs, const std::vector< t_output > &a_outputs, mutation_selector &a_selector=g_default_selector)
Mutation.
Definition: state_machine.h:319
t_state_table get_table() const
Get a copy of the internal table.
Definition: state_machine.h:404
OutputT t_output
Exported output type.
Definition: state_machine.h:94
virtual ~state_machine()
Virtual destructor.
Definition: state_machine.h:297
size_t get_current_state() const
Get current state.
Definition: state_machine.h:418
A toolkit and framework for implementing evolutionary algorithms.
Definition: analyzer.h:60
std::pair< t_output, size_t > t_transition
Type of a transition.
Definition: state_machine.h:97
size_t m_size
Number of states.
Definition: state_machine.h:207
state_machine & operator=(const state_machine< InputT, OutputT > &a_source)
Definition: state_machine.h:304
Elements shared by all classes in Evocosm.
Definition: evocommon.h:117
static prng g_random
A shared random number generator.
Definition: evocommon.h:127
A finite state machine.
Definition: state_machine.h:87
static size_t rand_index(size_t n)
Static function to allow use of g_random function pointer in random_shuffle.
Definition: evocommon.h:121
size_t m_init_state
Initial state.
Definition: state_machine.h:210
double get_real()
get the next value in the range [0,1)
Definition: evocommon.h:106
t_state_table m_state_table
State table (the machine definition)
Definition: state_machine.h:204
void reset()
Reset to start-up state.
Definition: state_machine.h:397
state_machine(size_t a_size, const std::vector< t_input > &a_inputs, const std::vector< t_output > &a_outputs)
Creation constructor.
Definition: state_machine.h:229
std::vector< t_input_map > t_state_table
State table (the machine)
Definition: state_machine.h:103
std::map< t_input, t_transition > t_input_map
Mapping inputs to outputs and state transitions.
Definition: state_machine.h:100