#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("🚀 Hive-GPU Metal Native Basic Example");
#[cfg(all(target_os = "macos", feature = "metal-native"))]
{
use hive_gpu::metal::MetalNativeContext;
use hive_gpu::{GpuContext, GpuDistanceMetric, GpuVector};
use std::collections::HashMap;
let context = MetalNativeContext::new()?;
println!("✅ Metal context created: {}", context.device_name());
let mut storage = context.create_storage(512, GpuDistanceMetric::Cosine)?;
println!("✅ Vector storage created with dimension 512");
let vectors = vec![
GpuVector {
id: "document_1".to_string(),
data: vec![1.0; 512],
metadata: {
let mut map = HashMap::new();
map.insert("title".to_string(), "Introduction to AI".to_string());
map.insert("category".to_string(), "technology".to_string());
map
},
},
GpuVector {
id: "document_2".to_string(),
data: vec![2.0; 512],
metadata: {
let mut map = HashMap::new();
map.insert("title".to_string(), "Machine Learning Basics".to_string());
map.insert("category".to_string(), "technology".to_string());
map
},
},
GpuVector {
id: "document_3".to_string(),
data: vec![3.0; 512],
metadata: {
let mut map = HashMap::new();
map.insert("title".to_string(), "Cooking Recipes".to_string());
map.insert("category".to_string(), "lifestyle".to_string());
map
},
},
];
let indices = storage.add_vectors(&vectors)?;
println!("✅ Added {} vectors to storage", indices.len());
println!("📊 Total vectors in storage: {}", storage.vector_count());
let query = vec![1.5; 512]; let results = storage.search(&query, 5)?;
println!("🔍 Search results for query vector:");
for (i, result) in results.iter().enumerate() {
println!(" {}. {} (score: {:.4})", i + 1, result.id, result.score);
}
if let Some(retrieved_vector) = storage.get_vector("document_1")? {
println!("📄 Retrieved vector: {}", retrieved_vector.id);
println!(
" Title: {}",
retrieved_vector
.metadata
.get("title")
.unwrap_or(&"N/A".to_string())
);
println!(
" Category: {}",
retrieved_vector
.metadata
.get("category")
.unwrap_or(&"N/A".to_string())
);
}
storage.remove_vectors(&["document_3".to_string()])?;
println!("🗑️ Removed document_3 from storage");
let retrieved_after_removal = storage.get_vector("document_3")?;
assert!(retrieved_after_removal.is_none());
println!("✅ Vector removal verified");
let batch_vectors = vec![
GpuVector {
id: "batch_1".to_string(),
data: vec![4.0; 512],
metadata: HashMap::new(),
},
GpuVector {
id: "batch_2".to_string(),
data: vec![5.0; 512],
metadata: HashMap::new(),
},
];
let batch_indices = storage.add_vectors(&batch_vectors)?;
println!("📦 Added {} vectors in batch", batch_indices.len());
let final_results = storage.search(&vec![2.5; 512], 3)?;
println!("🔍 Final search results:");
for (i, result) in final_results.iter().enumerate() {
println!(" {}. {} (score: {:.4})", i + 1, result.id, result.score);
}
println!("🎉 Example completed successfully!");
}
#[cfg(not(all(target_os = "macos", feature = "metal-native")))]
{
println!("⚠️ Metal Native is not available on this platform");
println!("This example requires macOS with the 'metal-native' feature enabled");
println!("To run this example:");
println!(" cargo run --example metal_basic --features metal-native");
}
Ok(())
}