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);
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);