radiate_engines/builder/
evaluators.rs1use 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}