Skip to main content

math_audio_optimisation/
crossover_exponential.rs

1use 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    // ensure at least one parameter from mutant
15    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}