//! Verify 225-feature extraction with Wave D integration use chrono::Utc; use ml::features::extraction::{extract_ml_features, OHLCVBar}; fn main() { // Create 100 test bars let bars: Vec = (0..100) .map(|i| OHLCVBar { timestamp: Utc::now() + chrono::Duration::hours(i), open: 100.0 + i as f64 * 0.1, high: 101.0 + i as f64 * 0.1, low: 99.0 + i as f64 * 0.1, close: 100.5 + i as f64 * 0.1, volume: 1000.0 + i as f64 * 10.0, }) .collect(); let features = extract_ml_features(&bars).expect("Feature extraction failed"); println!("āœ“ Feature extraction successful"); println!(" - Input bars: {}", bars.len()); println!(" - Output vectors: {}", features.len()); println!(" - Features per vector: {}", features[0].len()); // Verify dimensions assert_eq!( features[0].len(), 225, "Expected 225 features, got {}", features[0].len() ); // Verify no NaN/Inf in Wave D features (indices 201-224) for (i, feature_vec) in features.iter().enumerate() { for (j, &val) in feature_vec.iter().enumerate() { assert!( val.is_finite(), "Non-finite value at bar {}, feature {}: {}", i, j, val ); } // Wave D features are at indices 201-224 let wave_d_features = &feature_vec[201..225]; println!( "Bar {} Wave D features (201-224): min={:.4}, max={:.4}, avg={:.4}", i, wave_d_features.iter().fold(f64::INFINITY, |a, &b| a.min(b)), wave_d_features .iter() .fold(f64::NEG_INFINITY, |a, &b| a.max(b)), wave_d_features.iter().sum::() / wave_d_features.len() as f64 ); if i >= 5 { break; } // Only show first 5 bars } println!("\nāœ“ All 225 features extracted successfully!"); println!(" - Features 0-4: OHLCV (5)"); println!(" - Features 5-14: Technical indicators (10)"); println!(" - Features 15-74: Price patterns (60)"); println!(" - Features 75-114: Volume patterns (40)"); println!(" - Features 115-164: Microstructure proxies (50)"); println!(" - Features 165-174: Time-based (10)"); println!(" - Features 175-200: Statistical (26)"); println!(" - Features 201-224: Wave D regime detection (24)"); }