#pragma once
/*
* Copyright (C) 2024 Brett Terpstra
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef BLT_GP_CONFIG_H
#define BLT_GP_CONFIG_H
#include
#include
#include
#include
#include
#include
namespace blt::gp
{
struct prog_config_t
{
blt::size_t population_size = 500;
blt::size_t max_generations = 50;
blt::size_t initial_min_tree_size = 3;
blt::size_t initial_max_tree_size = 10;
// percent chance that we will do crossover
double crossover_chance = 0.8;
// percent chance that we will do mutation
double mutation_chance = 0.1;
// percent chance we will do reproduction (copy individual)
double reproduction_chance = 0.1;
// everything else will just be selected
blt::size_t elites = 0;
bool try_mutation_on_crossover_failure = true;
std::reference_wrapper mutator;
std::reference_wrapper crossover;
std::reference_wrapper pop_initializer;
blt::size_t threads = std::thread::hardware_concurrency();
// number of elements each thread should pull per execution. this is for granularity performance and can be optimized for better results!
blt::size_t evaluation_size = 4;
// default config (ramped half-and-half init) or for buildering
prog_config_t();
// default config with a user specified initializer
prog_config_t(const std::reference_wrapper& popInitializer); // NOLINT
prog_config_t(size_t populationSize, const std::reference_wrapper& popInitializer);
prog_config_t(size_t populationSize); // NOLINT
prog_config_t& set_pop_size(blt::size_t pop)
{
population_size = pop;
//evaluation_size = (population_size / threads) / 2;
return *this;
}
prog_config_t& set_initial_min_tree_size(blt::size_t size)
{
initial_min_tree_size = size;
return *this;
}
prog_config_t& set_initial_max_tree_size(blt::size_t size)
{
initial_max_tree_size = size;
return *this;
}
prog_config_t& set_crossover(crossover_t& ref)
{
crossover = {ref};
return *this;
}
prog_config_t& set_mutation(mutation_t& ref)
{
mutator = {ref};
return *this;
}
prog_config_t& set_initializer(population_initializer_t& ref)
{
pop_initializer = ref;
return *this;
}
prog_config_t& set_elite_count(blt::size_t new_elites)
{
elites = new_elites;
return *this;
}
prog_config_t& set_crossover_chance(double new_crossover_chance)
{
crossover_chance = new_crossover_chance;
return *this;
}
prog_config_t& set_mutation_chance(double new_mutation_chance)
{
mutation_chance = new_mutation_chance;
return *this;
}
prog_config_t& set_max_generations(blt::size_t new_max_generations)
{
max_generations = new_max_generations;
return *this;
}
prog_config_t& set_try_mutation_on_crossover_failure(bool new_try_mutation_on_crossover_failure)
{
try_mutation_on_crossover_failure = new_try_mutation_on_crossover_failure;
return *this;
}
prog_config_t& set_thread_count(blt::size_t t)
{
if (t == 0)
t = std::thread::hardware_concurrency();
threads = t;
//evaluation_size = (population_size / threads) / 2;
return *this;
}
prog_config_t& set_evaluation_size(blt::size_t s)
{
evaluation_size = s;
return *this;
}
prog_config_t& set_reproduction_chance(double chance)
{
reproduction_chance = chance;
return *this;
}
};
}
#endif //BLT_GP_CONFIG_H