use ruvector_tiny_dancer_core::{Candidate, Router, RouterConfig, RoutingRequest};
use std::collections::HashMap;
use std::time::Instant;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Tiny Dancer Routing Example with Timing ===\n");
let config = RouterConfig {
model_path: "./models/fastgrnn.safetensors".to_string(),
confidence_threshold: 0.85,
max_uncertainty: 0.15,
enable_circuit_breaker: true,
circuit_breaker_threshold: 5,
..Default::default()
};
let router = Router::new(config)?;
println!("Processing requests with timing information...\n");
for i in 0..3 {
let request_start = Instant::now();
println!("Request {} - Processing", i + 1);
let candidates = vec![
Candidate {
id: format!("candidate-{}-1", i),
embedding: vec![0.5; 384],
metadata: HashMap::new(),
created_at: chrono::Utc::now().timestamp(),
access_count: 10,
success_rate: 0.95,
},
Candidate {
id: format!("candidate-{}-2", i),
embedding: vec![0.3; 384],
metadata: HashMap::new(),
created_at: chrono::Utc::now().timestamp(),
access_count: 5,
success_rate: 0.85,
},
];
let request = RoutingRequest {
query_embedding: vec![0.5; 384],
candidates: candidates.clone(),
metadata: None,
};
match router.route(request) {
Ok(response) => {
let total_time = request_start.elapsed();
println!(
"\nRequest {}: Processed {} candidates in {}μs (total: {:?})",
i + 1,
response.candidates_processed,
response.inference_time_us,
total_time
);
for decision in response.decisions.iter().take(2) {
println!(
" - {} (confidence: {:.2}, lightweight: {})",
decision.candidate_id, decision.confidence, decision.use_lightweight
);
}
}
Err(e) => {
eprintln!("Error: {}", e);
}
}
println!();
}
println!("\n=== Routing Example Complete ===");
println!("\nTiming breakdown available in each response:");
println!("- inference_time_us: Total inference time");
println!("- feature_time_us: Feature engineering time");
println!("- candidates_processed: Number of candidates evaluated");
Ok(())
}