use crate::matrix::knn::all_pairs::knn_rows_l2;
use crate::matrix::knn::ivf::{knn_rows_ivf, IvfArgs, DEFAULT_N_PROBE};
use crate::matrix::knn::KNN_SEED;
use log::info;
use nalgebra::DMatrix;
pub const ALL_PAIRS_THRESHOLD: usize = 65_536;
pub fn knn_rows(rows: &DMatrix<f32>, n_neighbours: usize) -> (Vec<Vec<usize>>, Vec<Vec<f32>>) {
let nn = rows.nrows();
if nn <= ALL_PAIRS_THRESHOLD {
info!("kNN by the exact all-pairs kernel over {nn} points");
knn_rows_l2(rows, n_neighbours)
} else {
info!("kNN by the inverted-file search over {nn} points");
knn_rows_ivf(
rows,
&IvfArgs {
k: n_neighbours,
n_lists: 0,
n_probe: DEFAULT_N_PROBE,
seed: KNN_SEED,
},
)
}
}