quantrs2_sim/qaoa_optimization/
functions.rs1use crate::error::Result;
6use scirs2_core::ndarray::{Array1, Array2};
7use scirs2_core::random::prelude::*;
8use std::collections::HashMap;
9use std::time::{Duration, Instant};
10
11use super::qaoaoptimizer_type::QAOAOptimizer;
12use super::types::{QAOAConfig, QAOAGraph, QAOAProblemType};
13
14pub fn benchmark_qaoa() -> Result<HashMap<String, f64>> {
16 let mut results = HashMap::new();
17 let start = Instant::now();
18 let graph = QAOAGraph {
19 num_vertices: 4,
20 adjacency_matrix: Array2::from_shape_vec(
21 (4, 4),
22 vec![
23 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0,
24 ],
25 )
26 .map_err(|e| {
27 crate::error::SimulatorError::InvalidInput(format!(
28 "Failed to create adjacency matrix: {}",
29 e
30 ))
31 })?,
32 vertex_weights: vec![1.0; 4],
33 edge_weights: HashMap::new(),
34 constraints: Vec::new(),
35 };
36 let config = QAOAConfig {
37 num_layers: 2,
38 max_iterations: 50,
39 ..Default::default()
40 };
41 let mut optimizer = QAOAOptimizer::new(config, graph, QAOAProblemType::MaxCut)?;
42 let _result = optimizer.optimize()?;
43 let maxcut_time = start.elapsed().as_millis() as f64;
44 results.insert("maxcut_qaoa_4_vertices".to_string(), maxcut_time);
45 Ok(results)
46}
47#[cfg(test)]
48mod tests {
49 use super::*;
50 #[test]
51 fn test_qaoa_optimizer_creation() {
52 let graph = QAOAGraph {
53 num_vertices: 3,
54 adjacency_matrix: Array2::zeros((3, 3)),
55 vertex_weights: vec![1.0; 3],
56 edge_weights: HashMap::new(),
57 constraints: Vec::new(),
58 };
59 let config = QAOAConfig::default();
60 let optimizer = QAOAOptimizer::new(config, graph, QAOAProblemType::MaxCut);
61 assert!(optimizer.is_ok());
62 }
63 #[test]
64 fn test_maxcut_cost_evaluation() {
65 let optimizer = create_test_optimizer();
66 let bits = [true, false, true, false];
67 let cost = optimizer
68 .evaluate_maxcut_cost(&bits)
69 .expect("MaxCut cost evaluation should succeed");
70 assert!(cost >= 0.0);
71 }
72 #[test]
73 fn test_parameter_initialization() {
74 let config = QAOAConfig {
75 num_layers: 3,
76 ..Default::default()
77 };
78 let graph = create_test_graph();
79 let gammas = QAOAOptimizer::initialize_gammas(&config, &graph)
80 .expect("Gamma initialization should succeed");
81 let betas = QAOAOptimizer::initialize_betas(&config, &graph)
82 .expect("Beta initialization should succeed");
83 assert_eq!(gammas.len(), 3);
84 assert_eq!(betas.len(), 3);
85 }
86 #[test]
87 fn test_constraint_checking() {
88 let optimizer = create_test_optimizer();
89 let solution = "1010";
90 let feasible = optimizer
91 .check_feasibility(solution)
92 .expect("Feasibility check should succeed");
93 assert!(feasible);
94 }
95 pub(super) fn create_test_optimizer() -> QAOAOptimizer {
96 let graph = create_test_graph();
97 let config = QAOAConfig::default();
98 QAOAOptimizer::new(config, graph, QAOAProblemType::MaxCut)
99 .expect("Test optimizer creation should succeed")
100 }
101 pub(super) fn create_test_graph() -> QAOAGraph {
102 QAOAGraph {
103 num_vertices: 4,
104 adjacency_matrix: Array2::eye(4),
105 vertex_weights: vec![1.0; 4],
106 edge_weights: HashMap::new(),
107 constraints: Vec::new(),
108 }
109 }
110}