use std::error::Error;
use std::hint::black_box;
use std::time::Instant;
use elapsed::ElapsedDuration;
use kiddo::float::distance::SquaredEuclidean;
use rand::{Rng, SeedableRng};
use rayon::iter::IntoParallelRefIterator;
use rayon::iter::ParallelIterator;
use kiddo::immutable::float::kdtree::ImmutableKdTree;
use kiddo::test_utils::build_query_points_float;
const TREE_SIZE: usize = 2usize.pow(28); const QUERY_POINT_QTY: usize = 10_000_000;
fn main() -> Result<(), Box<dyn Error>> {
let mut rng = rand_chacha::ChaCha8Rng::from_os_rng();
let content_to_add: Vec<[f64; 4]> = (0..TREE_SIZE).map(|_| rng.random::<[f64; 4]>()).collect();
let start = Instant::now();
println!("Building an optimized tree of {TREE_SIZE:?} items...");
let tree: ImmutableKdTree<f64, usize, 4, 32> = ImmutableKdTree::new_from_slice(&content_to_add);
println!(
"Construction complete. ({})",
ElapsedDuration::new(start.elapsed())
);
let query_points = build_query_points_float(QUERY_POINT_QTY);
println!("Performing {QUERY_POINT_QTY:?} random NN queries...");
let start = Instant::now();
query_points.par_iter().for_each(|point| {
black_box(tree.nearest_one::<SquaredEuclidean>(point));
});
println!(
"Queries complete. ({})",
ElapsedDuration::new(start.elapsed())
);
Ok(())
}