use crate::distance::cosine_distance_normalized;
pub fn rerank(
query: &[f32],
candidates: &[(u32, f32)],
vectors: &[f32],
dimension: usize,
k: usize,
) -> Vec<(u32, f32)> {
let mut reranked: Vec<(u32, f32)> = candidates
.iter()
.map(|(id, _approx_dist)| {
let vec = get_vector(vectors, dimension, *id as usize);
let exact_dist = cosine_distance_normalized(query, vec);
(*id, exact_dist)
})
.collect();
reranked.sort_unstable_by(|a, b| a.1.total_cmp(&b.1));
reranked.into_iter().take(k).collect()
}
fn get_vector(vectors: &[f32], dimension: usize, idx: usize) -> &[f32] {
let start = idx * dimension;
let end = start + dimension;
&vectors[start..end]
}