#[derive(Debug, Clone)]
pub enum KnnMethod {
#[cfg(feature = "hnsw")]
Hnsw(HnswParams),
Exact,
#[cfg(feature = "kdtree")]
KdTree,
#[cfg(feature = "ann-search")]
AnnSearchHnsw(HnswParams),
#[cfg(feature = "gpu")]
GpuExact,
#[cfg(feature = "gpu")]
GpuIvf(IvfGpuParams),
#[cfg(feature = "gpu")]
GpuNnDescent(NnDescentGpuParams),
Annoy,
}
#[derive(Debug, Clone, Default)]
#[cfg(feature = "gpu")]
pub struct IvfGpuParams {
pub n_list: Option<usize>,
pub n_probes: Option<usize>,
}
#[derive(Debug, Clone)]
#[cfg(feature = "gpu")]
pub struct NnDescentGpuParams {
pub k: Option<usize>,
pub k_build: Option<usize>,
pub n_trees: Option<usize>,
pub delta: f32,
pub rho: Option<f32>,
}
#[cfg(feature = "gpu")]
impl Default for NnDescentGpuParams {
fn default() -> Self {
Self {
k: None,
k_build: None,
n_trees: None,
delta: 0.001,
rho: None,
}
}
}
impl Default for KnnMethod {
fn default() -> Self {
#[cfg(feature = "ann-search")]
return Self::AnnSearchHnsw(HnswParams::default());
#[cfg(all(not(feature = "ann-search"), feature = "hnsw"))]
return Self::Hnsw(HnswParams::default());
#[cfg(all(not(feature = "ann-search"), not(feature = "hnsw")))]
return Self::Exact;
}
}
#[derive(Debug, Clone)]
pub struct HnswParams {
pub m: usize,
pub ef_construction: usize,
pub ef_search: usize,
pub quantization: Quantization,
}
impl Default for HnswParams {
fn default() -> Self {
Self {
m: 16,
ef_construction: 200,
ef_search: 50,
quantization: Quantization::F32,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Quantization {
#[default]
F32,
F16,
I8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DistanceMetric {
#[default]
Euclidean,
EuclideanSq,
Cosine,
Manhattan,
}