#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum LogLevel {
Debug,
Info,
None,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub enum CacheType {
#[default]
Global,
ThreadLocal,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone)]
pub struct EvolutionOptions {
num_generations: usize,
log_level: LogLevel,
population_size: usize,
num_offsprings: usize,
parallel_threshold: usize,
use_caching: bool,
cache_type: CacheType,
}
impl EvolutionOptions {
pub fn new(
num_generations: usize,
log_level: LogLevel,
population_size: usize,
num_offsprings: usize,
) -> Self {
Self {
num_generations,
log_level,
population_size,
num_offsprings,
parallel_threshold: 1000, use_caching: false, cache_type: CacheType::Global,
}
}
pub fn new_with_threshold(
num_generations: usize,
log_level: LogLevel,
population_size: usize,
num_offsprings: usize,
parallel_threshold: usize,
) -> Self {
Self {
num_generations,
log_level,
population_size,
num_offsprings,
parallel_threshold,
use_caching: false, cache_type: CacheType::Global,
}
}
pub fn get_num_generations(&self) -> usize {
self.num_generations
}
pub fn get_log_level(&self) -> &LogLevel {
&self.log_level
}
pub fn get_population_size(&self) -> usize {
self.population_size
}
pub fn get_num_offspring(&self) -> usize {
self.num_offsprings
}
pub fn get_parallel_threshold(&self) -> usize {
self.parallel_threshold
}
pub fn get_use_caching(&self) -> bool {
self.use_caching
}
pub fn get_cache_type(&self) -> CacheType {
self.cache_type
}
pub fn set_num_generations(&mut self, num_generations: usize) {
self.num_generations = num_generations;
}
pub fn set_log_level(&mut self, log_level: LogLevel) {
self.log_level = log_level;
}
pub fn set_population_size(&mut self, population_size: usize) {
self.population_size = population_size;
}
pub fn set_num_offspring(&mut self, num_offsprings: usize) {
self.num_offsprings = num_offsprings;
}
pub fn set_parallel_threshold(&mut self, threshold: usize) {
self.parallel_threshold = threshold;
}
pub fn set_use_caching(&mut self, use_caching: bool) {
self.use_caching = use_caching;
}
pub fn set_cache_type(&mut self, cache_type: CacheType) {
self.cache_type = cache_type;
}
pub fn builder() -> EvolutionOptionsBuilder {
EvolutionOptionsBuilder::default()
}
}
impl Default for EvolutionOptions {
fn default() -> Self {
Self {
num_generations: 100,
log_level: LogLevel::None,
population_size: 2,
num_offsprings: 20,
parallel_threshold: 1000, use_caching: false, cache_type: CacheType::Global,
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Default)]
pub struct EvolutionOptionsBuilder {
num_generations: Option<usize>,
log_level: Option<LogLevel>,
population_size: Option<usize>,
num_offsprings: Option<usize>,
parallel_threshold: Option<usize>,
use_caching: Option<bool>,
cache_type: Option<CacheType>,
}
impl EvolutionOptionsBuilder {
pub fn num_generations(mut self, value: usize) -> Self {
self.num_generations = Some(value);
self
}
pub fn log_level(mut self, value: LogLevel) -> Self {
self.log_level = Some(value);
self
}
pub fn population_size(mut self, value: usize) -> Self {
self.population_size = Some(value);
self
}
pub fn num_offspring(mut self, value: usize) -> Self {
self.num_offsprings = Some(value);
self
}
pub fn parallel_threshold(mut self, value: usize) -> Self {
self.parallel_threshold = Some(value);
self
}
pub fn use_caching(mut self, value: bool) -> Self {
self.use_caching = Some(value);
self
}
pub fn cache_type(mut self, value: CacheType) -> Self {
self.cache_type = Some(value);
self
}
pub fn build(self) -> EvolutionOptions {
EvolutionOptions {
num_generations: self.num_generations.unwrap_or(100),
log_level: self.log_level.unwrap_or(LogLevel::None),
population_size: self.population_size.unwrap_or(2),
num_offsprings: self.num_offsprings.unwrap_or(20),
parallel_threshold: self.parallel_threshold.unwrap_or(1000),
use_caching: self.use_caching.unwrap_or(false),
cache_type: self.cache_type.unwrap_or(CacheType::Global),
}
}
}