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