radiate_engines/builder/
species.rs1use crate::GeneticEngineBuilder;
2use radiate_core::{Chromosome, Diversity, Rate};
3use std::sync::Arc;
4
5#[derive(Clone)]
6pub struct SpeciesParams<C: Chromosome> {
7 pub diversity: Option<Arc<dyn Diversity<C>>>,
8 pub species_threshold: Rate,
9 pub max_species_age: usize,
10 pub target_species_count: Option<usize>,
11}
12
13impl<C, T> GeneticEngineBuilder<C, T>
14where
15 C: Chromosome + PartialEq + Clone,
16 T: Clone + Send,
17{
18 pub fn boxed_diversity(mut self, diversity: Option<Box<dyn Diversity<C>>>) -> Self {
19 self.params.species_params.diversity = diversity.map(|d| d.into());
20 self
21 }
22
23 pub fn diversity<D: Diversity<C> + 'static>(mut self, diversity: D) -> Self {
24 self.params.species_params.diversity = Some(Arc::new(diversity));
25 self
26 }
27
28 pub fn species_threshold(mut self, threshold: impl Into<Rate>) -> Self {
29 self.params.species_params.species_threshold = threshold.into();
30 self
31 }
32
33 pub fn max_species_age(mut self, max_species_age: usize) -> Self {
34 self.add_error_if(
35 || max_species_age < 1,
36 "max_species_age must be greater than 0",
37 );
38
39 self.params.species_params.max_species_age = max_species_age;
40 self
41 }
42
43 pub fn target_species(mut self, target_species_count: usize) -> Self {
44 self.add_error_if(
45 || target_species_count < 1,
46 "target_species_count must be greater than 0",
47 );
48
49 self.params.species_params.target_species_count = Some(target_species_count);
50 self
51 }
52}