evolutionary 0.1.1

A fully extensible Rust framework for using paralyzed genetic algorithms to solve problems.
Documentation
use rand::{Rng, thread_rng};
use rand::prelude::IteratorRandom;
use rayon::iter::ParallelIterator;
use rayon::prelude::ParallelSliceMut;
use crate::{Crossover, Individual};
use crate::crossover::NPointsCrossover;
use crate::population::Bin;

impl Crossover<Bin> for NPointsCrossover {
    fn crossover(&self, population: &mut Vec<Bin>) {
        population.par_chunks_mut(2).for_each_init(
            || thread_rng(),
            |mut rng, chunk| {
                if rng.gen_bool(self.crossover_rate) {
                    let mut parent1 = chunk[0].clone();
                    let mut parent2 = chunk[1].clone();

                    let len = parent1.get_chromosome().len();

                    let mut points: Vec<usize> = (0..len).choose_multiple(&mut rng, self.n_points);

                    points.sort();

                    let mut start = 0;

                    for point in points {
                        NPointsCrossover::swap_sections(
                            &mut parent1.get_mut_chromosome(),
                            &mut parent2.get_mut_chromosome(),
                            start,
                            point,
                        );

                        start = point;
                    }

                    chunk[0] = parent1;
                    chunk[1] = parent2;
                }
            },
        );
    }
}