use std::sync::Arc;
use iqdb::{AsyncIqdb, DistanceMetric, Result, Vector, VectorId};
#[tokio::main]
async fn main() -> Result<()> {
let db = AsyncIqdb::open_in_memory(2, DistanceMetric::Euclidean).await?;
for i in 0..10u64 {
let x = i as f32;
db.upsert(VectorId::from(i), Vector::new(vec![x, 0.0])?, None)
.await?;
}
println!("stored {} vectors", db.len());
let db = Arc::new(db);
let mut tasks = Vec::new();
for target in [0.0f32, 4.0, 9.0] {
let db = Arc::clone(&db);
tasks.push(tokio::spawn(async move {
let hits = db
.search(Vector::new(vec![target, 0.0]).unwrap(), 1)
.await
.unwrap();
(target, hits[0].id.clone())
}));
}
for task in tasks {
let (target, id) = task.await.expect("task joined");
println!("nearest to [{target}, 0] = id {id}");
}
if let Ok(db) = Arc::try_unwrap(db) {
db.close().await?;
}
Ok(())
}