nodedb_vector/
index_config.rs1use crate::hnsw::HnswParams;
6
7#[derive(
9 Debug,
10 Clone,
11 Default,
12 PartialEq,
13 Eq,
14 serde::Serialize,
15 serde::Deserialize,
16 zerompk::ToMessagePack,
17 zerompk::FromMessagePack,
18)]
19#[non_exhaustive]
20pub enum IndexType {
21 #[default]
23 Hnsw,
24 HnswPq,
26 IvfPq,
30}
31
32impl IndexType {
33 pub fn parse(s: &str) -> Option<Self> {
34 match s.to_lowercase().as_str() {
35 "hnsw" | "" => Some(Self::Hnsw),
36 "hnsw_pq" => Some(Self::HnswPq),
37 "ivf_pq" => Some(Self::IvfPq),
38 _ => None,
39 }
40 }
41}
42
43#[derive(
45 Debug,
46 Clone,
47 serde::Serialize,
48 serde::Deserialize,
49 zerompk::ToMessagePack,
50 zerompk::FromMessagePack,
51)]
52pub struct IndexConfig {
53 pub hnsw: HnswParams,
55 pub index_type: IndexType,
57 pub pq_m: usize,
59 pub ivf_cells: usize,
61 pub ivf_nprobe: usize,
63 #[serde(default)]
70 pub declared_dim: usize,
71}
72
73pub const DEFAULT_PQ_M: usize = 8;
75pub const DEFAULT_IVF_CELLS: usize = 256;
77pub const DEFAULT_IVF_NPROBE: usize = 16;
79
80impl Default for IndexConfig {
81 fn default() -> Self {
82 Self {
83 hnsw: HnswParams::default(),
84 index_type: IndexType::Hnsw,
85 pq_m: DEFAULT_PQ_M,
86 ivf_cells: DEFAULT_IVF_CELLS,
87 ivf_nprobe: DEFAULT_IVF_NPROBE,
88 declared_dim: 0,
89 }
90 }
91}
92
93impl IndexConfig {
94 pub fn to_ivf_params(&self) -> crate::ivf::IvfPqParams {
96 crate::ivf::IvfPqParams {
97 n_cells: self.ivf_cells,
98 pq_m: self.pq_m,
99 pq_k: 256,
100 nprobe: self.ivf_nprobe,
101 metric: self.hnsw.metric,
102 }
103 }
104}
105
106#[cfg(test)]
107mod tests {
108 use super::*;
109
110 #[test]
111 fn parse_index_type() {
112 assert_eq!(IndexType::parse("hnsw"), Some(IndexType::Hnsw));
113 assert_eq!(IndexType::parse(""), Some(IndexType::Hnsw));
114 assert_eq!(IndexType::parse("hnsw_pq"), Some(IndexType::HnswPq));
115 assert_eq!(IndexType::parse("ivf_pq"), Some(IndexType::IvfPq));
116 assert_eq!(IndexType::parse("ivfpq"), None);
117 assert_eq!(IndexType::parse("unknown"), None);
118 }
119
120 #[test]
121 fn default_is_hnsw() {
122 let cfg = IndexConfig::default();
123 assert_eq!(cfg.index_type, IndexType::Hnsw);
124 }
125}