quantized_pathfinding/utils/
quantizer.rs

1use crate::traits::{HasQuantizationMethods, FiniteFloat};
2use std::array::from_fn;
3
4#[derive(Debug, Clone, Copy)]
5pub struct Quantizer<T: FiniteFloat, const DIM: usize> {
6    a: [T; DIM],            // Lower bounds
7    b: [T; DIM],            // Upper bounds
8    pub n_levels: [usize; DIM], // ex. DIM=1,N=4: 0,1,2,3
9    step_size: [T; DIM],
10}
11
12// All intializations
13impl<T: FiniteFloat, const DIM: usize> Quantizer<T, DIM> {
14    pub fn with_n(a: [T; DIM], b: [T; DIM], n_levels: [usize; DIM]) -> Self {
15        let step_size = from_fn(|i| {
16            (b[i] - a[i]) / T::from_usize(n_levels[i].saturating_sub(1))
17        });
18        Quantizer { a, b, n_levels, step_size }
19    }
20
21    pub fn with_step_size(a: [T; DIM], b: [T; DIM], step_size: [T; DIM]) -> Self {
22        let n_levels = from_fn(|i| {
23            ((b[i] - a[i]) / step_size[i] + T::from_usize(1)).to_usize()
24        });
25        Quantizer { a, b, n_levels, step_size }
26    }
27}
28
29impl<T: FiniteFloat, const DIM: usize> HasQuantizationMethods<T, DIM> for Quantizer<T, DIM> {
30    fn quantize_ieee754(&self, x: [T; DIM]) -> [usize; DIM] {
31        from_fn(|i| {
32            ((x[i] - self.a[i]) / self.step_size[i]).round_ieee754()
33        })
34    }
35
36    fn quantize(&self, x: [T; DIM]) -> [usize; DIM] {
37        from_fn(|i| {
38            ((x[i] - self.a[i]) / self.step_size[i]).round().to_usize()
39        })
40    }
41
42    fn dequantize(&self, n: [usize; DIM]) -> [T; DIM] {
43        from_fn(|i| {
44            self.a[i] + T::from_usize(n[i]) * self.step_size[i]
45        })
46    }
47}