#[cfg(test)]
mod tests {
use crate::calibration::{
optimized_bootstrap::{OptimizedBootstrap, OptimizedBootstrapConfig},
fast_bootstrap::{FastBootstrap, FastBootstrapConfig},
bootstrap_performance::{BootstrapPerformanceSuite, TestConfiguration},
shared_binning_core::SharedBinningConfig,
};
use std::time::Instant;
fn generate_realistic_test_data(n: usize, seed: u64) -> (Vec<f64>, Vec<f64>, Vec<f64>) {
use rand::{Rng, SeedableRng};
let mut rng = rand::rngs::StdRng::seed_from_u64(seed);
let mut predictions = Vec::with_capacity(n);
let mut labels = Vec::with_capacity(n);
let mut weights = Vec::with_capacity(n);
for i in 0..n {
let base_prediction = (i as f64 + 0.5) / n as f64;
let noise = rng.gen_range(-0.1..0.1);
let prediction = (base_prediction + noise).clamp(0.01, 0.99);
let true_prob = prediction * 0.9 + 0.05; let label = if rng.gen::<f64>() < true_prob { 1.0 } else { 0.0 };
let weight = 1.0;
predictions.push(prediction);
labels.push(label);
weights.push(weight);
}
(predictions, labels, weights)
}
#[test]
fn test_optimized_bootstrap_basic_functionality() {
let config = OptimizedBootstrapConfig {
initial_samples: 50,
max_samples: 200,
target_coverage: 0.95,
random_seed: 42,
..Default::default()
};
let binning_config = SharedBinningConfig::default();
let mut bootstrap = OptimizedBootstrap::new(config, binning_config);
let (predictions, labels, weights) = generate_realistic_test_data(100, 42);
let result = bootstrap.run_optimized_bootstrap(&predictions, &labels, &weights, 10, 1.5);
assert!(result.coverage_probability >= 0.0);
assert!(result.coverage_probability <= 1.0);
assert!(result.samples_used > 0);
assert!(result.samples_used <= 200);
assert!(result.ece_threshold > 0.0);
assert!(result.performance.samples_per_second > 0.0);
assert!(result.performance.total_duration.as_nanos() > 0);
println!("✅ Basic optimized bootstrap functionality test passed");
println!(" Coverage: {:.3}", result.coverage_probability);
println!(" Samples used: {}", result.samples_used);
println!(" Early stopped: {}", result.early_stopped);
println!(" Performance: {:.1} samples/sec", result.performance.samples_per_second);
}
#[test]
fn test_early_stopping_effectiveness() {
let config = OptimizedBootstrapConfig {
initial_samples: 100,
early_stop_interval: 25,
max_samples: 500,
target_precision: 0.08, base_early_stop_threshold: 0.90, random_seed: 123,
..Default::default()
};
let binning_config = SharedBinningConfig::default();
let mut bootstrap = OptimizedBootstrap::new(config, binning_config);
let n = 200;
let (predictions, labels, weights) = generate_realistic_test_data(n, 123);
let result = bootstrap.run_optimized_bootstrap(&predictions, &labels, &weights, 10, 1.5);
assert!(result.samples_used < 500);
assert!(result.early_stop_details.decision_point > 0);
assert!(result.early_stop_details.ci_width_at_decision >= 0.0);
println!("✅ Early stopping effectiveness test passed");
println!(" Early stopped: {}", result.early_stopped);
println!(" Decision point: {} samples", result.early_stop_details.decision_point);
println!(" CI width at decision: {:.4}", result.early_stop_details.ci_width_at_decision);
println!(" Precision achieved: {}", result.early_stop_details.precision_achieved);
}
#[test]
fn test_blb_large_dataset_optimization() {
let config = OptimizedBootstrapConfig {
blb_config: crate::calibration::optimized_bootstrap::BLBConfig {
large_dataset_threshold: 500, num_bags: 5,
bootstrap_per_bag: 20,
min_subsample_size: 100,
max_subsample_size: 300,
..Default::default()
},
random_seed: 456,
..Default::default()
};
let binning_config = SharedBinningConfig::default();
let mut bootstrap = OptimizedBootstrap::new(config, binning_config);
let n = 1000;
let (predictions, labels, weights) = generate_realistic_test_data(n, 456);
let result = bootstrap.run_optimized_bootstrap(&predictions, &labels, &weights, 15, 1.5);
assert!(result.blb_info.is_some(), "BLB should be used for large dataset");
let blb_info = result.blb_info.unwrap();
assert_eq!(blb_info.bags_processed, 5);
assert!(blb_info.subsample_size < n);
assert!(blb_info.efficiency_ratio > 0.0 && blb_info.efficiency_ratio < 1.0);
assert!(blb_info.memory_reduction_ratio > 0.0);
println!("✅ BLB large dataset optimization test passed");
println!(" Original size: {}, Subsample size: {}", n, blb_info.subsample_size);
println!(" Bags processed: {}", blb_info.bags_processed);
println!(" Memory reduction: {:.1}%", blb_info.memory_reduction_ratio * 100.0);
println!(" Total bag samples: {}", blb_info.total_bag_samples);
}
#[test]
fn test_performance_improvement_validation() {
let n = 500;
let (predictions, labels, weights) = generate_realistic_test_data(n, 789);
let baseline_config = FastBootstrapConfig {
max_samples: 300,
target_coverage: 0.95,
random_seed: 789,
..Default::default()
};
let baseline_binning_config = SharedBinningConfig::default();
let mut baseline_bootstrap = FastBootstrap::new(baseline_config, baseline_binning_config);
let baseline_start = Instant::now();
let baseline_result = baseline_bootstrap.run_bootstrap(&predictions, &labels, &weights, 10, 1.5);
let baseline_duration = baseline_start.elapsed();
let optimized_config = OptimizedBootstrapConfig {
max_samples: 300,
target_coverage: 0.95,
random_seed: 789,
..Default::default()
};
let optimized_binning_config = SharedBinningConfig::default();
let mut optimized_bootstrap = OptimizedBootstrap::new(optimized_config, optimized_binning_config);
let optimized_start = Instant::now();
let optimized_result = optimized_bootstrap.run_optimized_bootstrap(&predictions, &labels, &weights, 10, 1.5);
let optimized_duration = optimized_start.elapsed();
let speedup_ratio = baseline_duration.as_secs_f64() / optimized_duration.as_secs_f64();
let improvement_percentage = (1.0 - 1.0 / speedup_ratio) * 100.0;
let coverage_diff = (baseline_result.coverage_probability - optimized_result.coverage_probability).abs();
assert!(coverage_diff < 0.1, "Coverage probability should be similar between implementations");
println!("✅ Performance improvement validation test");
println!(" Baseline time: {:.2}ms", baseline_duration.as_millis());
println!(" Optimized time: {:.2}ms", optimized_duration.as_millis());
println!(" Speedup ratio: {:.2}x", speedup_ratio);
println!(" Improvement: {:.1}%", improvement_percentage);
println!(" Baseline coverage: {:.3}", baseline_result.coverage_probability);
println!(" Optimized coverage: {:.3}", optimized_result.coverage_probability);
println!(" Coverage difference: {:.4}", coverage_diff);
if improvement_percentage >= 50.0 {
println!("🎯 TARGET ACHIEVED: ≥50% performance improvement!");
} else {
println!("📊 Performance measured: {:.1}% improvement", improvement_percentage);
}
}
#[test]
fn test_cache_effectiveness() {
let config = OptimizedBootstrapConfig {
cache_config: crate::calibration::optimized_bootstrap::CacheConfig {
enable_edge_caching: true,
edge_cache_capacity: 50,
enable_result_caching: true,
..Default::default()
},
initial_samples: 50,
max_samples: 150,
random_seed: 999,
..Default::default()
};
let binning_config = SharedBinningConfig::default();
let mut bootstrap = OptimizedBootstrap::new(config, binning_config);
let (predictions, labels, weights) = generate_realistic_test_data(200, 999);
let mut results = Vec::new();
for _ in 0..3 {
let result = bootstrap.run_optimized_bootstrap(&predictions, &labels, &weights, 10, 1.5);
results.push(result);
}
let final_result = &results[results.len() - 1];
assert!(final_result.cache_metrics.cache_operations > 0);
println!("✅ Cache effectiveness test passed");
println!(" Cache operations: {}", final_result.cache_metrics.cache_operations);
println!(" Edge cache hit rate: {:.3}", final_result.cache_metrics.edge_cache_hit_rate);
println!(" Cache memory usage: {:.1}KB", final_result.cache_metrics.cache_memory_usage as f64 / 1024.0);
if final_result.cache_metrics.edge_cache_hit_rate > 0.0 {
println!("🎯 CACHE WORKING: {:.1}% hit rate achieved",
final_result.cache_metrics.edge_cache_hit_rate * 100.0);
}
}
#[test]
fn test_simd_optimization_metrics() {
let config = OptimizedBootstrapConfig {
simd_config: crate::calibration::optimized_bootstrap::SimdConfig {
enable_simd: true,
chunk_size: 32,
simd_aggregation: true,
simd_ece_computation: true,
},
initial_samples: 100,
max_samples: 200,
random_seed: 1234,
..Default::default()
};
let binning_config = SharedBinningConfig::default();
let mut bootstrap = OptimizedBootstrap::new(config, binning_config);
let (predictions, labels, weights) = generate_realistic_test_data(300, 1234);
let result = bootstrap.run_optimized_bootstrap(&predictions, &labels, &weights, 12, 1.5);
assert!(result.simd_metrics.simd_operations >= 0);
println!("✅ SIMD optimization metrics test passed");
println!(" SIMD operations: {}", result.simd_metrics.simd_operations);
println!(" Vectorization efficiency: {:.3}", result.simd_metrics.vectorization_efficiency);
println!(" SIMD speedup: {:.2}x", result.simd_metrics.simd_speedup);
println!(" SIMD chunks processed: {}", result.simd_metrics.simd_chunks_processed);
if result.simd_metrics.simd_operations > 0 {
println!("🎯 SIMD ACTIVE: {} vectorized operations performed", result.simd_metrics.simd_operations);
}
}
#[test]
fn test_enhanced_wilson_ci_functionality() {
use crate::calibration::optimized_bootstrap::EnhancedWilsonCI;
let ci = EnhancedWilsonCI::compute_adaptive(0.95, 100, 0.95, 0.05);
assert!(ci.lower < ci.point_estimate);
assert!(ci.point_estimate < ci.upper);
assert!(ci.lower >= 0.0);
assert!(ci.upper <= 1.0);
assert_eq!(ci.point_estimate, 0.95);
assert!(ci.width > 0.0);
assert_eq!(ci.sample_size, 100);
assert_eq!(ci.confidence_level, 0.95);
assert!(ci.early_stop_criterion(0.90)); assert!(!ci.early_stop_criterion(0.97));
let meets_precision = ci.meets_precision(0.1);
println!("✅ Enhanced Wilson CI functionality test passed");
println!(" Point estimate: {:.3}", ci.point_estimate);
println!(" CI: [{:.3}, {:.3}]", ci.lower, ci.upper);
println!(" CI width: {:.4}", ci.width);
println!(" Sample size: {}", ci.sample_size);
println!(" Meets precision (0.1): {}", meets_precision);
println!(" Early stop (0.90): {}", ci.early_stop_criterion(0.90));
}
#[test]
fn test_memory_optimization_validation() {
let config = OptimizedBootstrapConfig {
initial_samples: 100,
max_samples: 200,
enable_profiling: true,
random_seed: 5678,
..Default::default()
};
let binning_config = SharedBinningConfig::default();
let mut bootstrap = OptimizedBootstrap::new(config, binning_config);
let (predictions, labels, weights) = generate_realistic_test_data(400, 5678);
let result = bootstrap.run_optimized_bootstrap(&predictions, &labels, &weights, 10, 1.5);
assert!(result.performance.memory_stats.allocations_avoided > 0);
assert!(result.performance.memory_stats.buffer_reuse_count > 0);
println!("✅ Memory optimization validation test passed");
println!(" Peak memory: {:.1}KB", result.performance.memory_stats.peak_memory_bytes as f64 / 1024.0);
println!(" Average memory: {:.1}KB", result.performance.memory_stats.average_memory_bytes as f64 / 1024.0);
println!(" Allocations avoided: {}", result.performance.memory_stats.allocations_avoided);
println!(" Buffer reuse count: {}", result.performance.memory_stats.buffer_reuse_count);
println!(" Performance target met: {}", result.performance.performance_target_met);
println!(" Speedup ratio: {:.2}x", result.performance.speedup_ratio);
if result.performance.performance_target_met {
println!("🎯 PERFORMANCE TARGET ACHIEVED!");
}
}
#[ignore = "Long-running comprehensive performance test"]
#[test]
fn test_comprehensive_performance_suite() {
use crate::calibration::bootstrap_performance::run_bootstrap_performance_benchmark;
println!("🚀 Running comprehensive performance benchmark suite...");
let analysis = run_bootstrap_performance_benchmark();
assert!(analysis.comparison.speed_improvement > 0.0);
assert!(analysis.scalability.performance_by_size.len() > 0);
assert!(analysis.statistical_significance.effect_size >= 0.0);
println!("✅ Comprehensive performance suite completed");
println!(" Speed improvement: {:.2}x", analysis.comparison.speed_improvement);
println!(" Target achieved: {}", analysis.comparison.target_achievement.performance_category);
println!(" Statistical significance: {}", analysis.statistical_significance.significant_improvement);
let target_achievement = &analysis.comparison.target_achievement;
if target_achievement.min_target_50_achieved {
println!("🎯 SUCCESS: 50-70% runtime reduction target achieved!");
println!(" Actual improvement: {:.1}%", target_achievement.actual_improvement_percentage);
} else {
println!("📊 Performance improvement: {:.1}%", target_achievement.actual_improvement_percentage);
}
}
}