gnx 0.1.0

Genetic Algorithm🧬, package for Rust🦀 & Python
Documentation
use crate::prelude::individual::Individual;
use std::fmt::Debug;

#[allow(dead_code)]
pub struct SolverWrapper<T: Debug>{
    population: Vec<Individual<T>>,
    mutation: fn(&mut T),
    mait: fn(&[&T]) -> T,
    selection: fn(&mut Vec<Individual<T>>),
    maiting_group: fn(&Vec<Individual<T>>) -> Vec<&[Individual<T>]>,
    fittness: fn(&T) -> f64,
}

impl<T:Debug> SolverWrapper<T> { 
    pub fn new(
        population: Vec<Individual<T>>,
        mutation: fn(&mut T),
        fittness: fn(&T) -> f64,
        mait: fn(&[&T]) -> T,
        maiting_group: fn(&Vec<Individual<T>>) ->Vec<&[Individual<T>]>,
        selection: fn(&mut Vec<Individual<T>>),
    ) -> Self{
        SolverWrapper{
            population,
            mutation,
            fittness,
            mait,
            maiting_group,
            selection,
        }
    }
}



#[cfg(test)]
mod tests{
    use super::*;

    fn runner<T: Debug>(solver: &mut SolverWrapper<T>){
        for indvidual in solver.population.iter_mut() {
            (solver.mutation)(indvidual.get_mut_chromosome());
            let value = (solver.fittness)(indvidual.get_chromosome());
            indvidual.set_fittness_score(value);
        }
        let maiting_group = (solver.maiting_group)(&solver.population);
        let mut offsprings: Vec<Individual<T>> = Vec::new();
        for parents in  maiting_group.into_iter(){
            let parents: Vec<&T> = parents
                        .into_iter()
                        .map(|val| val.get_chromosome())
                        .collect();
            let offspring = (solver.mait)(&parents);
            offsprings.push(Individual::new(offspring));
        }
        offsprings
            .into_iter()
            .for_each(|offspring| solver.population.push(offspring));
        println!("{:?}", solver.population);
    }

    #[test]
    fn simple_run_i32_array_size_2(){
        fn mutation(val: &mut [i32;2]){
            val[0] += 1;
            val[1] += 1;
        }
        fn fittness(val: &[i32;2]) -> f64{
            let sum : i32=  val.iter().sum();
            return sum as f64;
        }
        fn selection(population: &mut Vec<Individual<[i32;2]>>){
            population.retain(
                |val| {
                    match val.get_fittness_score() {
                        Some(_) => true,
                        None => false,
                    }
                });    
        }
        fn mait(parents: &[&[i32;2]])-> [i32;2]{
            let mut new_indv = [0;2];
            new_indv[0] = parents[0][1];
            new_indv[1] = parents[1][1];
            return new_indv;
        }
        fn maiting_group(population: &Vec<Individual<[i32;2]>>) -> Vec<&[Individual<[i32;2]>]>{
            let mut maiting_group : Vec<&[Individual<[i32;2]>]> = Vec::new();
            for group in population.chunks(2){
                maiting_group.push(group);
            }
            return maiting_group;
        }
        let mut population = Vec::<Individual<[i32;2]>>::new();
        for i in 0..20{
            let mut var = [0;2];
            var[0] = i;
            var[1] = i + 1;
            population.push(Individual::new(var));
        }
        let mut solver = SolverWrapper::<[i32;2]>::new(
            population,
            mutation,
            fittness,
            mait,
            maiting_group,
            selection,
        );
        runner(&mut solver);
    }

}