radiate-engines 1.3.1

Engines for the Radiate genetic algorithm library.
Documentation
use crate::GeneticEngineBuilder;
use radiate_core::{Chromosome, Evaluator, Executor, FitnessEvaluator, ThreadSync};
use std::sync::Arc;

#[derive(Clone, Debug, Default)]
pub struct ExecutorParams {
    pub changed: bool,
    pub executor: Arc<Executor>,
}

#[derive(Clone)]
pub struct EvaluationParams<C, T>
where
    C: Chromosome,
    T: Clone,
{
    pub evaluator: Arc<dyn Evaluator<C, T>>,
    pub fitness_executor: ExecutorParams,
    pub species_executor: ExecutorParams,
    pub event_stream_executor: ExecutorParams,
    pub sync: ThreadSync,
}

impl<C, T> GeneticEngineBuilder<C, T>
where
    C: Chromosome + PartialEq + Clone,
    T: Clone + Send,
{
    pub fn evaluator<V: Evaluator<C, T> + 'static>(mut self, evaluator: V) -> Self {
        self.params.evaluation_params.evaluator = Arc::new(evaluator);
        self
    }

    pub fn parallel(self) -> Self {
        #[cfg(feature = "rayon")]
        {
            self.executor(Executor::WorkerPool)
        }
        #[cfg(not(feature = "rayon"))]
        {
            let num_cpus = std::thread::available_parallelism()
                .map(|n| n.get())
                .unwrap_or(4);
            self.executor(Executor::FixedSizedWorkerPool(num_cpus))
        }
    }

    pub fn executor(mut self, executor: Executor) -> Self {
        let executor = Arc::new(executor);
        let param = ExecutorParams {
            changed: true,
            executor: Arc::clone(&executor),
        };

        self.params.evaluation_params = EvaluationParams {
            evaluator: Arc::new(FitnessEvaluator::new(Arc::clone(&executor))),
            fitness_executor: param.clone(),
            species_executor: param.clone(),
            event_stream_executor: param,
            sync: self.params.evaluation_params.sync.clone(),
        };
        self
    }

    pub fn fitness_executor(mut self, executor: impl Into<Arc<Executor>>) -> Self {
        self.params.evaluation_params.fitness_executor = ExecutorParams {
            changed: true,
            executor: executor.into(),
        };
        self
    }

    pub fn species_executor(mut self, executor: impl Into<Arc<Executor>>) -> Self {
        self.params.evaluation_params.species_executor = ExecutorParams {
            changed: true,
            executor: executor.into(),
        };
        self
    }

    pub fn stream_executor(mut self, executor: impl Into<Arc<Executor>>) -> Self {
        self.params.evaluation_params.event_stream_executor = ExecutorParams {
            changed: true,
            executor: executor.into(),
        };
        self
    }
}