35 #if !defined(LIBEVOCOSM_FSM_H)
36 #define LIBEVOCOSM_FSM_H
45 #include "evocommon.h"
46 #include "fsm_tools.h"
59 template <
size_t InSize,
size_t OutSize>
123 void mutate(
double a_rate);
132 static void set_mutation_weight(
mutation_id a_type,
double a_weight);
141 size_t transition(
size_t a_input);
163 const tranout_t & get_transition(
size_t a_state,
size_t a_input)
const;
170 size_t num_input_states()
const;
177 size_t num_output_states()
const;
184 size_t init_state()
const;
191 size_t current_state()
const;
218 template <
size_t InSize,
size_t OutSize>
222 template <
size_t InSize,
size_t OutSize>
225 for (
size_t s = 0; s < m_size; ++s)
226 delete [] m_state_table[s];
228 delete [] m_state_table;
232 template <
size_t InSize,
size_t OutSize>
233 void simple_fsm<InSize,OutSize>::deep_copy(
const simple_fsm<InSize,OutSize> & a_source)
236 m_state_table =
new tranout_t * [m_size];
238 for (
size_t s = 0; s < m_size; ++s)
241 m_state_table[s] =
new tranout_t [InSize];
244 for (
size_t i = 0; i < InSize; ++i)
247 m_state_table[s][i].m_output = a_source.m_state_table[s][i].m_output;
253 template <
size_t InSize,
size_t OutSize>
255 : m_state_table(NULL),
262 throw std::runtime_error(
"invalid simple_fsm creation parameters");
267 for (
size_t s = 0; s <
m_size; ++s)
273 for (
size_t i = 0; i < InSize; ++i)
286 template <
size_t InSize,
size_t OutSize>
288 : m_state_table(NULL),
291 m_size(a_parent1.m_size)
294 deep_copy(a_parent1);
303 for (
size_t n = x; n <
m_size; ++n)
306 for (
size_t i = 0; i < InSize; ++i)
324 template <
size_t InSize,
size_t OutSize>
326 : m_state_table(NULL),
327 m_init_state(a_source.m_init_state),
328 m_current_state(a_source.m_current_state),
329 m_size(a_source.m_size)
336 template <
size_t InSize,
size_t OutSize>
343 template <
size_t InSize,
size_t OutSize>
361 template <
size_t InSize,
size_t OutSize>
364 g_selector.set_weight(a_type,a_weight);
368 template <
size_t InSize,
size_t OutSize>
373 for (
size_t n = 0; n < m_size; ++n)
375 if (g_random.get_real() < a_rate)
378 switch (g_selector.get_index())
380 case MUTATE_OUTPUT_SYMBOL:
383 size_t state = rand_index(m_size);
384 size_t input = rand_index(InSize);
390 choice = rand_index(OutSize);
392 while (m_state_table[state][input].m_output == choice);
394 m_state_table[state][input].m_output = choice;
397 case MUTATE_TRANSITION:
400 size_t state = rand_index(m_size);
401 size_t input = rand_index(InSize);
407 choice = rand_index(m_size);
409 while (m_state_table[state][input].m_new_state == choice);
411 m_state_table[state][input].m_new_state = choice;
414 case MUTATE_REPLACE_STATE:
417 size_t state = rand_index(m_size);
420 delete [] m_state_table[state];
421 m_state_table[state] =
new tranout_t [InSize];
424 for (
size_t i = 0; i < InSize; ++i)
426 m_state_table[state][i].
m_new_state = rand_index(m_size);
427 m_state_table[state][i].m_output = rand_index(OutSize);
432 case MUTATE_SWAP_STATES:
435 size_t state1 = rand_index(m_size);
439 state2 = rand_index(m_size);
440 while (state2 == state1);
442 for (
size_t i = 0; i < InSize; ++i)
444 tranout_t temp = m_state_table[state1][i];
445 m_state_table[state1][i] = m_state_table[state2][i];
446 m_state_table[state2][i] = temp;
451 case MUTATE_INIT_STATE:
458 choice = rand_index(m_size);
460 while (m_init_state == choice);
462 m_init_state = choice;
471 m_current_state = m_init_state;
475 template <
size_t InSize,
size_t OutSize>
479 size_t output = m_state_table[m_current_state][a_input].m_output;
482 m_current_state = m_state_table[m_current_state][a_input].m_new_state;
489 template <
size_t InSize,
size_t OutSize>
492 m_current_state = m_init_state;
496 template <
size_t InSize,
size_t OutSize>
503 template <
size_t InSize,
size_t OutSize>
506 return m_state_table[a_state][a_input];
510 template <
size_t InSize,
size_t OutSize>
517 template <
size_t InSize,
size_t OutSize>
524 template <
size_t InSize,
size_t OutSize>
531 template <
size_t InSize,
size_t OutSize>
534 return m_current_state;
void reset()
Reset to start-up state.
Definition: simple_fsm.h:490
size_t m_init_state
Initial state.
Definition: simple_fsm.h:205
Wraps a roulette wheel for selecting mutations.
Definition: fsm_tools.h:77
static void set_mutation_weight(mutation_id a_type, double a_weight)
Set a mutation weight.
Definition: simple_fsm.h:362
tranout_t ** m_state_table
State table (the machine definition)
Definition: simple_fsm.h:202
size_t m_current_state
Current state.
Definition: simple_fsm.h:208
size_t num_output_states() const
Get number of output states.
Definition: simple_fsm.h:518
static size_t rand_index(size_t n)
Static function to allow use of g_random function pointer in random_shuffle.
Definition: evocommon.h:119
virtual ~simple_fsm()
Virtual destructor.
Definition: simple_fsm.h:337
simple_fsm & operator=(const simple_fsm< InSize, OutSize > &a_source)
Definition: simple_fsm.h:344
A set of common tools for finite state machines.
Definition: fsm_tools.h:47
simple_fsm(size_t a_size)
Creation constructor.
Definition: simple_fsm.h:254
size_t transition(size_t a_input)
Cause state transition.
Definition: simple_fsm.h:476
double get_real()
get the next value in the range [0,1)
Definition: evocommon.h:104
const tranout_t & get_transition(size_t a_state, size_t a_input) const
Get a transition from the internal state table.
Definition: simple_fsm.h:504
static mutation_selector g_selector
Global mutation selector.
Definition: simple_fsm.h:214
size_t m_output
The output value.
Definition: simple_fsm.h:70
static prng g_random
A shared random number generator.
Definition: evocommon.h:125
size_t m_size
Number of states.
Definition: simple_fsm.h:211
Defines a transition and output state pair.
Definition: simple_fsm.h:64
A finite state machine.
Definition: simple_fsm.h:60
size_t size() const
Get size.
Definition: simple_fsm.h:497
A toolkit and framework for implementing evolutionary algorithms.
Definition: evocommon.h:60
Elements shared by all classes in Evocosm.
Definition: evocommon.h:115
size_t num_input_states() const
Get number of input states.
Definition: simple_fsm.h:511
mutation_id
Types of mutation supported.
Definition: fsm_tools.h:51
size_t init_state() const
Get initial state.
Definition: simple_fsm.h:525
size_t m_new_state
The state to be transitioned to.
Definition: simple_fsm.h:67
size_t current_state() const
Get current state.
Definition: simple_fsm.h:532
void mutate(double a_rate)
Mutation.
Definition: simple_fsm.h:369