use anyhow::Result;
use oxirs_vec::{
hnsw::{HnswConfig, HnswIndex},
Vector, VectorIndex, VectorStore,
};
fn main() -> Result<()> {
println!("=== OxiRS Vec - Getting Started ===\n");
basic_vector_operations()?;
simple_vector_store()?;
hnsw_index_example()?;
println!("\n=== All examples completed successfully! ===");
Ok(())
}
fn basic_vector_operations() -> Result<()> {
println!("1. Basic Vector Operations");
println!(" ---------------------");
let v1 = Vector::new(vec![1.0, 2.0, 3.0]);
let v2 = Vector::new(vec![4.0, 5.0, 6.0]);
println!(" Created vectors:");
println!(" v1: {:?}", v1.as_f32());
println!(" v2: {:?}", v2.as_f32());
let similarity = v1.cosine_similarity(&v2)?;
println!(" Cosine similarity: {:.4}", similarity);
let distance = v1.euclidean_distance(&v2)?;
println!(" Euclidean distance: {:.4}", distance);
let sum = v1.add(&v2)?;
println!(" v1 + v2 = {:?}", sum.as_f32());
let diff = v2.subtract(&v1)?;
println!(" v2 - v1 = {:?}", diff.as_f32());
let mut v3 = Vector::new(vec![3.0, 4.0, 0.0]);
println!(" Before normalization: magnitude = {:.4}", v3.magnitude());
v3.normalize();
println!(" After normalization: magnitude = {:.4}", v3.magnitude());
println!(" ✓ Vector operations complete\n");
Ok(())
}
fn simple_vector_store() -> Result<()> {
println!("2. Simple Vector Store");
println!(" ------------------");
let mut store = VectorStore::new();
println!(" Indexing vectors...");
let doc1 = Vector::new(vec![1.0, 0.0, 0.0]);
let doc2 = Vector::new(vec![0.0, 1.0, 0.0]);
let doc3 = Vector::new(vec![0.0, 0.0, 1.0]);
let doc4 = Vector::new(vec![0.7, 0.7, 0.0]);
store.index_vector("doc1".to_string(), doc1)?;
store.index_vector("doc2".to_string(), doc2)?;
store.index_vector("doc3".to_string(), doc3)?;
store.index_vector("doc4".to_string(), doc4)?;
println!(" Indexed 4 documents");
println!(" Searching for vectors similar to [1.0, 0.0, 0.0]...");
let query = Vector::new(vec![1.0, 0.0, 0.0]);
let results = store.similarity_search_vector(&query, 3)?;
println!(" Top 3 results:");
for (i, (id, score)) in results.iter().enumerate() {
println!(" {}. {} (similarity: {:.4})", i + 1, id, score);
}
println!(" ✓ Vector store complete\n");
Ok(())
}
fn hnsw_index_example() -> Result<()> {
println!("3. HNSW Index (High-Performance Search)");
println!(" -----------------------------------");
let config = HnswConfig {
m: 16, m_l0: 32, ml: 1.0 / (16.0_f64).ln(), ef: 100, ef_construction: 200, ..Default::default()
};
println!(" Creating HNSW index with:");
println!(" - M (connections): {}", config.m);
println!(" - ef_construction: {}", config.ef_construction);
println!(" - ef (search): {}", config.ef);
let mut index = HnswIndex::new(config)?;
println!(" Indexing 100 vectors...");
for i in 0..100 {
let values: Vec<f32> = (0..128)
.map(|j| {
let phase = (i as f32 * 0.1) + (j as f32 * 0.01);
phase.sin() * 0.5
})
.collect();
let vector = Vector::new(values);
index.insert(format!("vector_{:03}", i), vector)?;
}
println!(" Successfully indexed 100 vectors");
println!(" Performing similarity search...");
let query_values: Vec<f32> = (0..128).map(|j| ((j as f32) * 0.02).cos() * 0.5).collect();
let query = Vector::new(query_values);
let results = index.search_knn(&query, 5)?;
println!(" Top 5 most similar vectors:");
for (i, (id, score)) in results.iter().enumerate() {
println!(" {}. {} (similarity: {:.4})", i + 1, id, score);
}
println!(" ✓ HNSW index complete\n");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_operations() {
assert!(basic_vector_operations().is_ok());
}
#[test]
fn test_vector_store() {
assert!(simple_vector_store().is_ok());
}
#[test]
fn test_hnsw_index() {
assert!(hnsw_index_example().is_ok());
}
}