Skip to main content

math_audio_optimisation/
apply_wls.rs

1use ndarray::Array1;
2use rand::Rng;
3
4/// Wrapper Local Search (WLS) strategy for local refinement
5/// Uses Cauchy distribution to perturb selected dimensions
6pub(crate) fn apply_wls<R: Rng + ?Sized>(
7    x: &Array1<f64>,
8    lower: &Array1<f64>,
9    upper: &Array1<f64>,
10    scale: f64,
11    rng: &mut R,
12) -> Array1<f64> {
13    let mut result = x.clone();
14    let n_dims = x.len();
15
16    // Generate random wrapper mask - selects which dimensions to perturb
17    let n_selected = rng.random_range(1..=n_dims.max(1));
18    let mut dimensions: Vec<usize> = (0..n_dims).collect();
19    use rand::seq::SliceRandom;
20    dimensions.shuffle(rng);
21    let selected_dims = &dimensions[0..n_selected];
22
23    // Apply normal random perturbation to selected dimensions (simplified)
24    for &dim in selected_dims {
25        let perturbation = (rng.random::<f64>() - 0.5) * scale * 2.0;
26        let new_val = x[dim] + perturbation;
27        // Clip to bounds
28        result[dim] = new_val.max(lower[dim]).min(upper[dim]);
29    }
30
31    result
32}