advanced_showcase/
advanced_showcase.rs

1//! Advanced Mode Showcase
2//!
3//! This example demonstrates the advanced-sophisticated enhancements added to scirs2-datasets,
4//! including advanced analytics, GPU optimization, and adaptive streaming processing.
5
6use scirs2_datasets::{
7    // Adaptive streaming
8    create_adaptive_engine_with_config,
9    // Core functionality
10    make_classification,
11    quick_quality_assessment,
12    AdaptiveStreamConfig,
13    AdvancedDatasetAnalyzer,
14    AdvancedGpuOptimizer,
15    ChunkMetadata,
16    DataCharacteristics,
17    Dataset,
18    GpuBackend,
19    GpuConfig,
20    GpuContext,
21    StatisticalMoments,
22    StreamChunk,
23    TrendDirection,
24    TrendIndicators,
25};
26use statrs::statistics::Statistics;
27use std::time::Instant;
28
29#[allow(dead_code)]
30fn main() -> Result<(), Box<dyn std::error::Error>> {
31    println!("šŸš€ SciRS2-Datasets Advanced Mode Showcase");
32    println!("===========================================\n");
33
34    // Create a sample dataset for demonstration
35    let dataset = create_sampledataset()?;
36    println!(
37        "šŸ“Š Created sample dataset: {} samples, {} features",
38        dataset.n_samples(),
39        dataset.n_features()
40    );
41
42    // Demonstrate advanced analytics
43    demonstrate_advanced_analytics(&dataset)?;
44
45    // Demonstrate advanced-GPU optimization
46    demonstrate_advanced_gpu_optimization()?;
47
48    // Demonstrate adaptive streaming
49    demonstrate_adaptive_streaming(&dataset)?;
50
51    println!("\nāœ… Advanced mode demonstration completed successfully!");
52    Ok(())
53}
54
55/// Create a sample dataset for demonstration
56#[allow(dead_code)]
57fn create_sampledataset() -> Result<Dataset, Box<dyn std::error::Error>> {
58    println!("šŸ”§ Generating sample classification dataset...");
59
60    let dataset = make_classification(
61        1000,     // n_samples
62        10,       // n_features
63        3,        // n_classes
64        2,        // n_clusters_per_class
65        5,        // n_informative
66        Some(42), // random_state
67    )?;
68
69    Ok(dataset)
70}
71
72/// Demonstrate advanced analytics capabilities
73#[allow(dead_code)]
74fn demonstrate_advanced_analytics(dataset: &Dataset) -> Result<(), Box<dyn std::error::Error>> {
75    println!("\n🧠 Advanced Analytics Demonstration");
76    println!("==========================================");
77
78    // Quick quality assessment
79    println!("šŸ“ˆ Running quick quality assessment...");
80    let quick_quality = quick_quality_assessment(dataset)?;
81    println!("   Quality Score: {quick_quality:.3}");
82
83    // Comprehensive advanced-analysis
84    println!("šŸ”¬ Running comprehensive advanced-analysis...");
85    let start_time = Instant::now();
86
87    let analyzer = AdvancedDatasetAnalyzer::new()
88        .with_gpu(true)
89        .with_advanced_precision(true)
90        .with_significance_threshold(0.01);
91
92    let metrics = analyzer.analyze_dataset_quality(dataset)?;
93    let analysis_time = start_time.elapsed();
94
95    println!("   Analysis completed in: {analysis_time:?}");
96    println!("   Complexity Score: {:.3}", metrics.complexity_score);
97    println!("   Entropy: {:.3}", metrics.entropy);
98    println!("   Outlier Score: {:.3}", metrics.outlier_score);
99    println!("   ML Quality Score: {:.3}", metrics.ml_quality_score);
100
101    // Display normality assessment
102    println!("   Normality Assessment:");
103    println!(
104        "     Overall Normality: {:.3}",
105        metrics.normality_assessment.overall_normality
106    );
107    println!(
108        "     Shapiro-Wilk (avg): {:.3}",
109        metrics.normality_assessment.shapiro_wilk_scores.mean()
110    );
111
112    // Display correlation insights
113    println!("   Correlation Insights:");
114    println!(
115        "     Feature Importance (top 3): {:?}",
116        metrics
117            .correlation_insights
118            .feature_importance
119            .iter()
120            .take(3)
121            .map(|&x| format!("{x:.3}"))
122            .collect::<Vec<_>>()
123    );
124
125    Ok(())
126}
127
128/// Demonstrate advanced-GPU optimization capabilities
129#[allow(dead_code)]
130fn demonstrate_advanced_gpu_optimization() -> Result<(), Box<dyn std::error::Error>> {
131    println!("\n⚔ Advanced-GPU Optimization Demonstration");
132    println!("=====================================");
133
134    // Create GPU context (falls back to CPU if no GPU available)
135    println!("šŸ”§ Initializing GPU context...");
136    let gpu_config = GpuConfig {
137        backend: GpuBackend::Cpu,
138        ..Default::default()
139    };
140    let gpu_context = GpuContext::new(gpu_config)?; // Using CPU backend for demo
141    println!("   Backend: {:?}", gpu_context.backend());
142
143    // Create advanced-GPU optimizer
144    let optimizer = AdvancedGpuOptimizer::new()
145        .with_adaptive_kernels(true)
146        .with_memory_prefetch(true)
147        .with_multi_gpu(false) // Single GPU for demo
148        .with_auto_tuning(true);
149
150    // Generate advanced-optimized matrix
151    println!("šŸ”„ Generating advanced-optimized matrix...");
152    let start_time = Instant::now();
153    let matrix = optimizer.generate_advanced_optimized_matrix(
154        &gpu_context,
155        500,      // rows
156        200,      // cols
157        "normal", // distribution
158    )?;
159    let generation_time = start_time.elapsed();
160
161    println!(
162        "   Generated {}x{} matrix in: {:?}",
163        matrix.nrows(),
164        matrix.ncols(),
165        generation_time
166    );
167    let matrix_mean = matrix.clone().mean();
168    let matrix_std = matrix.var(1.0).sqrt();
169    println!(
170        "   Matrix stats: mean={:.3}, std={:.3}",
171        matrix_mean, matrix_std
172    );
173
174    // Benchmark performance
175    println!("šŸ“Š Running performance benchmarks...");
176    let datashapes = vec![(100, 50), (500, 200), (1000, 500)];
177    let benchmark_results =
178        optimizer.benchmark_performance(&gpu_context, "matrix_generation", &datashapes)?;
179
180    println!("   Benchmark Results:");
181    println!(
182        "     Best Speedup: {:.2}x",
183        benchmark_results.best_speedup()
184    );
185    println!(
186        "     Average Speedup: {:.2}x",
187        benchmark_results.average_speedup()
188    );
189    println!(
190        "     Total Memory Usage: {:.1} MB",
191        benchmark_results.total_memory_usage()
192    );
193
194    Ok(())
195}
196
197/// Demonstrate adaptive streaming capabilities
198#[allow(dead_code)]
199fn demonstrate_adaptive_streaming(dataset: &Dataset) -> Result<(), Box<dyn std::error::Error>> {
200    println!("\n🌊 Adaptive Streaming Demonstration");
201    println!("===================================");
202
203    // Configure streaming engine
204    let config = AdaptiveStreamConfig::default();
205
206    println!("šŸ”§ Initializing adaptive streaming engine...");
207    let mut engine = create_adaptive_engine_with_config(config);
208
209    // Simulate streaming data
210    println!("šŸ“” Simulating data stream...");
211    let data = &dataset.data;
212    let chunksize = 20;
213    let num_chunks = (data.nrows() / chunksize).min(10); // Limit for demo
214
215    let mut total_processed = 0;
216    let start_time = Instant::now();
217
218    for i in 0..num_chunks {
219        let start_row = i * chunksize;
220        let end_row = (start_row + chunksize).min(data.nrows());
221
222        // Create chunk from dataset slice
223        let chunkdata = data.slice(ndarray::s![start_row..end_row, ..]).to_owned();
224
225        let chunk = StreamChunk {
226            data: chunkdata,
227            timestamp: Instant::now(),
228            metadata: ChunkMetadata {
229                source_id: format!("demo_source_{i}"),
230                sequence_number: i as u64,
231                characteristics: DataCharacteristics {
232                    moments: StatisticalMoments {
233                        mean: 0.0,
234                        variance: 1.0,
235                        skewness: 0.0,
236                        kurtosis: 0.0,
237                    },
238                    entropy: 1.0,
239                    trend: TrendIndicators {
240                        linear_slope: 0.1,
241                        trend_strength: 0.5,
242                        direction: TrendDirection::Increasing,
243                        seasonality: 0.2,
244                    },
245                    anomaly_score: 0.1,
246                },
247            },
248            quality_score: 0.9,
249        };
250
251        // Process chunk
252        let results = engine.process_stream(chunk)?;
253        total_processed += results.len();
254
255        if !results.is_empty() {
256            println!(
257                "   Processed batch {}: {} datasets generated",
258                i + 1,
259                results.len()
260            );
261        }
262    }
263
264    let streaming_time = start_time.elapsed();
265
266    println!("   Streaming completed in: {streaming_time:?}");
267    println!("   Total datasets processed: {total_processed}");
268
269    // Get performance metrics
270    println!("šŸ“ˆ Getting performance metrics...");
271    let perf_metrics = engine.get_performance_metrics()?;
272    println!("   Processing Latency: {:?}", perf_metrics.latency);
273    println!("   Throughput: {:.1} chunks/sec", perf_metrics.throughput);
274    println!(
275        "   Memory Efficiency: {:.1}%",
276        perf_metrics.memory_efficiency * 100.0
277    );
278
279    // Get quality metrics
280    let quality_metrics = engine.get_quality_metrics()?;
281    println!("   Quality Metrics:");
282    println!(
283        "     Integrity: {:.1}%",
284        quality_metrics.integrity_score * 100.0
285    );
286    println!(
287        "     Completeness: {:.1}%",
288        quality_metrics.completeness_score * 100.0
289    );
290    println!(
291        "     Overall Quality: {:.1}%",
292        quality_metrics.overall_score * 100.0
293    );
294
295    // Get buffer statistics
296    let buffer_stats = engine.get_buffer_statistics()?;
297    println!("   Buffer Statistics:");
298    println!("     Utilization: {:.1}%", buffer_stats.utilization * 100.0);
299    println!("     Memory Usage: {} bytes", buffer_stats.memory_usage);
300
301    Ok(())
302}
303
304#[cfg(test)]
305mod tests {
306    use super::*;
307
308    #[test]
309    fn test_sample_dataset_creation() {
310        let result = create_sampledataset();
311        assert!(result.is_ok());
312        let dataset = result.unwrap();
313        assert_eq!(dataset.n_samples(), 1000);
314        assert_eq!(dataset.n_features(), 10);
315    }
316
317    #[test]
318    fn test_advanced_analytics_integration() {
319        let dataset = create_sampledataset().unwrap();
320        let result = demonstrate_advanced_analytics(&dataset);
321        assert!(result.is_ok());
322    }
323
324    #[test]
325    fn test_gpu_optimization_integration() {
326        let result = demonstrate_advanced_gpu_optimization();
327        assert!(result.is_ok());
328    }
329
330    #[test]
331    fn test_adaptive_streaming_integration() {
332        let dataset = create_sampledataset().unwrap();
333        let result = demonstrate_adaptive_streaming(&dataset);
334        assert!(result.is_ok());
335    }
336}