1use scirs2_core::ndarray::{Array1, Array2};
4use serde::{Deserialize, Serialize};
5use std::time::Instant;
6
7#[derive(Debug, Clone)]
9pub struct VQAConfig {
10 pub algorithm_type: VQAAlgorithmType,
12 pub optimization_config: VQAOptimizationConfig,
14 pub statistical_config: VQAStatisticalConfig,
16 pub hardware_config: VQAHardwareConfig,
18 pub noise_mitigation: VQANoiseMitigation,
20 pub validation_config: VQAValidationConfig,
22}
23
24#[derive(Debug, Clone, PartialEq, Eq)]
26pub enum VQAAlgorithmType {
27 VQE,
29 QAOA,
31 VQC,
33 QNN,
35 VQF,
37 Custom(String),
39}
40
41#[derive(Debug, Clone)]
43pub struct VQAOptimizationConfig {
44 pub primary_optimizer: VQAOptimizer,
46 pub fallback_optimizers: Vec<VQAOptimizer>,
48 pub max_iterations: usize,
50 pub convergence_tolerance: f64,
52 pub parameter_bounds: Option<Vec<(f64, f64)>>,
54 pub gradient_method: GradientMethod,
56 pub enable_adaptive: bool,
58 pub multi_start_config: MultiStartConfig,
60 pub warm_restart: WarmRestartConfig,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq)]
66pub enum VQAOptimizer {
67 LBFGSB,
69 COBYLA,
71 NelderMead,
73 DifferentialEvolution,
75 SimulatedAnnealing,
77 BasinHopping,
79 DualAnnealing,
81 Powell,
83 PSO,
85 QNG,
87 SPSA,
89 Custom(String),
91}
92
93#[derive(Debug, Clone, PartialEq, Eq)]
95pub enum GradientMethod {
96 ParameterShift,
98 FiniteDifference,
100 ForwardDifference,
102 CentralDifference,
104 NaturalGradient,
106 AutomaticDifferentiation,
108}
109
110#[derive(Debug, Clone)]
112pub struct MultiStartConfig {
113 pub enable_multi_start: bool,
114 pub num_starts: usize,
115 pub initial_point_strategy: InitialPointStrategy,
116 pub convergence_criterion: ConvergenceCriterion,
117}
118
119#[derive(Debug, Clone, PartialEq, Eq)]
121pub enum InitialPointStrategy {
122 Random,
123 LatinHypercube,
124 Sobol,
125 Grid,
126 PreviousBest,
127 AdaptiveSampling,
128}
129
130#[derive(Debug, Clone, PartialEq, Eq)]
132pub enum ConvergenceCriterion {
133 BestValue,
134 ValueStability,
135 ParameterStability,
136 StatisticalTest,
137}
138
139#[derive(Debug, Clone)]
141pub struct WarmRestartConfig {
142 pub enable_warm_restart: bool,
143 pub restart_threshold: f64,
144 pub max_restarts: usize,
145 pub restart_strategy: RestartStrategy,
146}
147
148#[derive(Debug, Clone, PartialEq, Eq)]
150pub enum RestartStrategy {
151 RandomPerturbation,
152 BestKnownSolution,
153 AdaptiveStep,
154 MetaLearning,
155}
156
157#[derive(Debug, Clone)]
159pub struct VQAStatisticalConfig {
160 pub enable_monitoring: bool,
162 pub confidence_level: f64,
164 pub num_samples: usize,
166 pub enable_distribution_fitting: bool,
168 pub enable_correlation_analysis: bool,
170 pub enable_outlier_detection: bool,
172}
173
174#[derive(Debug, Clone)]
176pub struct VQAHardwareConfig {
177 pub enable_hardware_aware: bool,
179 pub use_gate_fidelities: bool,
181 pub use_connectivity_constraints: bool,
183 pub adaptive_shots: AdaptiveShotConfig,
185 pub hardware_optimization: HardwareOptimizationConfig,
187}
188
189#[derive(Debug, Clone)]
191pub struct AdaptiveShotConfig {
192 pub enable_adaptive: bool,
193 pub initial_shots: usize,
194 pub max_shots: usize,
195 pub shot_budget: usize,
196 pub allocation_strategy: ShotAllocationStrategy,
197 pub precision_target: f64,
198}
199
200#[derive(Debug, Clone, PartialEq, Eq)]
202pub enum ShotAllocationStrategy {
203 Uniform,
204 ProportionalToVariance,
205 ExpectedImprovement,
206 UncertaintyBased,
207 AdaptiveBayesian,
208}
209
210#[derive(Debug, Clone)]
212pub struct HardwareOptimizationConfig {
213 pub optimize_for_hardware: bool,
214 pub qubit_layout_optimization: bool,
215 pub gate_scheduling_optimization: bool,
216 pub error_mitigation_integration: bool,
217}
218
219#[derive(Debug, Clone)]
221pub struct VQANoiseMitigation {
222 pub enable_mitigation: bool,
224 pub zero_noise_extrapolation: ZNEConfig,
226 pub readout_error_mitigation: bool,
228 pub symmetry_verification: bool,
230 pub mitigation_budget: f64,
232}
233
234#[derive(Debug, Clone)]
236pub struct ZNEConfig {
237 pub enable_zne: bool,
238 pub noise_factors: Vec<f64>,
239 pub extrapolation_method: String,
240 pub mitigation_overhead: f64,
241}
242
243#[derive(Debug, Clone)]
245pub struct VQAValidationConfig {
246 pub enable_cross_validation: bool,
248 pub cv_folds: usize,
250 pub enable_convergence_monitoring: bool,
252 pub enable_performance_tracking: bool,
254 pub validation_metrics: Vec<ValidationMetric>,
256}
257
258#[derive(Debug, Clone, PartialEq, Eq)]
260pub enum ValidationMetric {
261 MSE,
263 MAE,
265 R2,
267 VarianceExplained,
269 StateFidelity,
271 EnergyVariance,
273 OptimizationEfficiency,
275}
276
277#[derive(Debug, Clone)]
279pub struct VQAResult {
280 pub device_id: String,
282 pub algorithm_type: VQAAlgorithmType,
284 pub config: VQAConfig,
286 pub optimal_parameters: Array1<f64>,
288 pub optimal_value: f64,
290 pub optimization_trajectory: OptimizationTrajectory,
292 pub statistical_analysis: VQAStatisticalAnalysis,
294 pub hardware_analysis: VQAHardwareAnalysis,
296 pub validation_results: VQAValidationResults,
298 pub convergence_analysis: ConvergenceAnalysis,
300 pub resource_utilization: ResourceUtilization,
302 pub execution_metadata: VQAExecutionMetadata,
304}
305
306#[derive(Debug, Clone)]
308pub struct OptimizationTrajectory {
309 pub parameter_history: Vec<Array1<f64>>,
311 pub objective_history: Array1<f64>,
313 pub gradient_norms: Option<Array1<f64>>,
315 pub step_sizes: Array1<f64>,
317 pub timestamps: Vec<Instant>,
319 pub convergence_indicators: ConvergenceIndicators,
321}
322
323#[derive(Debug, Clone)]
325pub struct ConvergenceIndicators {
326 pub parameter_convergence: bool,
327 pub objective_convergence: bool,
328 pub gradient_convergence: bool,
329 pub stagnation_detected: bool,
330}
331
332#[derive(Debug, Clone)]
334pub struct VQAStatisticalAnalysis;
335
336#[derive(Debug, Clone)]
337pub struct VQAHardwareAnalysis;
338
339#[derive(Debug, Clone)]
340pub struct VQAValidationResults;
341
342#[derive(Debug, Clone)]
343pub struct ConvergenceAnalysis;
344
345#[derive(Debug, Clone)]
346pub struct ResourceUtilization;
347
348#[derive(Debug, Clone)]
349pub struct VQAExecutionMetadata;
350
351impl Default for VQAConfig {
352 fn default() -> Self {
353 Self {
354 algorithm_type: VQAAlgorithmType::VQE,
355 optimization_config: VQAOptimizationConfig {
356 primary_optimizer: VQAOptimizer::LBFGSB,
357 fallback_optimizers: vec![VQAOptimizer::COBYLA, VQAOptimizer::NelderMead],
358 max_iterations: 1000,
359 convergence_tolerance: 1e-6,
360 parameter_bounds: None,
361 gradient_method: GradientMethod::ParameterShift,
362 enable_adaptive: true,
363 multi_start_config: MultiStartConfig {
364 enable_multi_start: true,
365 num_starts: 5,
366 initial_point_strategy: InitialPointStrategy::LatinHypercube,
367 convergence_criterion: ConvergenceCriterion::BestValue,
368 },
369 warm_restart: WarmRestartConfig {
370 enable_warm_restart: true,
371 restart_threshold: 1e-4,
372 max_restarts: 3,
373 restart_strategy: RestartStrategy::AdaptiveStep,
374 },
375 },
376 statistical_config: VQAStatisticalConfig {
377 enable_monitoring: true,
378 confidence_level: 0.95,
379 num_samples: 100,
380 enable_distribution_fitting: true,
381 enable_correlation_analysis: true,
382 enable_outlier_detection: true,
383 },
384 hardware_config: VQAHardwareConfig {
385 enable_hardware_aware: true,
386 use_gate_fidelities: true,
387 use_connectivity_constraints: true,
388 adaptive_shots: AdaptiveShotConfig {
389 enable_adaptive: true,
390 initial_shots: 1000,
391 max_shots: 10000,
392 shot_budget: 100_000,
393 allocation_strategy: ShotAllocationStrategy::UncertaintyBased,
394 precision_target: 1e-3,
395 },
396 hardware_optimization: HardwareOptimizationConfig {
397 optimize_for_hardware: true,
398 qubit_layout_optimization: true,
399 gate_scheduling_optimization: true,
400 error_mitigation_integration: true,
401 },
402 },
403 noise_mitigation: VQANoiseMitigation {
404 enable_mitigation: true,
405 zero_noise_extrapolation: ZNEConfig {
406 enable_zne: true,
407 noise_factors: vec![1.0, 3.0, 5.0],
408 extrapolation_method: "linear".to_string(),
409 mitigation_overhead: 3.0,
410 },
411 readout_error_mitigation: true,
412 symmetry_verification: true,
413 mitigation_budget: 5.0,
414 },
415 validation_config: VQAValidationConfig {
416 enable_cross_validation: true,
417 cv_folds: 5,
418 enable_convergence_monitoring: true,
419 enable_performance_tracking: true,
420 validation_metrics: vec![
421 ValidationMetric::MSE,
422 ValidationMetric::R2,
423 ValidationMetric::StateFidelity,
424 ValidationMetric::EnergyVariance,
425 ],
426 },
427 }
428 }
429}
430
431impl VQAConfig {
432 pub fn new(algorithm_type: VQAAlgorithmType) -> Self {
434 Self {
435 algorithm_type,
436 ..Default::default()
437 }
438 }
439
440 pub fn vqe() -> Self {
442 Self::new(VQAAlgorithmType::VQE)
443 }
444
445 pub fn qaoa() -> Self {
447 let mut config = Self::new(VQAAlgorithmType::QAOA);
448 config.optimization_config.primary_optimizer = VQAOptimizer::COBYLA;
450 config.optimization_config.gradient_method = GradientMethod::ParameterShift;
451 config
452 }
453
454 pub fn vqc() -> Self {
456 let mut config = Self::new(VQAAlgorithmType::VQC);
457 config.optimization_config.primary_optimizer = VQAOptimizer::QNG;
459 config.validation_config.validation_metrics =
460 vec![ValidationMetric::MSE, ValidationMetric::R2];
461 config
462 }
463
464 #[must_use]
466 pub const fn with_hardware_aware(mut self, enable: bool) -> Self {
467 self.hardware_config.enable_hardware_aware = enable;
468 self
469 }
470
471 #[must_use]
473 pub fn with_optimizer(mut self, optimizer: VQAOptimizer) -> Self {
474 self.optimization_config.primary_optimizer = optimizer;
475 self
476 }
477
478 #[must_use]
480 pub const fn with_max_iterations(mut self, max_iter: usize) -> Self {
481 self.optimization_config.max_iterations = max_iter;
482 self
483 }
484
485 #[must_use]
487 pub const fn with_tolerance(mut self, tolerance: f64) -> Self {
488 self.optimization_config.convergence_tolerance = tolerance;
489 self
490 }
491}
492
493impl OptimizationTrajectory {
494 pub fn new() -> Self {
496 Self {
497 parameter_history: Vec::new(),
498 objective_history: Array1::zeros(0),
499 gradient_norms: None,
500 step_sizes: Array1::zeros(0),
501 timestamps: Vec::new(),
502 convergence_indicators: ConvergenceIndicators {
503 parameter_convergence: false,
504 objective_convergence: false,
505 gradient_convergence: false,
506 stagnation_detected: false,
507 },
508 }
509 }
510}
511
512impl std::fmt::Display for VQAOptimizer {
513 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
514 let name = match self {
515 Self::LBFGSB => "L-BFGS-B",
516 Self::COBYLA => "COBYLA",
517 Self::NelderMead => "Nelder-Mead",
518 Self::DifferentialEvolution => "Differential Evolution",
519 Self::SimulatedAnnealing => "Simulated Annealing",
520 Self::BasinHopping => "Basin Hopping",
521 Self::DualAnnealing => "Dual Annealing",
522 Self::Powell => "Powell",
523 Self::PSO => "Particle Swarm Optimization",
524 Self::QNG => "Quantum Natural Gradient",
525 Self::SPSA => "SPSA",
526 Self::Custom(name) => name,
527 };
528 write!(f, "{name}")
529 }
530}