1use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12pub enum DistanceMetric {
13 Cosine,
15 Euclidean,
17 DotProduct,
19 Manhattan,
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct SearchConfig {
26 pub metric: DistanceMetric,
28 pub parallel: bool,
30 pub normalize: bool,
32}
33
34impl Default for SearchConfig {
35 fn default() -> Self {
36 Self {
37 metric: DistanceMetric::Cosine,
38 parallel: true,
39 normalize: true,
40 }
41 }
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct SearchResult {
47 pub entity_id: String,
49 pub score: f32,
51 pub distance: f32,
53 pub rank: usize,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct IndexStats {
60 pub num_entities: usize,
62 pub dimensions: usize,
64 pub is_built: bool,
66 pub metric: DistanceMetric,
68}
69
70#[cfg(test)]
71mod tests {
72 use super::*;
73
74 #[test]
75 fn test_distance_metric() {
76 let metric = DistanceMetric::Cosine;
77 assert_eq!(metric, DistanceMetric::Cosine);
78 }
79
80 #[test]
81 fn test_search_config_default() {
82 let config = SearchConfig::default();
83 assert_eq!(config.metric, DistanceMetric::Cosine);
84 assert!(config.parallel);
85 assert!(config.normalize);
86 }
87}