quantrs2_device/vqa_support/
config.rs

1//! Configuration structures and enums for VQA algorithms
2
3use scirs2_core::ndarray::{Array1, Array2};
4use serde::{Deserialize, Serialize};
5use std::time::Instant;
6
7/// Configuration for VQA execution with SciRS2 optimization
8#[derive(Debug, Clone)]
9pub struct VQAConfig {
10    /// VQA algorithm type
11    pub algorithm_type: VQAAlgorithmType,
12    /// Optimization configuration
13    pub optimization_config: VQAOptimizationConfig,
14    /// Statistical analysis configuration
15    pub statistical_config: VQAStatisticalConfig,
16    /// Hardware-aware optimization settings
17    pub hardware_config: VQAHardwareConfig,
18    /// Noise mitigation settings
19    pub noise_mitigation: VQANoiseMitigation,
20    /// Validation and monitoring settings
21    pub validation_config: VQAValidationConfig,
22}
23
24/// Types of VQA algorithms supported
25#[derive(Debug, Clone, PartialEq, Eq)]
26pub enum VQAAlgorithmType {
27    /// Variational Quantum Eigensolver
28    VQE,
29    /// Quantum Approximate Optimization Algorithm
30    QAOA,
31    /// Variational Quantum Classifier
32    VQC,
33    /// Quantum Neural Network
34    QNN,
35    /// Variational Quantum Factoring
36    VQF,
37    /// Custom VQA with user-defined ansatz
38    Custom(String),
39}
40
41/// VQA optimization configuration using SciRS2
42#[derive(Debug, Clone)]
43pub struct VQAOptimizationConfig {
44    /// Primary optimizer
45    pub primary_optimizer: VQAOptimizer,
46    /// Fallback optimizers for robustness
47    pub fallback_optimizers: Vec<VQAOptimizer>,
48    /// Maximum iterations
49    pub max_iterations: usize,
50    /// Convergence tolerance
51    pub convergence_tolerance: f64,
52    /// Parameter bounds
53    pub parameter_bounds: Option<Vec<(f64, f64)>>,
54    /// Gradient estimation method
55    pub gradient_method: GradientMethod,
56    /// Enable adaptive optimization
57    pub enable_adaptive: bool,
58    /// Multi-start optimization
59    pub multi_start_config: MultiStartConfig,
60    /// Warm restart settings
61    pub warm_restart: WarmRestartConfig,
62}
63
64/// VQA optimizers leveraging SciRS2
65#[derive(Debug, Clone, PartialEq, Eq)]
66pub enum VQAOptimizer {
67    /// L-BFGS-B (for bounded optimization)
68    LBFGSB,
69    /// COBYLA (for constrained optimization)
70    COBYLA,
71    /// Nelder-Mead simplex
72    NelderMead,
73    /// Differential Evolution
74    DifferentialEvolution,
75    /// Simulated Annealing
76    SimulatedAnnealing,
77    /// Basin Hopping (global optimization)
78    BasinHopping,
79    /// Dual Annealing
80    DualAnnealing,
81    /// Powell's method
82    Powell,
83    /// Particle Swarm Optimization
84    PSO,
85    /// Quantum Natural Gradient
86    QNG,
87    /// SPSA (Simultaneous Perturbation Stochastic Approximation)
88    SPSA,
89    /// Custom optimizer
90    Custom(String),
91}
92
93/// Gradient estimation methods
94#[derive(Debug, Clone, PartialEq, Eq)]
95pub enum GradientMethod {
96    /// Parameter shift rule
97    ParameterShift,
98    /// Finite differences
99    FiniteDifference,
100    /// Forward differences
101    ForwardDifference,
102    /// Central differences
103    CentralDifference,
104    /// Natural gradient
105    NaturalGradient,
106    /// Automatic differentiation (if available)
107    AutomaticDifferentiation,
108}
109
110/// Multi-start optimization configuration
111#[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/// Strategies for generating initial points
120#[derive(Debug, Clone, PartialEq, Eq)]
121pub enum InitialPointStrategy {
122    Random,
123    LatinHypercube,
124    Sobol,
125    Grid,
126    PreviousBest,
127    AdaptiveSampling,
128}
129
130/// Convergence criteria for multi-start optimization
131#[derive(Debug, Clone, PartialEq, Eq)]
132pub enum ConvergenceCriterion {
133    BestValue,
134    ValueStability,
135    ParameterStability,
136    StatisticalTest,
137}
138
139/// Warm restart configuration
140#[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/// Restart strategies
149#[derive(Debug, Clone, PartialEq, Eq)]
150pub enum RestartStrategy {
151    RandomPerturbation,
152    BestKnownSolution,
153    AdaptiveStep,
154    MetaLearning,
155}
156
157/// Statistical analysis configuration for VQA
158#[derive(Debug, Clone)]
159pub struct VQAStatisticalConfig {
160    /// Enable statistical monitoring
161    pub enable_monitoring: bool,
162    /// Confidence level for statistical tests
163    pub confidence_level: f64,
164    /// Number of samples for statistical analysis
165    pub num_samples: usize,
166    /// Enable distribution fitting
167    pub enable_distribution_fitting: bool,
168    /// Enable correlation analysis
169    pub enable_correlation_analysis: bool,
170    /// Enable outlier detection
171    pub enable_outlier_detection: bool,
172}
173
174/// Hardware-aware optimization configuration
175#[derive(Debug, Clone)]
176pub struct VQAHardwareConfig {
177    /// Enable hardware-aware optimization
178    pub enable_hardware_aware: bool,
179    /// Account for gate fidelities
180    pub use_gate_fidelities: bool,
181    /// Account for connectivity constraints
182    pub use_connectivity_constraints: bool,
183    /// Enable adaptive shot allocation
184    pub adaptive_shots: AdaptiveShotConfig,
185    /// Hardware-specific optimization
186    pub hardware_optimization: HardwareOptimizationConfig,
187}
188
189/// Adaptive shot allocation configuration
190#[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/// Shot allocation strategies
201#[derive(Debug, Clone, PartialEq, Eq)]
202pub enum ShotAllocationStrategy {
203    Uniform,
204    ProportionalToVariance,
205    ExpectedImprovement,
206    UncertaintyBased,
207    AdaptiveBayesian,
208}
209
210/// Hardware-specific optimization configuration
211#[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/// Noise mitigation configuration for VQA
220#[derive(Debug, Clone)]
221pub struct VQANoiseMitigation {
222    /// Enable noise mitigation
223    pub enable_mitigation: bool,
224    /// Zero-noise extrapolation
225    pub zero_noise_extrapolation: ZNEConfig,
226    /// Readout error mitigation
227    pub readout_error_mitigation: bool,
228    /// Symmetry verification
229    pub symmetry_verification: bool,
230    /// Error mitigation overhead budget
231    pub mitigation_budget: f64,
232}
233
234/// Zero-noise extrapolation configuration
235#[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/// VQA validation and monitoring configuration
244#[derive(Debug, Clone)]
245pub struct VQAValidationConfig {
246    /// Enable cross-validation
247    pub enable_cross_validation: bool,
248    /// Number of CV folds
249    pub cv_folds: usize,
250    /// Enable convergence monitoring
251    pub enable_convergence_monitoring: bool,
252    /// Enable performance tracking
253    pub enable_performance_tracking: bool,
254    /// Validation metrics to compute
255    pub validation_metrics: Vec<ValidationMetric>,
256}
257
258/// Validation metrics for VQA
259#[derive(Debug, Clone, PartialEq, Eq)]
260pub enum ValidationMetric {
261    /// Mean squared error
262    MSE,
263    /// Mean absolute error
264    MAE,
265    /// R-squared
266    R2,
267    /// Variance explained
268    VarianceExplained,
269    /// Fidelity to target state
270    StateFidelity,
271    /// Energy variance
272    EnergyVariance,
273    /// Optimization efficiency
274    OptimizationEfficiency,
275}
276
277/// Comprehensive VQA execution result with SciRS2 analysis
278#[derive(Debug, Clone)]
279pub struct VQAResult {
280    /// Device identifier
281    pub device_id: String,
282    /// Algorithm type used
283    pub algorithm_type: VQAAlgorithmType,
284    /// Configuration used
285    pub config: VQAConfig,
286    /// Optimal parameters found
287    pub optimal_parameters: Array1<f64>,
288    /// Optimal objective value
289    pub optimal_value: f64,
290    /// Optimization trajectory
291    pub optimization_trajectory: OptimizationTrajectory,
292    /// Statistical analysis of the optimization
293    pub statistical_analysis: VQAStatisticalAnalysis,
294    /// Hardware performance analysis
295    pub hardware_analysis: VQAHardwareAnalysis,
296    /// Validation results
297    pub validation_results: VQAValidationResults,
298    /// Convergence analysis
299    pub convergence_analysis: ConvergenceAnalysis,
300    /// Resource utilization
301    pub resource_utilization: ResourceUtilization,
302    /// Execution metadata
303    pub execution_metadata: VQAExecutionMetadata,
304}
305
306/// Optimization trajectory tracking
307#[derive(Debug, Clone)]
308pub struct OptimizationTrajectory {
309    /// Parameter values at each iteration
310    pub parameter_history: Vec<Array1<f64>>,
311    /// Objective values at each iteration
312    pub objective_history: Array1<f64>,
313    /// Gradient norms (if available)
314    pub gradient_norms: Option<Array1<f64>>,
315    /// Step sizes
316    pub step_sizes: Array1<f64>,
317    /// Iteration timestamps
318    pub timestamps: Vec<Instant>,
319    /// Convergence indicators
320    pub convergence_indicators: ConvergenceIndicators,
321}
322
323/// Convergence indicators
324#[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/// Forward declarations for analysis structures (to be implemented in other modules)
333#[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    /// Create new VQA configuration with algorithm type
433    pub fn new(algorithm_type: VQAAlgorithmType) -> Self {
434        Self {
435            algorithm_type,
436            ..Default::default()
437        }
438    }
439
440    /// Create VQE-specific configuration
441    pub fn vqe() -> Self {
442        Self::new(VQAAlgorithmType::VQE)
443    }
444
445    /// Create QAOA-specific configuration
446    pub fn qaoa() -> Self {
447        let mut config = Self::new(VQAAlgorithmType::QAOA);
448        // QAOA-specific optimizations
449        config.optimization_config.primary_optimizer = VQAOptimizer::COBYLA;
450        config.optimization_config.gradient_method = GradientMethod::ParameterShift;
451        config
452    }
453
454    /// Create VQC-specific configuration
455    pub fn vqc() -> Self {
456        let mut config = Self::new(VQAAlgorithmType::VQC);
457        // VQC-specific optimizations
458        config.optimization_config.primary_optimizer = VQAOptimizer::QNG;
459        config.validation_config.validation_metrics =
460            vec![ValidationMetric::MSE, ValidationMetric::R2];
461        config
462    }
463
464    /// Enable hardware-aware optimization
465    #[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    /// Set optimization method
472    #[must_use]
473    pub fn with_optimizer(mut self, optimizer: VQAOptimizer) -> Self {
474        self.optimization_config.primary_optimizer = optimizer;
475        self
476    }
477
478    /// Set maximum iterations
479    #[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    /// Set convergence tolerance
486    #[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    /// Create new optimization trajectory
495    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}