1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use crate::engines::genome::genes::gene::Gene;
use crate::engines::genome::population::Population;
use crate::engines::optimize::Optimize;

use super::crossovers::crossover::Crossover;
use super::mutators::mutate::Mutate;

pub trait Alter<G, A>
where
    G: Gene<G, A>
{
    fn alter(&self, population: &mut Population<G, A>, optimize: &Optimize, generation: i32);
}


pub struct AlterWrap<G: Gene<G, A>, A> {
    pub rate: f32,
    pub mutator: Option<Box<dyn Mutate<G, A>>>,
    pub crossover: Option<Box<dyn Crossover<G, A>>>
}


pub enum Alterer<G: Gene<G, A>, A> {
    Mutator(f32),
    UniformCrossover(f32),
    MultiPointCrossover(f32, usize),
    SinglePointCrossover(f32),
    SwapMutator(f32),
    Mutation(Box<dyn Mutate<G, A>>),
    Crossover(Box<dyn Crossover<G, A>>),
}