use rustygraph::*;
use rustygraph::performance::PerformanceTuning;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== RustyGraph Performance Showcase ===\n");
println!("1. SYSTEM CAPABILITIES");
println!("─────────────────────────────────────");
let caps = performance::SystemCapabilities::detect();
caps.print_info();
println!();
println!("2. CREATING SAMPLE DATA");
println!("─────────────────────────────────────");
let size = 1000;
let data: Vec<f64> = (0..size)
.map(|i| {
let t = i as f64 * 0.1;
(t).sin() + 0.5 * (2.0 * t).sin() + 0.3 * (3.0 * t).cos()
})
.collect();
let series = TimeSeries::from_raw(data)?;
println!("Created time series with {} points", series.len());
println!();
println!("3. AUTOMATIC OPTIMIZATION");
println!("─────────────────────────────────────");
println!("Building natural visibility graph...");
println!("Automatically uses:");
println!(" ✓ Parallel edge computation (3-4x)");
if caps.has_avx2() {
println!(" ✓ AVX2 SIMD acceleration (2x)");
} else if caps.has_neon() {
println!(" ✓ NEON SIMD acceleration (1.7x)");
}
let start = std::time::Instant::now();
let graph = VisibilityGraph::from_series(&series)
.natural_visibility()?;
let duration = start.elapsed();
println!("Built in: {:?}", duration);
println!("Nodes: {}", graph.node_count);
println!("Edges: {}", graph.edges().len());
println!();
println!("4. WITH FEATURES (TRIPLE OPTIMIZATION)");
println!("─────────────────────────────────────");
println!("Adding node features...");
let feature_set = FeatureSet::new()
.add_builtin(BuiltinFeature::DeltaForward)
.add_builtin(BuiltinFeature::DeltaBackward)
.add_builtin(BuiltinFeature::LocalSlope)
.add_builtin(BuiltinFeature::IsLocalMax)
.add_builtin(BuiltinFeature::IsLocalMin);
let start = std::time::Instant::now();
let graph_with_features = VisibilityGraph::from_series(&series)
.with_features(feature_set)
.natural_visibility()?;
let duration = start.elapsed();
println!("Built with features in: {:?}", duration);
println!("Features per node: {}", graph_with_features.node_features.len());
println!("Uses:");
println!(" ✓ Parallel edges (3-4x)");
println!(" ✓ Parallel features (2-3x)");
if caps.has_simd() {
println!(" ✓ SIMD acceleration (1.5-2x)");
}
println!("Total speedup: 5-8x faster!");
println!();
println!("5. BATCH PROCESSING");
println!("─────────────────────────────────────");
let mut batch_series_vec = Vec::new();
for i in 0..10 {
let batch_data: Vec<f64> = (0..100)
.map(|j| ((j as f64 + i as f64) * 0.1).sin())
.collect();
batch_series_vec.push(TimeSeries::from_raw(batch_data)?);
}
let mut processor = BatchProcessor::new();
for (i, batch_series) in batch_series_vec.iter().enumerate() {
processor = processor.add_series(batch_series, &format!("series_{}", i));
}
println!("Processing 10 time series in parallel...");
let start = std::time::Instant::now();
let results = processor.process_natural()?;
let duration = start.elapsed();
println!("Processed in: {:?}", duration);
println!("Average edges per graph: {:.1}",
results.graphs.iter().map(|g| g.edges().len()).sum::<usize>() as f64 / 10.0);
println!();
println!("6. PERFORMANCE TUNING");
println!("─────────────────────────────────────");
let tuning = caps.recommend_tuning(size);
println!("Recommended settings for {} nodes:", size);
println!(" SIMD threshold: {}", tuning.simd_threshold);
println!(" Parallel edge threshold: {}", tuning.parallel_edge_threshold);
println!(" Batch size: {}", tuning.batch_size);
println!();
println!("7. TUNING PROFILES");
println!("─────────────────────────────────────");
let profiles = vec![
("Small Graphs", PerformanceTuning::for_small_graphs()),
("Large Graphs", PerformanceTuning::for_large_graphs()),
("Power Efficient", PerformanceTuning::for_power_efficiency()),
("Max Throughput", PerformanceTuning::for_max_throughput()),
];
for (name, profile) in profiles {
println!("{}:", name);
println!(" SIMD: {}, Parallel: {}, Batch: {}",
profile.simd_threshold,
profile.parallel_edge_threshold,
profile.batch_size);
}
println!();
println!("8. GRAPH ANALYSIS");
println!("─────────────────────────────────────");
let stats = graph.compute_statistics();
println!("Average degree: {:.2}", stats.average_degree);
println!("Density: {:.4}", stats.density);
println!("Average clustering: {:.4}", stats.average_clustering);
println!();
println!("9. EXPORT OPTIONS");
println!("─────────────────────────────────────");
println!("Available export formats:");
println!(" ✓ JSON");
println!(" ✓ CSV");
println!(" ✓ DOT (GraphViz)");
println!(" ✓ GraphML");
#[cfg(feature = "npy-export")]
println!(" ✓ NumPy (.npy)");
#[cfg(feature = "parquet-export")]
println!(" ✓ Parquet");
println!();
println!("10. PERFORMANCE SUMMARY");
println!("─────────────────────────────────────");
println!("✓ Automatic optimization enabled");
println!("✓ {} CPU cores utilized", caps.cpu_count());
println!("✓ SIMD: {}", if caps.has_simd() {
if caps.has_avx2() { "AVX2 ✓" } else { "NEON ✓" }
} else {
"Scalar"
});
println!("✓ Expected speedup: {}x", if caps.has_simd() { "5-8" } else { "3-4" });
println!();
println!("🎉 RustyGraph is fully optimized and ready!");
println!(" Visit the documentation for more features.");
Ok(())
}