genetic_algorithm/crossover/
wrapper.rs1pub 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 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 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}