Skip to main content

quantrs2_sim/quantum_inspired_classical/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5use 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
15/// Benchmark quantum-inspired algorithms
16pub 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}