use crate::chromosomes::Range as RangeChromosome;
use crate::operations::mutation::gaussian::GaussianConvertible;
use crate::traits::LinearChromosome;
use rand::Rng;
use std::fmt::Debug;
pub fn uniform_mutation<T>(individual: &mut RangeChromosome<T>)
where
T: Sync + Send + Clone + Default + Debug + PartialOrd + Copy + 'static + GaussianConvertible,
{
let len = individual.dna().len();
if len == 0 {
return;
}
let mut rng = crate::rng::make_rng();
let idx = rng.random_range(0..len);
let mut gene = individual.dna()[idx].clone();
if gene.ranges.is_empty() {
return;
}
let range_idx = rng.random_range(0..gene.ranges.len());
let (lo, hi) = gene.ranges[range_idx];
let lo_f64: f64 = T::to_f64(lo);
let hi_f64: f64 = T::to_f64(hi);
let new_val_f64: f64 = rng.random_range(lo_f64..=hi_f64);
gene.value = T::from_f64(new_val_f64);
individual.set_gene(idx, gene);
crate::log_debug!(
target: "mutation_events",
"Uniform mutation applied at idx={} range_idx={}",
idx, range_idx
);
}