neuro_config (macula_neuroevolution v0.28.0)

View Source

Configuration builder for neuroevolution server.

This module provides helper functions to construct #neuro_config{} records from maps, enabling clean integration with Elixir applications without requiring manual tuple construction.

Usage

From Elixir: config = :neuro_config.from_map(%{ population_size: 50, network_topology: {42, [24], 6}, evaluator_module: :my_evaluator }) {:ok, pid} = :neuroevolution_server.start_link(config)

Summary

Functions

Create a default configuration.

Create a configuration with the given overrides.

Build a #neuro_config{} record from a map.

Convert a #neuro_config{} record to a map.

Merge L0 actuator values into config.

Merge specific L0 params into config.

Types

mutation_config/0

-type mutation_config() ::
          #mutation_config{weight_mutation_rate :: float(),
                           weight_perturb_rate :: float(),
                           weight_perturb_strength :: float(),
                           add_node_rate :: float(),
                           add_connection_rate :: float(),
                           toggle_connection_rate :: float(),
                           add_sensor_rate :: float(),
                           add_actuator_rate :: float(),
                           mutate_neuron_type_rate :: float(),
                           mutate_time_constant_rate :: float()}.

self_play_config/0

-type self_play_config() ::
          #self_play_config{enabled :: boolean(),
                            archive_size :: pos_integer(),
                            archive_threshold :: float() | auto,
                            min_fitness_percentile :: float()}.

speciation_config/0

-type speciation_config() ::
          #speciation_config{enabled :: boolean(),
                             compatibility_threshold :: float(),
                             c1_excess :: float(),
                             c2_disjoint :: float(),
                             c3_weight_diff :: float(),
                             target_species :: pos_integer(),
                             threshold_adjustment_rate :: float(),
                             min_species_size :: pos_integer(),
                             max_stagnation :: non_neg_integer(),
                             species_elitism :: float(),
                             interspecies_mating_rate :: float()}.

Functions

default()

-spec default() ->
                 #neuro_config{population_size :: pos_integer(),
                               evaluations_per_individual :: pos_integer(),
                               selection_ratio :: float(),
                               mutation_rate :: float(),
                               mutation_strength :: float(),
                               reservoir_mutation_rate :: float() | undefined,
                               reservoir_mutation_strength :: float() | undefined,
                               readout_mutation_rate :: float() | undefined,
                               readout_mutation_strength :: float() | undefined,
                               topology_mutation_config :: mutation_config() | undefined,
                               max_evaluations :: pos_integer() | infinity,
                               max_generations :: pos_integer() | infinity,
                               target_fitness :: float() | undefined,
                               network_topology :: {pos_integer(), [pos_integer()], pos_integer()},
                               evaluator_module :: module(),
                               evaluator_options :: map(),
                               event_handler :: {module(), term()} | undefined,
                               meta_controller_config :: term() | undefined,
                               speciation_config :: speciation_config() | undefined,
                               self_play_config :: self_play_config() | undefined,
                               realm :: binary(),
                               publish_events :: boolean(),
                               evaluation_mode :: direct | distributed | mesh,
                               mesh_config :: map() | undefined,
                               evaluation_timeout :: pos_integer(),
                               max_concurrent_evaluations :: pos_integer() | undefined,
                               strategy_config :: term() | undefined,
                               lc_chain_config :: term() | undefined,
                               checkpoint_interval :: pos_integer() | undefined,
                               checkpoint_config :: map() | undefined}.

Create a default configuration.

Note: This creates a config with placeholder topology and evaluator. In practice, you should use from_map/1 with your actual values.

default(Overrides)

