quantized_pathfinding/directed/
quantized_astar.rs

1//use std::ops::Add;
2use std::hash::Hash;
3use std::fmt::Debug;
4use pathfinding::directed::astar::astar;
5use pathfinding::num_traits::Zero;
6
7use crate::traits::{HasQuantizationMethods, FiniteFloat};
8
9// T - FiniteFloat
10// C - Cost
11// Q - Quantizer
12pub fn quantized_astar<T, C, const DIM: usize, Q, FN, IN, FH, FS>(
13    quantizer: &Q,
14    start: [T; DIM],
15    mut successors: FN,
16    mut heuristic: FH,
17    mut success: FS,
18) -> Option<(Vec<[T; DIM]>, C)>
19where
20    T: FiniteFloat,
21    C: Zero + Ord + Copy + Debug,
22    Q: HasQuantizationMethods<T, DIM>,
23    FN: FnMut(&[usize; DIM]) -> IN,
24    IN: IntoIterator<Item = ([usize; DIM], C)>,
25    FH: FnMut(&[usize; DIM]) -> C,
26    FS: FnMut(&[usize; DIM]) -> bool,
27{
28    let start_n = quantizer.quantize(start);
29    
30    let result = astar(
31        &start_n,
32        |n| successors(n),
33        |n| heuristic(n),
34        |n| success(n),
35    );
36
37    result.map(|(paths, cost)| {
38        let paths_in_float = paths.into_iter()
39            .map(|quantized| quantizer.dequantize(quantized))
40            .collect();
41        (paths_in_float, cost)
42    })
43}