use crate::traits::distance_metric::calc_dists;
pub(crate) fn update_nearest(
dists: &[f32; 64],
items: &[usize; 64],
best_dist: &mut f32,
best_item: &mut usize,
) {
let (leaf_best_item, leaf_best_dist) = dists
.iter()
.enumerate()
.min_by(|&(_, &a), (_, b)| a.partial_cmp(*b).unwrap())
.unwrap();
if *leaf_best_dist < *best_dist {
*best_dist = *leaf_best_dist;
*best_item = items[leaf_best_item];
}
}
#[inline(never)]
pub fn bench_update_nearest_f32_64(
content_points: &[[f32; 64]; 3],
items: &[usize; 64],
query: &[f32; 3],
) -> (f32, usize) {
let mut best_dist = f32::INFINITY;
let mut best_item = 0usize;
let mut acc = [0f32; 64];
calc_dists(content_points, &mut acc, query);
update_nearest(&acc, items, &mut best_dist, &mut best_item);
(best_dist, best_item)
}