-spec default(map()) ->
                 #neuro_config{population_size :: pos_integer(),
                               evaluations_per_individual :: pos_integer(),
                               selection_ratio :: float(),
                               mutation_rate :: float(),
                               mutation_strength :: float(),
                               reservoir_mutation_rate :: float() | undefined,
                               reservoir_mutation_strength :: float() | undefined,
                               readout_mutation_rate :: float() | undefined,
                               readout_mutation_strength :: float() | undefined,
                               topology_mutation_config :: mutation_config() | undefined,
                               max_evaluations :: pos_integer() | infinity,
                               max_generations :: pos_integer() | infinity,
                               target_fitness :: float() | undefined,
                               network_topology :: {pos_integer(), [pos_integer()], pos_integer()},
                               evaluator_module :: module(),
                               evaluator_options :: map(),
                               event_handler :: {module(), term()} | undefined,
                               meta_controller_config :: term() | undefined,
                               speciation_config :: speciation_config() | undefined,
                               self_play_config :: self_play_config() | undefined,
                               realm :: binary(),
                               publish_events :: boolean(),
                               evaluation_mode :: direct | distributed | mesh,
                               mesh_config :: map() | undefined,
                               evaluation_timeout :: pos_integer(),
                               max_concurrent_evaluations :: pos_integer() | undefined,
                               strategy_config :: term() | undefined,
                               lc_chain_config :: term() | undefined,
                               checkpoint_interval :: pos_integer() | undefined,
                               checkpoint_config :: map() | undefined}.

Create a configuration with the given overrides.

from_map(Map)

-spec from_map(map()) ->
                  #neuro_config{population_size :: pos_integer(),
                                evaluations_per_individual :: pos_integer(),
                                selection_ratio :: float(),
                                mutation_rate :: float(),
                                mutation_strength :: float(),
                                reservoir_mutation_rate :: float() | undefined,
                                reservoir_mutation_strength :: float() | undefined,
                                readout_mutation_rate :: float() | undefined,
                                readout_mutation_strength :: float() | undefined,
                                topology_mutation_config :: mutation_config() | undefined,
                                max_evaluations :: pos_integer() | infinity,
                                max_generations :: pos_integer() | infinity,
                                target_fitness :: float() | undefined,
                                network_topology :: {pos_integer(), [pos_integer()], pos_integer()},
                                evaluator_module :: module(),
                                evaluator_options :: map(),
                                event_handler :: {module(), term()} | undefined,
                                meta_controller_config :: term() | undefined,
                                speciation_config :: speciation_config() | undefined,
                                self_play_config :: self_play_config() | undefined,
                                realm :: binary(),
                                publish_events :: boolean(),
                                evaluation_mode :: direct | distributed | mesh,
                                mesh_config :: map() | undefined,
                                evaluation_timeout :: pos_integer(),
                                max_concurrent_evaluations :: pos_integer() | undefined,
                                strategy_config :: term() | undefined,
                                lc_chain_config :: term() | undefined,
                                checkpoint_interval :: pos_integer() | undefined,
                                checkpoint_config :: map() | undefined}.

Build a #neuro_config{} record from a map.

All fields are optional - missing fields use sensible defaults. This function handles type coercion and validation.

Required fields (no reasonable defaults): - network_topology - {Inputs, HiddenLayers, Outputs} - evaluator_module - Module implementing neuroevolution_evaluator behaviour

Throws {missing_required_field, FieldName} if required field is missing.

to_map(Neuro_config)

