math_audio_optimisation/
crossover_exponential.rs1use ndarray::Array1;
2use rand::Rng;
3
4pub(crate) fn exponential_crossover<R: Rng + ?Sized>(
5 target: &Array1<f64>,
6 mutant: &Array1<f64>,
7 cr: f64,
8 rng: &mut R,
9) -> Array1<f64> {
10 let n = target.len();
11 let mut trial = target.clone();
12 let mut j = rng.random_range(0..n);
13 let mut l = 0usize;
14 loop {
16 trial[j] = mutant[j];
17 l += 1;
18 j = (j + 1) % n;
19 if rng.random::<f64>() >= cr || l >= n {
20 break;
21 }
22 }
23 trial
24}