From 0bc4df6a1ab14ecf55d68cc86134d14b26eca6e5 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 28 May 2020 14:47:10 -0400 Subject: exhaustive: Implement an exhaustive search index --- src/lib.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index b1639d7..2f6504a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,7 @@ pub mod coords; pub mod distance; pub mod euclid; +pub mod exhaustive; pub use coords::Coordinates; pub use distance::{Distance, Metric, Proximity}; @@ -303,6 +304,12 @@ pub trait ExactNeighbors, V = K>: NearestNeighbors {} pub mod tests { use super::*; + use crate::exhaustive::ExhaustiveSearch; + + use rand::prelude::*; + + use std::iter::FromIterator; + type Point = Euclidean<[f32; 3]>; /// Test a [NearestNeighbors] implementation. @@ -313,6 +320,7 @@ pub mod tests { { test_empty(&from_iter); test_pythagorean(&from_iter); + test_random_points(&from_iter); } fn test_empty(from_iter: &F) @@ -385,4 +393,28 @@ pub mod tests { ] ); } + + fn test_random_points(from_iter: &F) + where + T: NearestNeighbors, + F: Fn(Vec) -> T, + { + let mut points = Vec::new(); + for _ in 0..256 { + points.push(Euclidean([random(), random(), random()])); + } + + let index = from_iter(points.clone()); + let eindex = ExhaustiveSearch::from_iter(points.clone()); + + let target = Euclidean([random(), random(), random()]); + + assert_eq!( + index.k_nearest(&target, 3), + eindex.k_nearest(&target, 3), + "target: {:?}, points: {:#?}", + target, + points, + ); + } } -- cgit v1.2.3