-spec to_map(#neuro_config{population_size :: pos_integer(),
                           evaluations_per_individual :: pos_integer(),
                           selection_ratio :: float(),
                           mutation_rate :: float(),
                           mutation_strength :: float(),
                           reservoir_mutation_rate :: float() | undefined,
                           reservoir_mutation_strength :: float() | undefined,
                           readout_mutation_rate :: float() | undefined,
                           readout_mutation_strength :: float() | undefined,
                           topology_mutation_config :: mutation_config() | undefined,
                           max_evaluations :: pos_integer() | infinity,
                           max_generations :: pos_integer() | infinity,
                           target_fitness :: float() | undefined,
                           network_topology :: {pos_integer(), [pos_integer()], pos_integer()},
                           evaluator_module :: module(),
                           evaluator_options :: map(),
                           event_handler :: {module(), term()} | undefined,
                           meta_controller_config :: term() | undefined,
                           speciation_config :: speciation_config() | undefined,
                           self_play_config :: self_play_config() | undefined,
                           realm :: binary(),
                           publish_events :: boolean(),
                           evaluation_mode :: direct | distributed | mesh,
                           mesh_config :: map() | undefined,
                           evaluation_timeout :: pos_integer(),
                           max_concurrent_evaluations :: pos_integer() | undefined,
                           strategy_config :: term() | undefined,
                           lc_chain_config :: term() | undefined,
                           checkpoint_interval :: pos_integer() | undefined,
                           checkpoint_config :: map() | undefined}) ->
                map().

Convert a #neuro_config{} record to a map.

Useful for serialization, logging, and passing to Elixir code.

with_l0_params(Neuro_config)

-spec with_l0_params(#neuro_config{population_size :: pos_integer(),
                                   evaluations_per_individual :: pos_integer(),
                                   selection_ratio :: float(),
                                   mutation_rate :: float(),
                                   mutation_strength :: float(),
                                   reservoir_mutation_rate :: float() | undefined,
                                   reservoir_mutation_strength :: float() | undefined,
                                   readout_mutation_rate :: float() | undefined,
                                   readout_mutation_strength :: float() | undefined,
                                   topology_mutation_config :: mutation_config() | undefined,
                                   max_evaluations :: pos_integer() | infinity,
                                   max_generations :: pos_integer() | infinity,
                                   target_fitness :: float() | undefined,
                                   network_topology :: {pos_integer(), [pos_integer()], pos_integer()},
                                   evaluator_module :: module(),
                                   evaluator_options :: map(),
                                   event_handler :: {module(), term()} | undefined,
                                   meta_controller_config :: term() | undefined,
                                   speciation_config :: speciation_config() | undefined,
                                   self_play_config :: self_play_config() | undefined,
                                   realm :: binary(),
                                   publish_events :: boolean(),
                                   evaluation_mode :: direct | distributed | mesh,
                                   mesh_config :: map() | undefined,
                                   evaluation_timeout :: pos_integer(),
                                   max_concurrent_evaluations :: pos_integer() | undefined,
                                   strategy_config :: term() | undefined,
                                   lc_chain_config :: term() | undefined,
                                   checkpoint_interval :: pos_integer() | undefined,
                                   checkpoint_config :: map() | undefined}) ->
                        #neuro_config{population_size :: pos_integer(),
                                      evaluations_per_individual :: pos_integer(),
                                      selection_ratio :: float(),
                                      mutation_rate :: float(),
                                      mutation_strength :: float(),
                                      reservoir_mutation_rate :: float() | undefined,
                                      reservoir_mutation_strength :: float() | undefined,
                                      readout_mutation_rate :: float() | undefined,
                                      readout_mutation_strength :: float() | undefined,
                                      topology_mutation_config :: mutation_config() | undefined,
                                      max_evaluations :: pos_integer() | infinity,
                                      max_generations :: pos_integer() | infinity,
                                      target_fitness :: float() | undefined,
                                      network_topology ::
                                          {pos_integer(), [pos_integer()], pos_integer()},
                                      evaluator_module :: module(),
                                      evaluator_options :: map(),
                                      event_handler :: {module(), term()} | undefined,
                                      meta_controller_config :: term() | undefined,
                                      speciation_config :: speciation_config() | undefined,
                                      self_play_config :: self_play_config() | undefined,
                                      realm :: binary(),
                                      publish_events :: boolean(),
                                      evaluation_mode :: direct | distributed | mesh,
                                      mesh_config :: map() | undefined,
                                      evaluation_timeout :: pos_integer(),
                                      max_concurrent_evaluations :: pos_integer() | undefined,
                                      strategy_config :: term() | undefined,
                                      lc_chain_config :: term() | undefined,
                                      checkpoint_interval :: pos_integer() | undefined,
                                      checkpoint_config :: map() | undefined}.

