pub use scirs2_spatial::*;
#[cfg(test)]
mod tests {
use super::*;
use scirs2_core::ndarray::{array, Array2};
#[test]
fn test_kdtree_nearest_neighbor() {
let points = array![[2.0, 3.0], [5.0, 4.0], [9.0, 6.0], [4.0, 7.0], [8.0, 1.0],];
let tree = kdtree::KDTree::new(&points).expect("KDTree creation should succeed");
let query = vec![6.0, 5.0];
let (idx, dist) = tree.query(&query, 1).expect("query should succeed");
assert_eq!(idx.len(), 1);
assert_eq!(dist.len(), 1);
assert!(dist[0] >= 0.0);
}
#[test]
fn test_kdtree_k_nearest_neighbors() {
let points = array![[2.0, 3.0], [5.0, 4.0], [9.0, 6.0], [4.0, 7.0], [8.0, 1.0],];
let tree = kdtree::KDTree::new(&points).expect("KDTree creation should succeed");
let query = vec![6.0, 5.0];
let k = 3;
let (indices, distances) = tree.query(&query, k).expect("query should succeed");
assert_eq!(indices.len(), k);
assert_eq!(distances.len(), k);
for i in 0..k {
assert!(distances[i] >= 0.0);
if i > 0 {
assert!(distances[i] >= distances[i - 1]);
}
}
}
#[test]
fn test_kdtree_radius_query() {
let points = array![[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0], [5.0, 5.0],];
let tree = kdtree::KDTree::new(&points).expect("KDTree creation should succeed");
let query = vec![0.0, 0.0];
let radius = 1.5;
let (indices, distances) = tree
.query_radius(&query, radius)
.expect("query_radius should succeed");
assert!(indices.len() >= 3);
for &d in &distances {
assert!(d <= radius);
}
}
#[test]
fn test_distance_euclidean() {
let p1 = vec![1.0, 2.0, 3.0];
let p2 = vec![4.0, 5.0, 6.0];
let dist = distance::euclidean(&p1, &p2);
assert!((dist - 5.196).abs() < 0.01);
}
#[test]
fn test_distance_manhattan() {
let p1 = vec![1.0, 2.0, 3.0];
let p2 = vec![4.0, 5.0, 6.0];
let dist = distance::manhattan(&p1, &p2);
assert!((dist - 9.0).abs() < 1e-10);
}
#[test]
fn test_distance_chebyshev() {
let p1 = vec![1.0, 2.0, 3.0];
let p2 = vec![4.0, 5.0, 6.0];
let dist = distance::chebyshev(&p1, &p2);
assert!((dist - 3.0).abs() < 1e-10);
}
#[test]
fn test_distance_minkowski() {
let p1 = vec![1.0, 2.0, 3.0];
let p2 = vec![4.0, 5.0, 6.0];
let dist = distance::minkowski(&p1, &p2, 2.0);
let euclidean_dist = distance::euclidean(&p1, &p2);
assert!((dist - euclidean_dist).abs() < 1e-10);
}
#[test]
fn test_distance_pdist() {
let points = array![[0.0, 0.0], [3.0, 0.0], [0.0, 4.0],];
let dists = distance::pdist(&points, distance::euclidean);
assert_eq!(dists.nrows(), 3);
assert_eq!(dists.ncols(), 3);
assert!((dists[[0, 1]] - 3.0).abs() < 1e-10);
assert!((dists[[0, 2]] - 4.0).abs() < 1e-10);
assert!((dists[[1, 2]] - 5.0).abs() < 1e-10);
}
}