math_audio_optimisation/
apply_integrality.rs1use ndarray::Array1;
2
3pub(crate) fn apply_integrality(
4 x: &mut Array1<f64>,
5 mask: &[bool],
6 lower: &Array1<f64>,
7 upper: &Array1<f64>,
8) {
9 for i in 0..x.len() {
10 if i < mask.len() && mask[i] {
11 x[i] = x[i].round();
12 if x[i] < lower[i] {
13 x[i] = lower[i].ceil();
14 }
15 if x[i] > upper[i] {
16 x[i] = upper[i].floor();
17 }
18 }
19 }
20}
21
22#[cfg(test)]
23mod tests {
24 use super::*;
25
26 #[test]
27 fn rounds_masked_dimensions_and_clamps_to_integer_bounds() {
28 let mut x = Array1::from(vec![1.6, 2.2, 9.9, -3.2]);
29 let mask = [true, false, true, true];
30 let lower = Array1::from(vec![0.0, 0.0, 0.0, -2.5]);
31 let upper = Array1::from(vec![10.0, 10.0, 4.2, 10.0]);
32
33 apply_integrality(&mut x, &mask, &lower, &upper);
34
35 assert_eq!(x[0], 2.0);
36 assert_eq!(x[1], 2.2);
37 assert_eq!(x[2], 4.0);
38 assert_eq!(x[3], -2.0);
39 }
40
41 #[test]
42 fn short_mask_leaves_missing_dimensions_continuous() {
43 let mut x = Array1::from(vec![1.6, 2.2]);
44 let mask = [true];
45 let lower = Array1::from(vec![0.0, 0.0]);
46 let upper = Array1::from(vec![10.0, 10.0]);
47
48 apply_integrality(&mut x, &mask, &lower, &upper);
49
50 assert_eq!(x[0], 2.0);
51 assert_eq!(x[1], 2.2);
52 }
53}