pub(crate) use crate::traits::ChromosomeT;
use log::{debug, trace};
use rand::Rng;
pub fn inversion<U: ChromosomeT>(individual: &mut U) {
debug!(target="mutation_events", method="inversion"; "Starting the inversion mutation");
if individual.dna().len() < 2 {
return;
}
let mut rng = crate::rng::make_rng();
let len = individual.dna().len();
let (index_1, index_2) = (rng.random_range(0..len), rng.random_range(0..len));
let (lower_index, higher_index) = if index_1 < index_2 {
(index_1, index_2)
} else {
(index_2, index_1)
};
trace!(target="mutation_events", method="inversion"; "Mutation lower index: {}, mutation higher index: {}", lower_index, higher_index);
for i in 0..(higher_index - lower_index) / 2 {
let gene_start = individual.dna()[lower_index + i].clone();
let gene_end = individual.dna()[higher_index - i].clone();
individual.set_gene(lower_index + i, gene_end);
individual.set_gene(higher_index - i, gene_start);
}
debug!(target="mutation_events", method="inversion"; "Inversion mutation finished");
}