evolutionary 0.1.1

A fully extensible Rust framework for using paralyzed genetic algorithms to solve problems.
Documentation
use rand::{thread_rng, Rng};
use rayon::prelude::{IntoParallelRefMutIterator, ParallelIterator};

use crate::{Individual, Mutation};

#[derive(Clone)]
pub struct SwapMutation {
    pub mutation_rate: f64,
}

impl SwapMutation {
    pub fn new(mutation_rate: f64) -> Self {
        Self { mutation_rate }
    }
}

impl Default for SwapMutation {
    fn default() -> Self {
        SwapMutation {
            mutation_rate: 0.05,
        }
    }
}

impl<T: Individual> Mutation<T> for SwapMutation {
    fn mutate(&self, population: &mut Vec<T>) {
        population.par_iter_mut().for_each_init(
            || thread_rng(),
            |rng, individual| {
                for j in 0..individual.get_chromosome().len() {
                    if rng.gen_bool(self.mutation_rate) {
                        let swap_with = rng.gen_range(0..individual.get_chromosome().len());

                        let temp = individual.get_gene(j);
                        individual.set_gene(j, individual.get_gene(swap_with));
                        individual.set_gene(swap_with, temp);
                    }
                }
            },
        );
    }
}