use crate::error::{Result, SimulatorError};
use scirs2_core::ndarray::{Array1, Array2};
use scirs2_core::random::prelude::*;
use super::types::{
AlgorithmCategory, BenchmarkingResults, OptimizationAlgorithm, QuantumInspiredConfig,
QuantumInspiredFramework, QuantumInspiredUtils, QuantumParameters, StatisticalAnalysis,
};
pub fn benchmark_quantum_inspired_algorithms(
config: &QuantumInspiredConfig,
) -> Result<BenchmarkingResults> {
let mut framework = QuantumInspiredFramework::new(config.clone())?;
let num_runs = config.benchmarking_config.num_runs;
let mut execution_times = Vec::new();
let mut solution_qualities = Vec::new();
let mut convergence_rates = Vec::new();
let mut memory_usage = Vec::new();
for _ in 0..num_runs {
let start_time = std::time::Instant::now();
let result = framework.optimize()?;
let execution_time = start_time.elapsed().as_secs_f64();
execution_times.push(execution_time);
solution_qualities.push(result.objective_value);
let convergence_analysis =
QuantumInspiredUtils::analyze_convergence(&framework.state.convergence_history);
convergence_rates.push(convergence_analysis.convergence_rate);
memory_usage.push(framework.state.runtime_stats.memory_usage);
framework.reset();
}
let mean_performance = solution_qualities.iter().sum::<f64>() / solution_qualities.len() as f64;
let variance = solution_qualities
.iter()
.map(|&x| (x - mean_performance).powi(2))
.sum::<f64>()
/ solution_qualities.len() as f64;
let std_deviation = variance.sqrt();
let statistical_analysis = StatisticalAnalysis {
mean_performance,
std_deviation,
confidence_intervals: (
1.96f64.mul_add(-std_deviation, mean_performance),
1.96f64.mul_add(std_deviation, mean_performance),
),
p_value: 0.05,
effect_size: mean_performance / std_deviation,
};
Ok(BenchmarkingResults {
performance_metrics: solution_qualities.clone(),
execution_times,
memory_usage,
solution_qualities,
convergence_rates,
statistical_analysis,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quantum_inspired_config() {
let config = QuantumInspiredConfig::default();
assert_eq!(config.num_variables, 16);
assert_eq!(config.algorithm_category, AlgorithmCategory::Optimization);
assert!(config.enable_quantum_heuristics);
}
#[test]
fn test_framework_creation() {
let config = QuantumInspiredConfig::default();
let framework = QuantumInspiredFramework::new(config);
assert!(framework.is_ok());
}
#[test]
fn test_objective_functions() {
let config = QuantumInspiredConfig::default();
let mut framework =
QuantumInspiredFramework::new(config).expect("Failed to create framework");
let solution = Array1::from(vec![1.0, 2.0, 3.0, 4.0]);
let result = framework.evaluate_objective(&solution);
assert!(result.is_ok());
assert!(result.expect("Failed to evaluate objective") > 0.0);
}
#[test]
fn test_quantum_genetic_algorithm() {
let mut config = QuantumInspiredConfig::default();
config.algorithm_config.max_iterations = 10;
config.num_variables = 4;
let mut framework =
QuantumInspiredFramework::new(config).expect("Failed to create framework");
let result = framework.optimize();
assert!(result.is_ok());
let opt_result = result.expect("Failed to optimize");
assert!(opt_result.iterations <= 10);
assert!(opt_result.objective_value.is_finite());
}
#[test]
fn test_quantum_particle_swarm() {
let mut config = QuantumInspiredConfig::default();
config.optimization_config.algorithm_type = OptimizationAlgorithm::QuantumParticleSwarm;
config.algorithm_config.max_iterations = 10;
config.num_variables = 4;
let mut framework =
QuantumInspiredFramework::new(config).expect("Failed to create framework");
let result = framework.optimize();
assert!(result.is_ok());
}
#[test]
fn test_quantum_simulated_annealing() {
let mut config = QuantumInspiredConfig::default();
config.optimization_config.algorithm_type =
OptimizationAlgorithm::QuantumSimulatedAnnealing;
config.algorithm_config.max_iterations = 10;
config.num_variables = 4;
let mut framework =
QuantumInspiredFramework::new(config).expect("Failed to create framework");
let result = framework.optimize();
assert!(result.is_ok());
}
#[test]
fn test_convergence_analysis() {
let history = vec![100.0, 90.0, 80.0, 70.0, 65.0, 64.9, 64.8, 64.8, 64.8];
let analysis = QuantumInspiredUtils::analyze_convergence(&history);
assert!(analysis.convergence_rate > 0.0);
assert!(analysis.converged);
}
#[test]
fn test_quantum_parameters() {
let params = QuantumParameters::default();
assert!(params.superposition_strength > 0.0);
assert!(params.entanglement_strength > 0.0);
assert!(params.tunneling_probability > 0.0);
}
#[test]
fn test_benchmarking() {
let mut config = QuantumInspiredConfig::default();
config.algorithm_config.max_iterations = 5;
config.benchmarking_config.num_runs = 3;
config.num_variables = 4;
let result = benchmark_quantum_inspired_algorithms(&config);
assert!(result.is_ok());
let benchmark = result.expect("Failed to benchmark");
assert_eq!(benchmark.execution_times.len(), 3);
assert_eq!(benchmark.solution_qualities.len(), 3);
}
}