use crate::core::metrics;
use crate::core::node;
use serde::de::DeserializeOwned;
pub trait ANNIndex<E: node::FloatElement, T: node::IdxType>: Send + Sync {
fn build(&mut self, mt: metrics::Metric) -> Result<(), &'static str>;
fn add_node(&mut self, item: &node::Node<E, T>) -> Result<(), &'static str>;
fn add(&mut self, vs: &[E], idx: T) -> Result<(), &'static str> {
self.add_node(&node::Node::new_with_idx(vs, idx))
}
fn madd(&mut self, vss: &[&[E]], indices: &[T]) -> Result<(), &'static str> {
if vss.len() != indices.len() {
return Err("vector's size is different with index");
}
for idx in 0..vss.len() {
let n = node::Node::new_with_idx(vss[idx], indices[idx].clone());
if let Err(err) = self.add_node(&n) {
return Err(err);
}
}
Ok(())
}
fn built(&self) -> bool;
fn rebuild(&mut self, _mt: metrics::Metric) -> Result<(), &'static str> {
Err("not implement")
}
fn node_search_k(&self, item: &node::Node<E, T>, k: usize) -> Vec<(node::Node<E, T>, E)>;
fn search_nodes(&self, item: &[E], k: usize) -> Vec<(node::Node<E, T>, E)> {
assert_eq!(item.len(), self.dimension());
self.node_search_k(&node::Node::new(item), k)
}
fn search(&self, item: &[E], k: usize) -> Vec<T> {
assert_eq!(item.len(), self.dimension());
self.node_search_k(&node::Node::new(item), k)
.iter()
.map(|x| x.0.idx().as_ref().unwrap().clone())
.collect::<Vec<T>>()
}
fn name(&self) -> &'static str;
fn nodes_size(&self) -> usize {
0
}
fn clear(&mut self) {}
fn idx_info(&self) -> String {
"not implement".to_string()
}
fn dimension(&self) -> usize {
0
}
}
pub trait SerializableIndex<
E: node::FloatElement + DeserializeOwned,
T: node::IdxType + DeserializeOwned,
>: Send + Sync + ANNIndex<E, T>
{
fn load(_path: &str) -> Result<Self, &'static str>
where
Self: Sized,
{
Err("empty implementation")
}
fn dump(&mut self, _path: &str) -> Result<(), &'static str> {
Err("empty implementation")
}
}