genetic_algorithm/crossover/
wrapper.rs

1pub use super::clone::Clone as CrossoverClone;
2pub use super::multi_gene::MultiGene as CrossoverMultiGene;
3pub use super::multi_point::MultiPoint as CrossoverMultiPoint;
4pub use super::single_gene::SingleGene as CrossoverSingleGene;
5pub use super::single_point::SinglePoint as CrossoverSinglePoint;
6pub use super::uniform::Uniform as CrossoverUniform;
7pub use super::Crossover;
8
9use crate::genotype::EvolveGenotype;
10use crate::strategy::evolve::{EvolveConfig, EvolveState};
11use crate::strategy::StrategyReporter;
12use rand::Rng;
13
14#[derive(Clone, Debug)]
15pub enum Wrapper {
16    Clone(CrossoverClone),
17    SingleGene(CrossoverSingleGene),
18    SinglePoint(CrossoverSinglePoint),
19    MultiGene(CrossoverMultiGene),
20    MultiPoint(CrossoverMultiPoint),
21    Uniform(CrossoverUniform),
22}
23
24impl Crossover for Wrapper {
25    fn call<G: EvolveGenotype, R: Rng, SR: StrategyReporter<Genotype = G>>(
26        &mut self,
27        genotype: &mut G,
28        state: &mut EvolveState<G>,
29        config: &EvolveConfig,
30        reporter: &mut SR,
31        rng: &mut R,
32    ) {
33        match self {
34            Wrapper::Clone(crossover) => crossover.call(genotype, state, config, reporter, rng),
35            Wrapper::SingleGene(crossover) => {
36                crossover.call(genotype, state, config, reporter, rng)
37            }
38            Wrapper::SinglePoint(crossover) => {
39                crossover.call(genotype, state, config, reporter, rng)
40            }
41            Wrapper::MultiGene(crossover) => crossover.call(genotype, state, config, reporter, rng),
42            Wrapper::MultiPoint(crossover) => {
43                crossover.call(genotype, state, config, reporter, rng)
44            }
45            Wrapper::Uniform(crossover) => crossover.call(genotype, state, config, reporter, rng),
46        }
47    }
48
49    /// to guard against invalid Crossover strategies which break the internal consistency
50    /// of the genes, unique genotypes can't simply exchange genes without gene duplication issues
51    fn require_crossover_indexes(&self) -> bool {
52        match self {
53            Wrapper::Clone(crossover) => crossover.require_crossover_indexes(),
54            Wrapper::SingleGene(crossover) => crossover.require_crossover_indexes(),
55            Wrapper::SinglePoint(crossover) => crossover.require_crossover_indexes(),
56            Wrapper::MultiGene(crossover) => crossover.require_crossover_indexes(),
57            Wrapper::MultiPoint(crossover) => crossover.require_crossover_indexes(),
58            Wrapper::Uniform(crossover) => crossover.require_crossover_indexes(),
59        }
60    }
61    /// to guard against invalid Crossover strategies which break the internal consistency
62    /// of the genes, unique genotypes can't simply exchange genes without gene duplication issues
63    fn require_crossover_points(&self) -> bool {
64        match self {
65            Wrapper::Clone(crossover) => crossover.require_crossover_points(),
66            Wrapper::SingleGene(crossover) => crossover.require_crossover_points(),
67            Wrapper::SinglePoint(crossover) => crossover.require_crossover_points(),
68            Wrapper::MultiGene(crossover) => crossover.require_crossover_points(),
69            Wrapper::MultiPoint(crossover) => crossover.require_crossover_points(),
70            Wrapper::Uniform(crossover) => crossover.require_crossover_points(),
71        }
72    }
73}
74
75impl From<CrossoverClone> for Wrapper {
76    fn from(crossover: CrossoverClone) -> Self {
77        Wrapper::Clone(crossover)
78    }
79}
80impl From<CrossoverSingleGene> for Wrapper {
81    fn from(crossover: CrossoverSingleGene) -> Self {
82        Wrapper::SingleGene(crossover)
83    }
84}
85impl From<CrossoverSinglePoint> for Wrapper {
86    fn from(crossover: CrossoverSinglePoint) -> Self {
87        Wrapper::SinglePoint(crossover)
88    }
89}
90impl From<CrossoverMultiGene> for Wrapper {
91    fn from(crossover: CrossoverMultiGene) -> Self {
92        Wrapper::MultiGene(crossover)
93    }
94}
95impl From<CrossoverMultiPoint> for Wrapper {
96    fn from(crossover: CrossoverMultiPoint) -> Self {
97        Wrapper::MultiPoint(crossover)
98    }
99}
100impl From<CrossoverUniform> for Wrapper {
101    fn from(crossover: CrossoverUniform) -> Self {
102        Wrapper::Uniform(crossover)
103    }
104}