quantrs2-sim 0.1.3

Quantum circuit simulators for the QuantRS2 framework
Documentation
//! Auto-generated module
//!
//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)

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,
};

/// Benchmark quantum-inspired algorithms
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);
    }
}