Merge L0 actuator values into config.

When Liquid Conglomerate (LC) is enabled, this function gets the current hyperparameter values from the L0 controller and updates the config. This enables dynamic adaptation of mutation rates during training.

If task_l0_actuators is not running, returns the config unchanged.

Example: Config = neuro_config:from_map(#{...}), DynamicConfig = neuro_config:with_l0_params(Config), %% DynamicConfig now has L0-controlled mutation rates

with_l0_params(Neuro_config, L0Params)

-spec with_l0_params(#neuro_config{population_size :: pos_integer(),
                                   evaluations_per_individual :: pos_integer(),
                                   selection_ratio :: float(),
                                   mutation_rate :: float(),
                                   mutation_strength :: float(),
                                   reservoir_mutation_rate :: float() | undefined,
                                   reservoir_mutation_strength :: float() | undefined,
                                   readout_mutation_rate :: float() | undefined,
                                   readout_mutation_strength :: float() | undefined,
                                   topology_mutation_config :: mutation_config() | undefined,
                                   max_evaluations :: pos_integer() | infinity,
                                   max_generations :: pos_integer() | infinity,
                                   target_fitness :: float() | undefined,
                                   network_topology :: {pos_integer(), [pos_integer()], pos_integer()},
                                   evaluator_module :: module(),
                                   evaluator_options :: map(),
                                   event_handler :: {module(), term()} | undefined,
                                   meta_controller_config :: term() | undefined,
                                   speciation_config :: speciation_config() | undefined,
                                   self_play_config :: self_play_config() | undefined,
                                   realm :: binary(),
                                   publish_events :: boolean(),
                                   evaluation_mode :: direct | distributed | mesh,
                                   mesh_config :: map() | undefined,
                                   evaluation_timeout :: pos_integer(),
                                   max_concurrent_evaluations :: pos_integer() | undefined,
                                   strategy_config :: term() | undefined,
                                   lc_chain_config :: term() | undefined,
                                   checkpoint_interval :: pos_integer() | undefined,
                                   checkpoint_config :: map() | undefined},
                     map()) ->
                        #neuro_config{population_size :: pos_integer(),
                                      evaluations_per_individual :: pos_integer(),
                                      selection_ratio :: float(),
                                      mutation_rate :: float(),
                                      mutation_strength :: float(),
                                      reservoir_mutation_rate :: float() | undefined,
                                      reservoir_mutation_strength :: float() | undefined,
                                      readout_mutation_rate :: float() | undefined,
                                      readout_mutation_strength :: float() | undefined,
                                      topology_mutation_config :: mutation_config() | undefined,
                                      max_evaluations :: pos_integer() | infinity,
                                      max_generations :: pos_integer() | infinity,
                                      target_fitness :: float() | undefined,
                                      network_topology ::
                                          {pos_integer(), [pos_integer()], pos_integer()},
                                      evaluator_module :: module(),
                                      evaluator_options :: map(),
                                      event_handler :: {module(), term()} | undefined,
                                      meta_controller_config :: term() | undefined,
                                      speciation_config :: speciation_config() | undefined,
                                      self_play_config :: self_play_config() | undefined,
                                      realm :: binary(),
                                      publish_events :: boolean(),
                                      evaluation_mode :: direct | distributed | mesh,
                                      mesh_config :: map() | undefined,
                                      evaluation_timeout :: pos_integer(),
                                      max_concurrent_evaluations :: pos_integer() | undefined,
                                      strategy_config :: term() | undefined,
                                      lc_chain_config :: term() | undefined,
                                      checkpoint_interval :: pos_integer() | undefined,
                                      checkpoint_config :: map() | undefined}.

Merge specific L0 params into config.

This variant takes the L0 params directly, useful when you already have them.