#[path = "support/flat_index.rs"]
mod flat_index;
use std::sync::Arc;
use std::time::Duration;
use flat_index::FlatIndex;
use iqdb_cache::{CacheConfig, CachedIndex, EvictionPolicy};
use iqdb_index::IndexCore;
use iqdb_types::{DistanceMetric, SearchParams, VectorId};
fn main() {
let mut index = FlatIndex::new(2);
for id in 0..8u64 {
index
.insert(VectorId::from(id), Arc::from(&[id as f32, 0.0][..]), None)
.expect("insert");
}
let config = CacheConfig::new()
.capacity(1024)
.ttl(Duration::from_secs(300))
.policy(EvictionPolicy::Lfu);
let mut cached = CachedIndex::with_config(index, config);
println!(
"configured: capacity={} ttl={:?} policy={:?}",
cached.capacity(),
cached.ttl(),
cached.policy()
);
let params = SearchParams::new(3, DistanceMetric::Euclidean);
let hot_set = [[1.0, 0.0], [2.0, 0.0], [1.0, 0.0], [2.0, 0.0], [1.0, 0.0]];
for q in hot_set {
let _ = cached.search(&q, ¶ms).expect("search");
}
let warm = cached.cache_stats();
println!(
"after warm-up: hits={} misses={} hit_rate={:.0}%",
warm.hits,
warm.misses,
warm.hit_rate() * 100.0
);
cached
.insert(VectorId::from(99u64), Arc::from(&[1.0, 0.0][..]), None)
.expect("insert");
let after = cached.search(&[1.0, 0.0], ¶ms).expect("search");
println!(
"after insert: top id={:?} (recomputed, never stale)",
after.first().map(|h| &h.id)
);
}