math_audio_optimisation/
apply_wls.rs1use ndarray::Array1;
2use rand::Rng;
3
4pub(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 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 for &dim in selected_dims {
25 let perturbation = (rng.random::<f64>() - 0.5) * scale * 2.0;
26 let new_val = x[dim] + perturbation;
27 result[dim] = new_val.max(lower[dim]).min(upper[dim]);
29 }
30
31 result
32}