pub mod core;
pub mod distributed;
pub mod hnsw;
pub mod index;
pub mod retrieval;
pub mod search;
pub mod similarity;
pub use core::{correction, resonator};
pub use hnsw::{HNSWConfig, HNSWIndex, HNSWStats};
pub use index::{BruteForceIndex, HierarchicalIndex, IndexConfig, RetrievalIndex};
pub use retrieval::*;
pub use search::{
approximate_search, batch_search, exact_search, exact_search_parallel, two_stage_search,
RankedResult, SearchConfig,
};
pub use similarity::{compute_similarity, SimilarityMetric};
pub use distributed::{
DistributedConfig, DistributedError, DistributedResult, DistributedSearch,
DistributedSearchBuilder, QueryStats, Shard, ShardAssigner, ShardId, ShardResult, ShardStatus,
ShardingStrategy,
};
use embeddenator_vsa::SparseVec;
use std::collections::HashMap;
pub struct IndexBuilder {
vectors: HashMap<String, SparseVec>,
}
impl IndexBuilder {
pub fn new() -> Self {
Self {
vectors: HashMap::new(),
}
}
pub fn add_vector(&mut self, id: String, vec: SparseVec) {
self.vectors.insert(id, vec);
}
pub fn build(self) -> SearchIndex {
SearchIndex {
vectors: self.vectors,
}
}
}
impl Default for IndexBuilder {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone)]
pub struct SearchIndex {
vectors: HashMap<String, SparseVec>,
}
pub struct QueryResult {
pub id: String,
pub score: f64,
}
pub struct QueryEngine {
index: SearchIndex,
}
impl QueryEngine {
pub fn new(index: SearchIndex) -> Self {
Self { index }
}
pub fn top_k(&self, query: &SparseVec, k: usize) -> Vec<QueryResult> {
let mut results: Vec<(String, f64)> = self
.index
.vectors
.iter()
.map(|(id, vec)| {
let score = compute_similarity(query, vec, SimilarityMetric::Cosine);
(id.clone(), score)
})
.collect();
results.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap_or(std::cmp::Ordering::Equal));
results.truncate(k);
results
.into_iter()
.map(|(id, score)| QueryResult { id, score })
.collect()
}
}
#[cfg(test)]
mod tests {
#[test]
fn component_loads() {
}
}