genetic_algorithm/strategy/permutate/
builder.rs1use 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#[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}