pub trait VectorIndex: Send + Sync {
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn insert(&mut self, id: u128, vector: &[f32]) -> Result<(), String>;
fn search(&self, query: &[f32], k: usize) -> Result<Vec<(u128, f32)>, String>;
fn remove(&mut self, id: u128) -> Result<(), String>;
}
pub trait BinaryIndex: Send + Sync {
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn insert(&mut self, id: u128, code: &[u8]) -> Result<(), String>;
fn search(&self, query: &[u8], k: usize) -> Result<Vec<(u128, u32)>, String>;
}
pub fn l2_squared(a: &[f32], b: &[f32]) -> f32 {
a.iter().zip(b.iter()).map(|(x, y)| (x - y).powi(2)).sum()
}