mod clone;
mod multi_gene;
mod multi_point;
mod par_multi_point;
mod single_gene;
mod single_point;
mod uniform;
mod wrapper;
pub use self::clone::Clone as CrossoverClone;
pub use self::multi_gene::MultiGene as CrossoverMultiGene;
pub use self::multi_point::MultiPoint as CrossoverMultiPoint;
pub use self::par_multi_point::ParMultiPoint as CrossoverParMultiPoint;
pub use self::single_gene::SingleGene as CrossoverSingleGene;
pub use self::single_point::SinglePoint as CrossoverSinglePoint;
pub use self::uniform::Uniform as CrossoverUniform;
pub use self::wrapper::Wrapper as CrossoverWrapper;
use crate::genotype::Genotype;
use crate::strategy::evolve::{EvolveConfig, EvolveReporter, EvolveState};
use rand::Rng;
use std::cmp::Ordering;
pub trait Crossover: Clone + Send + Sync + std::fmt::Debug {
fn call<G: Genotype, R: Rng, SR: EvolveReporter<Genotype = G>>(
&mut self,
genotype: &G,
state: &mut EvolveState<G>,
config: &EvolveConfig,
reporter: &mut SR,
rng: &mut R,
);
fn prepare_population<G: Genotype>(
&mut self,
state: &mut EvolveState<G>,
config: &EvolveConfig,
) -> usize {
let population_size = state.population.size();
match config.target_population_size.cmp(&population_size) {
Ordering::Greater => {
let parent_survivors =
(config.target_population_size - population_size).min(population_size);
state
.population
.chromosomes
.extend_from_within(..parent_survivors);
}
Ordering::Less => {
state.population.truncate(config.target_population_size);
}
Ordering::Equal => (),
}
population_size.min(config.target_population_size)
}
fn require_crossover_indexes(&self) -> bool {
false
}
fn require_crossover_points(&self) -> bool {
false
}
}