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::types::{
10    AlgorithmCategory, BenchmarkingResults, OptimizationAlgorithm, QuantumInspiredConfig,
11    QuantumInspiredFramework, QuantumInspiredUtils, QuantumParameters, StatisticalAnalysis,
12};
13
14/// Benchmark quantum-inspired algorithms
15pub 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}