@@ -392,7 +392,7 @@ impl<'t, D: Distance> Reader<'t, D> {
392392
393393 // Get k nearest neighbors
394394 let k = opt. count . min ( nns_distances. len ( ) ) ;
395- let top_k = median_based_top_k ( nns_distances, k, ( OrderedFloat ( f32 :: MAX ) , u32 :: MAX ) ) ;
395+ let top_k = median_based_top_k ( nns_distances, k) ;
396396 let mut output = Vec :: with_capacity ( top_k. len ( ) ) ;
397397 for ( OrderedFloat ( dist) , item) in top_k {
398398 output. push ( ( item, D :: normalized_distance ( dist, self . dimensions ) ) ) ;
@@ -604,15 +604,16 @@ pub fn item_leaf<'a, D: Distance>(
604604}
605605
606606// Based on https://quickwit.io/blog/top-k-complexity, implemented in https://github.com/meilisearch/arroy/pull/129
607- pub fn median_based_top_k < T > ( v : Vec < T > , k : usize , mut threshold : T ) -> Vec < T >
608- where
609- T : Ord + Copy ,
610- {
607+ pub fn median_based_top_k (
608+ v : Vec < ( OrderedFloat < f32 > , u32 ) > ,
609+ k : usize ,
610+ ) -> Vec < ( OrderedFloat < f32 > , u32 ) > {
611+ let mut threshold = ( OrderedFloat ( f32:: MAX ) , u32:: MAX ) ;
611612 let mut buffer = Vec :: with_capacity ( 2 * k. max ( 1 ) ) ;
612613
613614 // prefill with no threshold checks
614615 let mut v = v. into_iter ( ) ;
615- buffer. extend ( ( & mut v) . take ( k) ) ;
616+ buffer. extend ( ( & mut v) . take ( 2 * k) ) ;
616617
617618 for item in v {
618619 if item >= threshold {
0 commit comments