Skip to main content

math_audio_optimisation/
apply_integrality.rs

1use 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}