use edgevec::batch::BatchInsertable;
use edgevec::error::BatchError;
use edgevec::{HnswConfig, HnswIndex, VectorStorage};
fn main() -> Result<(), BatchError> {
println!("=== EdgeVec Batch Insert Example ===\n");
let config = HnswConfig::new(128);
let mut storage = VectorStorage::new(&config, None);
let mut index = HnswIndex::new(config, &storage).expect("Failed to create index");
println!("Created index with 128 dimensions");
let vectors: Vec<(u64, Vec<f32>)> = (1..=1000)
.map(|i| {
let vector: Vec<f32> = (0..128).map(|j| ((i + j) as f32).sin()).collect();
(i as u64, vector)
})
.collect();
println!("Prepared {} vectors for insertion", vectors.len());
println!("\nInserting vectors with progress tracking...");
let ids = index.batch_insert(
vectors,
&mut storage,
Some(|inserted, total| {
let percent = (inserted as f32 / total as f32) * 100.0;
println!(" Progress: {}/{} ({:.0}%)", inserted, total, percent);
}),
)?;
println!("\nSuccessfully inserted {} vectors", ids.len());
println!("Index now contains {} nodes", index.node_count());
println!("\n--- Second Batch (no progress tracking) ---");
let more_vectors: Vec<(u64, Vec<f32>)> = (1001..=2000)
.map(|i| {
let vector: Vec<f32> = (0..128).map(|j| ((i + j) as f32).cos()).collect();
(i as u64, vector)
})
.collect();
let more_ids = index.batch_insert(
more_vectors,
&mut storage,
None::<fn(usize, usize)>, )?;
println!("Inserted {} more vectors", more_ids.len());
println!("Index now contains {} total nodes", index.node_count());
println!("\n--- Search Verification ---");
let query: Vec<f32> = (0..128).map(|j| (1.0 + j as f32).sin()).collect();
let results = index.search(&query, 5, &storage).expect("Search failed");
println!("Top 5 nearest neighbors:");
for (i, result) in results.iter().enumerate() {
println!(
" {}. ID: {}, Distance: {:.4}",
i + 1,
result.vector_id.0,
result.distance
);
}
println!("\n--- Error Handling Demo ---");
let vectors_with_duplicate: Vec<(u64, Vec<f32>)> = vec![
(5001, vec![0.1; 128]), (1, vec![0.2; 128]), (5002, vec![0.3; 128]), ];
let partial_ids = index.batch_insert(
vectors_with_duplicate,
&mut storage,
None::<fn(usize, usize)>,
)?;
println!(
"Attempted 3 vectors, {} inserted (duplicate skipped)",
partial_ids.len()
);
println!("Index now contains {} total nodes", index.node_count());
println!("\n=== Example Complete ===");
Ok(())
}