use distances::Number;
use crate::{Dataset, Tree};
pub(crate) mod linear;
pub(crate) mod repeated_rnn;
pub(crate) mod sieve_v1;
#[derive(Clone, Copy, Debug)]
pub enum Algorithm {
Linear,
RepeatedRnn,
SieveV1,
}
impl Default for Algorithm {
fn default() -> Self {
Self::RepeatedRnn
}
}
impl Algorithm {
pub(crate) fn search<T, U, D>(self, tree: &Tree<T, U, D>, query: T, k: usize) -> Vec<(usize, U)>
where
T: Send + Sync + Copy,
U: Number,
D: Dataset<T, U>,
{
match self {
Self::Linear => linear::search(tree.data(), query, k, tree.indices()),
Self::RepeatedRnn => repeated_rnn::search(tree, query, k),
Self::SieveV1 => sieve_v1::search(tree, query, k),
}
}
}