53 #if !defined(LIBEVOCOSM_SIMPLE_FSM_H)
54 #define LIBEVOCOSM_SIMPLE_FSM_H
63 #include "evocommon.h"
64 #include "machine_tools.h"
77 template <
size_t InSize,
size_t OutSize>
141 void mutate(
double a_rate);
150 static void set_mutation_weight(
mutation_id a_type,
double a_weight);
159 size_t transition(
size_t a_input);
181 const tranout_t & get_transition(
size_t a_state,
size_t a_input)
const;
188 size_t num_input_states()
const;
195 size_t num_output_states()
const;
202 size_t init_state()
const;
209 size_t current_state()
const;
236 template <
size_t InSize,
size_t OutSize>
240 template <
size_t InSize,
size_t OutSize>
243 for (
size_t s = 0; s < m_size; ++s)
244 delete [] m_state_table[s];
246 delete [] m_state_table;
250 template <
size_t InSize,
size_t OutSize>
251 void simple_machine<InSize,OutSize>::deep_copy(
const simple_machine<InSize,OutSize> & a_source)
254 m_state_table =
new tranout_t * [m_size];
256 for (
size_t s = 0; s < m_size; ++s)
259 m_state_table[s] =
new tranout_t [InSize];
262 for (
size_t i = 0; i < InSize; ++i)
265 m_state_table[s][i].m_output = a_source.m_state_table[s][i].m_output;
271 template <
size_t InSize,
size_t OutSize>
273 : m_state_table(NULL),
280 throw std::runtime_error(
"invalid simple_machine creation parameters");
285 for (
size_t s = 0; s <
m_size; ++s)
291 for (
size_t i = 0; i < InSize; ++i)
304 template <
size_t InSize,
size_t OutSize>
306 : m_state_table(NULL),
309 m_size(a_parent1.m_size)
312 deep_copy(a_parent1);
321 for (
size_t n = x; n <
m_size; ++n)
324 for (
size_t i = 0; i < InSize; ++i)
342 template <
size_t InSize,
size_t OutSize>
344 : m_state_table(NULL),
345 m_init_state(a_source.m_init_state),
346 m_current_state(a_source.m_current_state),
347 m_size(a_source.m_size)
354 template <
size_t InSize,
size_t OutSize>
361 template <
size_t InSize,
size_t OutSize>
379 template <
size_t InSize,
size_t OutSize>
382 g_selector.set_weight(a_type,a_weight);
386 template <
size_t InSize,
size_t OutSize>
391 for (
size_t n = 0; n < m_size; ++n)
393 if (g_random.get_real() < a_rate)
396 switch (g_selector.get_index())
398 case MUTATE_OUTPUT_SYMBOL:
401 size_t state = rand_index(m_size);
402 size_t input = rand_index(InSize);
408 choice = rand_index(OutSize);
410 while (m_state_table[state][input].m_output == choice);
412 m_state_table[state][input].m_output = choice;
415 case MUTATE_TRANSITION:
418 size_t state = rand_index(m_size);
419 size_t input = rand_index(InSize);
425 choice = rand_index(m_size);
427 while (m_state_table[state][input].m_new_state == choice);
429 m_state_table[state][input].m_new_state = choice;
432 case MUTATE_REPLACE_STATE:
435 size_t state = rand_index(m_size);
438 delete [] m_state_table[state];
439 m_state_table[state] =
new tranout_t [InSize];
442 for (
size_t i = 0; i < InSize; ++i)
444 m_state_table[state][i].
m_new_state = rand_index(m_size);
445 m_state_table[state][i].m_output = rand_index(OutSize);
450 case MUTATE_SWAP_STATES:
453 size_t state1 = rand_index(m_size);
457 state2 = rand_index(m_size);
458 while (state2 == state1);
460 for (
size_t i = 0; i < InSize; ++i)
462 tranout_t temp = m_state_table[state1][i];
463 m_state_table[state1][i] = m_state_table[state2][i];
464 m_state_table[state2][i] = temp;
469 case MUTATE_INIT_STATE:
476 choice = rand_index(m_size);
478 while (m_init_state == choice);
480 m_init_state = choice;
489 m_current_state = m_init_state;
493 template <
size_t InSize,
size_t OutSize>
497 size_t output = m_state_table[m_current_state][a_input].m_output;
500 m_current_state = m_state_table[m_current_state][a_input].m_new_state;
507 template <
size_t InSize,
size_t OutSize>
510 m_current_state = m_init_state;
514 template <
size_t InSize,
size_t OutSize>
521 template <
size_t InSize,
size_t OutSize>
524 return m_state_table[a_state][a_input];
528 template <
size_t InSize,
size_t OutSize>
535 template <
size_t InSize,
size_t OutSize>
542 template <
size_t InSize,
size_t OutSize>
549 template <
size_t InSize,
size_t OutSize>
552 return m_current_state;