genetic_algorithm/strategy/permutate/
builder.rs

1use super::Permutate;
2pub use crate::errors::TryFromStrategyBuilderError as TryFromBuilderError;
3use crate::fitness::{Fitness, FitnessOrdering};
4use crate::genotype::PermutateGenotype;
5use crate::strategy::{Strategy, StrategyReporter, StrategyReporterNoop};
6
7/// The builder for an Permutate struct.
8#[derive(Clone, Debug)]
9pub struct Builder<
10    G: PermutateGenotype,
11    F: Fitness<Genotype = G>,
12    SR: StrategyReporter<Genotype = G>,
13> {
14    pub genotype: Option<G>,
15    pub fitness: Option<F>,
16    pub fitness_ordering: FitnessOrdering,
17    pub par_fitness: bool,
18    pub replace_on_equal_fitness: bool,
19    pub reporter: SR,
20}
21
22impl<G: PermutateGenotype, F: Fitness<Genotype = G>> Default
23    for Builder<G, F, StrategyReporterNoop<G>>
24{
25    fn default() -> Self {
26        Self {
27            genotype: None,
28            fitness_ordering: FitnessOrdering::Maximize,
29            par_fitness: false,
30            replace_on_equal_fitness: false,
31            fitness: None,
32            reporter: StrategyReporterNoop::new(),
33        }
34    }
35}
36impl<G: PermutateGenotype, F: Fitness<Genotype = G>> Builder<G, F, StrategyReporterNoop<G>> {
37    pub fn new() -> Self {
38        Self::default()
39    }
40}
41
42impl<G: PermutateGenotype, F: Fitness<Genotype = G>, SR: StrategyReporter<Genotype = G>>
43    Builder<G, F, SR>
44{
45    pub fn build(self) -> Result<Permutate<G, F, SR>, TryFromBuilderError> {
46        self.try_into()
47    }
48    pub fn with_genotype(mut self, genotype: G) -> Self {
49        self.genotype = Some(genotype);
50        self
51    }
52    pub fn with_fitness_ordering(mut self, fitness_ordering: FitnessOrdering) -> Self {
53        self.fitness_ordering = fitness_ordering;
54        self
55    }
56    pub fn with_par_fitness(mut self, par_fitness: bool) -> Self {
57        self.par_fitness = par_fitness;
58        self
59    }
60    pub fn with_replace_on_equal_fitness(mut self, replace_on_equal_fitness: bool) -> Self {
61        self.replace_on_equal_fitness = replace_on_equal_fitness;
62        self
63    }
64    pub fn with_fitness(mut self, fitness: F) -> Self {
65        self.fitness = Some(fitness);
66        self
67    }
68    pub fn with_reporter<SR2: StrategyReporter<Genotype = G>>(
69        self,
70        reporter: SR2,
71    ) -> Builder<G, F, SR2> {
72        Builder {
73            genotype: self.genotype,
74            fitness_ordering: self.fitness_ordering,
75            par_fitness: self.par_fitness,
76            replace_on_equal_fitness: self.replace_on_equal_fitness,
77            fitness: self.fitness,
78            reporter,
79        }
80    }
81}
82impl<G: PermutateGenotype, F: Fitness<Genotype = G>, SR: StrategyReporter<Genotype = G>>
83    Builder<G, F, SR>
84{
85    pub fn call(self) -> Result<Permutate<G, F, SR>, TryFromBuilderError> {
86        let mut permutate: Permutate<G, F, SR> = self.try_into()?;
87        permutate.call();
88        Ok(permutate)
89    }
90}