feox-ann 0.1.0

Dependency-free HNSW approximate nearest neighbor index with deterministic, reproducible builds
Documentation
use feox_ann::{AnnConfig, AnnIndex, AnnQuery};

fn main() -> feox_ann::Result<()> {
    let mut index = AnnIndex::new(AnnConfig::for_dimensions(3))?;

    index.upsert("rust".to_string(), &[0.9, 0.1, 0.0])?;
    index.upsert("iron".to_string(), &[0.8, 0.2, 0.1])?;
    index.upsert("oxide".to_string(), &[0.7, 0.3, 0.2])?;
    index.upsert("feather".to_string(), &[0.0, 0.2, 0.9])?;

    let matches = index.query(AnnQuery {
        vector: &[1.0, 0.0, 0.0],
        top_k: 3,
        ef_search: None,
        filter: None,
    })?;
    println!("nearest to [1, 0, 0]:");
    for candidate in &matches {
        println!("  {} (score {:.4})", candidate.id, candidate.score);
    }

    let filter = |id: &str| id != "rust";
    let filtered = index.query(AnnQuery {
        vector: &[1.0, 0.0, 0.0],
        top_k: 3,
        ef_search: Some(16),
        filter: Some(&filter),
    })?;
    println!("same query, excluding \"rust\":");
    for candidate in &filtered {
        println!("  {} (score {:.4})", candidate.id, candidate.score);
    }

    index.delete("iron");
    let after_delete = index.query(AnnQuery {
        vector: &[1.0, 0.0, 0.0],
        top_k: 3,
        ef_search: None,
        filter: None,
    })?;
    println!("after deleting \"iron\": {} results", after_delete.len());

    Ok(())
}