1#[derive(Debug, Clone)]
5pub enum KnnMethod {
6 #[cfg(feature = "hnsw")]
8 Hnsw(HnswParams),
9
10 Exact,
12
13 #[cfg(feature = "kdtree")]
15 KdTree,
16
17 #[cfg(feature = "ann-search")]
19 AnnSearchHnsw(HnswParams),
20
21 #[cfg(feature = "gpu")]
23 GpuExact,
24
25 #[cfg(feature = "gpu")]
27 GpuIvf(IvfGpuParams),
28
29 #[cfg(feature = "gpu")]
31 GpuNnDescent(NnDescentGpuParams),
32
33 Annoy,
35}
36
37#[derive(Debug, Clone, Default)]
39#[cfg(feature = "gpu")]
40pub struct IvfGpuParams {
41 pub n_list: Option<usize>,
42 pub n_probes: Option<usize>,
43}
44
45#[derive(Debug, Clone)]
47#[cfg(feature = "gpu")]
48pub struct NnDescentGpuParams {
49 pub k: Option<usize>,
51 pub k_build: Option<usize>,
52 pub n_trees: Option<usize>,
53 pub delta: f32,
54 pub rho: Option<f32>,
55}
56
57#[cfg(feature = "gpu")]
58impl Default for NnDescentGpuParams {
59 fn default() -> Self {
60 Self {
61 k: None,
62 k_build: None,
63 n_trees: None,
64 delta: 0.001,
65 rho: None,
66 }
67 }
68}
69
70impl Default for KnnMethod {
71 fn default() -> Self {
72 #[cfg(feature = "ann-search")]
74 return Self::AnnSearchHnsw(HnswParams::default());
75 #[cfg(all(not(feature = "ann-search"), feature = "hnsw"))]
76 return Self::Hnsw(HnswParams::default());
77 #[cfg(all(not(feature = "ann-search"), not(feature = "hnsw")))]
78 return Self::Exact;
79 }
80}
81
82#[derive(Debug, Clone)]
84pub struct HnswParams {
85 pub m: usize,
87 pub ef_construction: usize,
89 pub ef_search: usize,
91 pub quantization: Quantization,
93}
94
95impl Default for HnswParams {
96 fn default() -> Self {
97 Self {
98 m: 16,
99 ef_construction: 200,
100 ef_search: 50,
101 quantization: Quantization::F32,
102 }
103 }
104}
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
108pub enum Quantization {
109 #[default]
110 F32,
111 F16,
112 I8,
113}
114
115#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
117pub enum DistanceMetric {
118 #[default]
119 Euclidean,
120 EuclideanSq,
121 Cosine,
122 Manhattan,
123}