radiate_engines/builder/
evaluators.rs

1use crate::GeneticEngineBuilder;
2use radiate_core::{Chromosome, Evaluator, Executor, FitnessEvaluator};
3use std::sync::Arc;
4
5#[derive(Clone)]
6pub struct EvaluationParams<C, T>
7where
8    C: Chromosome,
9    T: Clone,
10{
11    pub evaluator: Arc<dyn Evaluator<C, T>>,
12    pub fitness_executor: Arc<Executor>,
13    pub species_executor: Arc<Executor>,
14    pub bus_executor: Arc<Executor>,
15}
16
17impl<C, T> GeneticEngineBuilder<C, T>
18where
19    C: Chromosome + PartialEq + Clone,
20    T: Clone + Send,
21{
22    pub fn evaluator<V: Evaluator<C, T> + 'static>(mut self, evaluator: V) -> Self {
23        self.params.evaluation_params.evaluator = Arc::new(evaluator);
24        self
25    }
26
27    pub fn parallel(self) -> Self {
28        #[cfg(feature = "rayon")]
29        {
30            self.executor(Executor::WorkerPool)
31        }
32        #[cfg(not(feature = "rayon"))]
33        {
34            let num_cpus = std::thread::available_parallelism()
35                .map(|n| n.get())
36                .unwrap_or(4);
37            self.executor(Executor::FixedSizedWorkerPool(num_cpus))
38        }
39    }
40
41    pub fn executor(mut self, executor: Executor) -> Self {
42        let executor = Arc::new(executor);
43        self.params.evaluation_params = EvaluationParams {
44            evaluator: Arc::new(FitnessEvaluator::new(executor.clone())),
45            fitness_executor: executor.clone(),
46            species_executor: executor.clone(),
47            bus_executor: executor.clone(),
48        };
49        self
50    }
51
52    pub fn fitness_executor(mut self, executor: impl Into<Arc<Executor>>) -> Self {
53        self.params.evaluation_params.fitness_executor = executor.into();
54        self
55    }
56
57    pub fn species_executor(mut self, executor: impl Into<Arc<Executor>>) -> Self {
58        self.params.evaluation_params.species_executor = executor.into();
59        self
60    }
61
62    pub fn bus_executor(mut self, executor: impl Into<Arc<Executor>>) -> Self {
63        self.params.evaluation_params.bus_executor = executor.into();
64        self
65    }
66}