quantized_pathfinding/traits/
mod.rs

1use std::{
2    ops::{ Add, Sub, Mul, Div,},
3    // convert
4};
5
6pub trait HasQuantizationMethods<T, const DIM: usize> {
7    fn quantize_ieee754(&self, x: [T; DIM]) -> [usize; DIM];
8    fn quantize(&self, x: [T; DIM]) -> [usize; DIM];
9    fn dequantize(&self, n: [usize; DIM]) -> [T; DIM];
10}
11
12// Loosen float. Looser than IEEE 754 since it is to work with the quantizer
13pub trait FiniteFloat:
14    Copy + 
15    Add<Output = Self> + 
16    Sub<Output = Self> + 
17    Mul<Output = Self> + 
18    Div<Output = Self> 
19{
20    // conversion
21    fn from_usize(n: usize) -> Self;
22    fn to_usize(self) -> usize;
23
24    // for quantization or similar operation
25    fn round_ieee754 (self) -> usize;
26    fn round(self) -> Self;
27}
28
29impl FiniteFloat for f32 {
30    fn from_usize(n: usize) -> Self {
31        n as f32
32    }
33    
34    fn to_usize(self) -> usize {
35        self as usize
36    }
37    
38    // IEEE 754 style round
39    fn round_ieee754 (self) -> usize {
40        self as usize
41    }
42
43    fn round(self) -> Self {
44        self.round()
45    }
46}
47
48impl FiniteFloat for f64 {
49    fn from_usize(n: usize) -> Self {
50        n as f64
51    }
52    
53    fn to_usize(self) -> usize {
54        self as usize
55    }
56
57    // IEEE 754 style round
58    fn round_ieee754 (self) -> usize {
59        self as usize
60    }
61    
62    fn round(self) -> Self {
63        self.round()
64    }
65}