quantized_pathfinding/utils/
quantizer.rs1use 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], b: [T; DIM], pub n_levels: [usize; DIM], step_size: [T; DIM],
10}
11
12impl<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}