quantrs2_sim/quantum_inspired_classical/
functions.rs1use crate::error::{Result, SimulatorError};
6use scirs2_core::ndarray::{Array1, Array2};
7use scirs2_core::random::prelude::*;
8
9use super::types::{
10 AlgorithmCategory, BenchmarkingResults, OptimizationAlgorithm, QuantumInspiredConfig,
11 QuantumInspiredFramework, QuantumInspiredUtils, QuantumParameters, StatisticalAnalysis,
12};
13
14pub fn benchmark_quantum_inspired_algorithms(
16 config: &QuantumInspiredConfig,
17) -> Result<BenchmarkingResults> {
18 let mut framework = QuantumInspiredFramework::new(config.clone())?;
19 let num_runs = config.benchmarking_config.num_runs;
20 let mut execution_times = Vec::new();
21 let mut solution_qualities = Vec::new();
22 let mut convergence_rates = Vec::new();
23 let mut memory_usage = Vec::new();
24 for _ in 0..num_runs {
25 let start_time = std::time::Instant::now();
26 let result = framework.optimize()?;
27 let execution_time = start_time.elapsed().as_secs_f64();
28 execution_times.push(execution_time);
29 solution_qualities.push(result.objective_value);
30 let convergence_analysis =
31 QuantumInspiredUtils::analyze_convergence(&framework.state.convergence_history);
32 convergence_rates.push(convergence_analysis.convergence_rate);
33 memory_usage.push(framework.state.runtime_stats.memory_usage);
34 framework.reset();
35 }
36 let mean_performance = solution_qualities.iter().sum::<f64>() / solution_qualities.len() as f64;
37 let variance = solution_qualities
38 .iter()
39 .map(|&x| (x - mean_performance).powi(2))
40 .sum::<f64>()
41 / solution_qualities.len() as f64;
42 let std_deviation = variance.sqrt();
43 let statistical_analysis = StatisticalAnalysis {
44 mean_performance,
45 std_deviation,
46 confidence_intervals: (
47 1.96f64.mul_add(-std_deviation, mean_performance),
48 1.96f64.mul_add(std_deviation, mean_performance),
49 ),
50 p_value: 0.05,
51 effect_size: mean_performance / std_deviation,
52 };
53 Ok(BenchmarkingResults {
54 performance_metrics: solution_qualities.clone(),
55 execution_times,
56 memory_usage,
57 solution_qualities,
58 convergence_rates,
59 statistical_analysis,
60 })
61}
62#[cfg(test)]
63mod tests {
64 use super::*;
65 #[test]
66 fn test_quantum_inspired_config() {
67 let config = QuantumInspiredConfig::default();
68 assert_eq!(config.num_variables, 16);
69 assert_eq!(config.algorithm_category, AlgorithmCategory::Optimization);
70 assert!(config.enable_quantum_heuristics);
71 }
72 #[test]
73 fn test_framework_creation() {
74 let config = QuantumInspiredConfig::default();
75 let framework = QuantumInspiredFramework::new(config);
76 assert!(framework.is_ok());
77 }
78 #[test]
79 fn test_objective_functions() {
80 let config = QuantumInspiredConfig::default();
81 let mut framework =
82 QuantumInspiredFramework::new(config).expect("Failed to create framework");
83 let solution = Array1::from(vec![1.0, 2.0, 3.0, 4.0]);
84 let result = framework.evaluate_objective(&solution);
85 assert!(result.is_ok());
86 assert!(result.expect("Failed to evaluate objective") > 0.0);
87 }
88 #[test]
89 fn test_quantum_genetic_algorithm() {
90 let mut config = QuantumInspiredConfig::default();
91 config.algorithm_config.max_iterations = 10;
92 config.num_variables = 4;
93 let mut framework =
94 QuantumInspiredFramework::new(config).expect("Failed to create framework");
95 let result = framework.optimize();
96 assert!(result.is_ok());
97 let opt_result = result.expect("Failed to optimize");
98 assert!(opt_result.iterations <= 10);
99 assert!(opt_result.objective_value.is_finite());
100 }
101 #[test]
102 fn test_quantum_particle_swarm() {
103 let mut config = QuantumInspiredConfig::default();
104 config.optimization_config.algorithm_type = OptimizationAlgorithm::QuantumParticleSwarm;
105 config.algorithm_config.max_iterations = 10;
106 config.num_variables = 4;
107 let mut framework =
108 QuantumInspiredFramework::new(config).expect("Failed to create framework");
109 let result = framework.optimize();
110 assert!(result.is_ok());
111 }
112 #[test]
113 fn test_quantum_simulated_annealing() {
114 let mut config = QuantumInspiredConfig::default();
115 config.optimization_config.algorithm_type =
116 OptimizationAlgorithm::QuantumSimulatedAnnealing;
117 config.algorithm_config.max_iterations = 10;
118 config.num_variables = 4;
119 let mut framework =
120 QuantumInspiredFramework::new(config).expect("Failed to create framework");
121 let result = framework.optimize();
122 assert!(result.is_ok());
123 }
124 #[test]
125 fn test_convergence_analysis() {
126 let history = vec![100.0, 90.0, 80.0, 70.0, 65.0, 64.9, 64.8, 64.8, 64.8];
127 let analysis = QuantumInspiredUtils::analyze_convergence(&history);
128 assert!(analysis.convergence_rate > 0.0);
129 assert!(analysis.converged);
130 }
131 #[test]
132 fn test_quantum_parameters() {
133 let params = QuantumParameters::default();
134 assert!(params.superposition_strength > 0.0);
135 assert!(params.entanglement_strength > 0.0);
136 assert!(params.tunneling_probability > 0.0);
137 }
138 #[test]
139 fn test_benchmarking() {
140 let mut config = QuantumInspiredConfig::default();
141 config.algorithm_config.max_iterations = 5;
142 config.benchmarking_config.num_runs = 3;
143 config.num_variables = 4;
144 let result = benchmark_quantum_inspired_algorithms(&config);
145 assert!(result.is_ok());
146 let benchmark = result.expect("Failed to benchmark");
147 assert_eq!(benchmark.execution_times.len(), 3);
148 assert_eq!(benchmark.solution_qualities.len(), 3);
149 }
150}