genetic_algorithm 0.27.1

A genetic algorithm implementation
Documentation
pub use super::clone::Clone as CrossoverClone;
pub use super::multi_gene::MultiGene as CrossoverMultiGene;
pub use super::multi_point::MultiPoint as CrossoverMultiPoint;
pub use super::rejuvenate::Rejuvenate as CrossoverRejuvenate;
pub use super::single_gene::SingleGene as CrossoverSingleGene;
pub use super::single_point::SinglePoint as CrossoverSinglePoint;
pub use super::uniform::Uniform as CrossoverUniform;
pub use super::Crossover;

use crate::genotype::{EvolveGenotype, SupportsGeneCrossover, SupportsPointCrossover};
use crate::strategy::evolve::{EvolveConfig, EvolveState};
use crate::strategy::StrategyReporter;
use rand::Rng;

#[derive(Clone, Debug)]
pub enum Wrapper<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover> {
    Clone(CrossoverClone<G>),
    MultiGene(CrossoverMultiGene<G>),
    MultiPoint(CrossoverMultiPoint<G>),
    Rejuvenate(CrossoverRejuvenate<G>),
    SingleGene(CrossoverSingleGene<G>),
    SinglePoint(CrossoverSinglePoint<G>),
    Uniform(CrossoverUniform<G>),
}

impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover> Crossover for Wrapper<G> {
    type Genotype = G;

    fn before(&mut self, genotype: &G, state: &mut EvolveState<G>, config: &EvolveConfig) {
        match self {
            Wrapper::Clone(crossover) => crossover.before(genotype, state, config),
            Wrapper::MultiGene(crossover) => crossover.before(genotype, state, config),
            Wrapper::MultiPoint(crossover) => crossover.before(genotype, state, config),
            Wrapper::Rejuvenate(crossover) => crossover.before(genotype, state, config),
            Wrapper::SingleGene(crossover) => crossover.before(genotype, state, config),
            Wrapper::SinglePoint(crossover) => crossover.before(genotype, state, config),
            Wrapper::Uniform(crossover) => crossover.before(genotype, state, config),
        }
    }

    fn call<R: Rng, SR: StrategyReporter<Genotype = G>>(
        &mut self,
        genotype: &G,
        state: &mut EvolveState<G>,
        config: &EvolveConfig,
        reporter: &mut SR,
        rng: &mut R,
    ) {
        match self {
            Wrapper::Clone(crossover) => crossover.call(genotype, state, config, reporter, rng),
            Wrapper::MultiGene(crossover) => crossover.call(genotype, state, config, reporter, rng),
            Wrapper::MultiPoint(crossover) => {
                crossover.call(genotype, state, config, reporter, rng)
            }
            Wrapper::Rejuvenate(crossover) => {
                crossover.call(genotype, state, config, reporter, rng)
            }
            Wrapper::SingleGene(crossover) => {
                crossover.call(genotype, state, config, reporter, rng)
            }
            Wrapper::SinglePoint(crossover) => {
                crossover.call(genotype, state, config, reporter, rng)
            }
            Wrapper::Uniform(crossover) => crossover.call(genotype, state, config, reporter, rng),
        }
    }

    fn after(&mut self, genotype: &G, state: &mut EvolveState<G>, config: &EvolveConfig) {
        match self {
            Wrapper::Clone(crossover) => crossover.after(genotype, state, config),
            Wrapper::MultiGene(crossover) => crossover.after(genotype, state, config),
            Wrapper::MultiPoint(crossover) => crossover.after(genotype, state, config),
            Wrapper::Rejuvenate(crossover) => crossover.after(genotype, state, config),
            Wrapper::SingleGene(crossover) => crossover.after(genotype, state, config),
            Wrapper::SinglePoint(crossover) => crossover.after(genotype, state, config),
            Wrapper::Uniform(crossover) => crossover.after(genotype, state, config),
        }
    }
}

impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover> From<CrossoverClone<G>>
    for Wrapper<G>
{
    fn from(crossover: CrossoverClone<G>) -> Self {
        Wrapper::Clone(crossover)
    }
}
impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover>
    From<CrossoverMultiGene<G>> for Wrapper<G>
{
    fn from(crossover: CrossoverMultiGene<G>) -> Self {
        Wrapper::MultiGene(crossover)
    }
}
impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover>
    From<CrossoverMultiPoint<G>> for Wrapper<G>
{
    fn from(crossover: CrossoverMultiPoint<G>) -> Self {
        Wrapper::MultiPoint(crossover)
    }
}
impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover>
    From<CrossoverRejuvenate<G>> for Wrapper<G>
{
    fn from(crossover: CrossoverRejuvenate<G>) -> Self {
        Wrapper::Rejuvenate(crossover)
    }
}
impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover>
    From<CrossoverSingleGene<G>> for Wrapper<G>
{
    fn from(crossover: CrossoverSingleGene<G>) -> Self {
        Wrapper::SingleGene(crossover)
    }
}
impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover>
    From<CrossoverSinglePoint<G>> for Wrapper<G>
{
    fn from(crossover: CrossoverSinglePoint<G>) -> Self {
        Wrapper::SinglePoint(crossover)
    }
}
impl<G: EvolveGenotype + SupportsGeneCrossover + SupportsPointCrossover>
    From<CrossoverUniform<G>> for Wrapper<G>
{
    fn from(crossover: CrossoverUniform<G>) -> Self {
        Wrapper::Uniform(crossover)
    }
}