use crate::chromosomes::Range as RangeChromosome;
use crate::traits::ChromosomeT;
use rand::distr::uniform::SampleUniform;
use rand::Rng;
use std::borrow::Cow;
use std::fmt::Debug;
use super::ValueMutable;
pub fn value_mutation<T>(individual: &mut RangeChromosome<T>)
where
T: Sync + Send + Clone + Default + Debug + PartialOrd + SampleUniform + Copy + 'static,
{
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 dna = individual.dna().to_vec();
let mut gene = 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 new_val = rng.random_range(lo..=hi);
gene.value = new_val;
dna[idx] = gene;
individual.set_dna(Cow::Owned(dna));
}
impl ValueMutable for RangeChromosome<i32> {
fn value_mutate(&mut self) {
value_mutation(self);
}
fn creep_mutate(&mut self, step: f64) {
super::creep::creep_mutation(self, step as i32);
}
fn gaussian_mutate(&mut self, sigma: f64) {
super::gaussian::gaussian_mutation(self, sigma);
}
}
impl ValueMutable for RangeChromosome<i64> {
fn value_mutate(&mut self) {
value_mutation(self);
}
fn creep_mutate(&mut self, step: f64) {
super::creep::creep_mutation(self, step as i64);
}
fn gaussian_mutate(&mut self, sigma: f64) {
super::gaussian::gaussian_mutation(self, sigma);
}
}
impl ValueMutable for RangeChromosome<f32> {
fn value_mutate(&mut self) {
value_mutation(self);
}
fn creep_mutate(&mut self, step: f64) {
super::creep::creep_mutation(self, step as f32);
}
fn gaussian_mutate(&mut self, sigma: f64) {
super::gaussian::gaussian_mutation(self, sigma);
}
}
impl ValueMutable for RangeChromosome<f64> {
fn value_mutate(&mut self) {
value_mutation(self);
}
fn creep_mutate(&mut self, step: f64) {
super::creep::creep_mutation(self, step);
}
fn gaussian_mutate(&mut self, sigma: f64) {
super::gaussian::gaussian_mutation(self, sigma);
}
}