quantrs2_device/vqa_support/
mod.rs1pub mod analysis;
19pub mod circuits;
20pub mod config;
21pub mod executor;
22pub mod hardware;
23pub mod noise;
24pub mod objectives;
25pub mod optimization;
26pub mod statistical;
27
28pub use analysis::*;
30pub use circuits::*;
31pub use config::{
32 AdaptiveShotConfig, ConvergenceCriterion, GradientMethod, MultiStartConfig, VQAAlgorithmType,
33 VQAConfig, VQAHardwareConfig, VQANoiseMitigation, VQAOptimizationConfig, VQAOptimizer,
34 VQAStatisticalConfig, VQAValidationConfig,
35}; pub use executor::{VQAExecutor, VQAExecutorConfig, VQAResult}; pub use hardware::*;
38pub use noise::*;
39pub use objectives::*;
40pub use optimization::*;
41pub use statistical::*;
42
43pub type DeviceResult<T> = crate::DeviceResult<T>;
45pub type DeviceError = crate::DeviceError;
46
47#[cfg(feature = "scirs2")]
49pub use scirs2_graph;
50#[cfg(feature = "scirs2")]
51pub use scirs2_linalg;
52#[cfg(feature = "scirs2")]
53pub use scirs2_optimize;
54#[cfg(feature = "scirs2")]
55pub use scirs2_stats;
56
57#[cfg(not(feature = "scirs2"))]
59pub mod fallback_scirs2 {
60 use scirs2_core::ndarray::{Array1, Array2, ArrayView1, ArrayView2};
61
62 pub fn mean(_data: &ArrayView1<f64>) -> Result<f64, String> {
63 Ok(0.0)
64 }
65 pub fn std(_data: &ArrayView1<f64>, _ddof: i32) -> Result<f64, String> {
66 Ok(1.0)
67 }
68 pub fn var(_data: &ArrayView1<f64>, _ddof: i32) -> Result<f64, String> {
69 Ok(1.0)
70 }
71 pub fn pearsonr(
72 _x: &ArrayView1<f64>,
73 _y: &ArrayView1<f64>,
74 _alt: &str,
75 ) -> Result<(f64, f64), String> {
76 Ok((0.0, 0.5))
77 }
78 pub fn trace(_matrix: &ArrayView2<f64>) -> Result<f64, String> {
79 Ok(1.0)
80 }
81 pub fn inv(_matrix: &ArrayView2<f64>) -> Result<Array2<f64>, String> {
82 Ok(Array2::eye(2))
83 }
84
85 pub struct OptimizeResult {
86 pub x: Array1<f64>,
87 pub fun: f64,
88 pub success: bool,
89 pub nit: usize,
90 pub nfev: usize,
91 pub message: String,
92 }
93
94 pub fn minimize(
95 _func: fn(&Array1<f64>) -> f64,
96 _x0: &Array1<f64>,
97 _method: &str,
98 ) -> Result<OptimizeResult, String> {
99 Ok(OptimizeResult {
100 x: Array1::zeros(2),
101 fun: 0.0,
102 success: true,
103 nit: 0,
104 nfev: 0,
105 message: "Fallback optimization".to_string(),
106 })
107 }
108
109 pub fn differential_evolution(
110 _func: fn(&Array1<f64>) -> f64,
111 _bounds: &[(f64, f64)],
112 ) -> Result<OptimizeResult, String> {
113 Ok(OptimizeResult {
114 x: Array1::zeros(2),
115 fun: 0.0,
116 success: true,
117 nit: 0,
118 nfev: 0,
119 message: "Fallback optimization".to_string(),
120 })
121 }
122}
123
124#[cfg(not(feature = "scirs2"))]
125pub use fallback_scirs2::*;
126
127pub fn execute_vqa(
133 config: VQAConfig,
134 ansatz: &circuits::ParametricCircuit,
135 objective_function: &dyn ObjectiveFunction,
136) -> DeviceResult<VQAResult> {
137 use scirs2_core::ndarray::Array1;
138 use std::time::Instant;
139
140 let max_iter = config.optimization_config.max_iterations;
141 let tol = config.optimization_config.convergence_tolerance;
142 let step = 0.01_f64;
143
144 let mut params = Array1::from_vec(ansatz.parameters.clone());
145 let mut best_value = f64::INFINITY;
146 let mut best_params = params.clone();
147 let mut history = Vec::with_capacity(max_iter);
148 let mut converged = false;
149 let start = Instant::now();
150
151 for _ in 0..max_iter {
152 let result = objective_function.evaluate(¶ms)?;
153 history.push(result.value);
154 if result.value < best_value {
155 best_value = result.value;
156 best_params = params.clone();
157 }
158 if history.len() > 1 {
159 let prev = history[history.len() - 2];
160 if (prev - result.value).abs() < tol {
161 converged = true;
162 break;
163 }
164 }
165 let grad = objective_function.compute_gradient(¶ms)?;
167 params = params - grad * step;
168 }
169
170 let statistics = statistical::analyze_convergence(&history);
171 Ok(VQAResult {
172 optimal_parameters: best_params.to_vec(),
173 best_value,
174 iterations: history.len(),
175 execution_time: start.elapsed(),
176 converged,
177 statistics,
178 history,
179 })
180}
181
182pub fn vqe_config() -> VQAConfig {
184 VQAConfig::new(VQAAlgorithmType::VQE)
185}
186
187pub fn qaoa_config(num_layers: usize) -> VQAConfig {
189 let mut config = VQAConfig::new(VQAAlgorithmType::QAOA);
190 config.optimization_config.max_iterations = num_layers * 100;
191 config
192}