quantrs2_device/adaptive_compilation/
strategies.rs

1//! Optimization Strategies and Adaptive Algorithm Configuration
2
3use std::time::Duration;
4
5/// Optimization algorithms available
6#[derive(Debug, Clone, PartialEq)]
7pub enum OptimizationAlgorithm {
8    GradientDescent,
9    LBFGS,
10    DifferentialEvolution,
11    GeneticAlgorithm,
12    ParticleSwarm,
13    SimulatedAnnealing,
14    BayesianOptimization,
15    ReinforcementLearning,
16    QuantumApproximateOptimization,
17    HybridClassicalQuantum,
18}
19
20/// Adaptive strategies configuration
21#[derive(Debug, Clone)]
22pub struct AdaptiveStrategiesConfig {
23    /// Enable adaptive circuit optimization
24    pub enable_adaptive_circuits: bool,
25    /// Enable adaptive resource allocation
26    pub enable_adaptive_resources: bool,
27    /// Enable adaptive error mitigation
28    pub enable_adaptive_error_mitigation: bool,
29    /// Enable adaptive scheduling
30    pub enable_adaptive_scheduling: bool,
31    /// Adaptation triggers
32    pub adaptation_triggers: Vec<AdaptationTrigger>,
33    /// Learning rate for adaptation
34    pub adaptation_learning_rate: f64,
35    /// Exploration vs exploitation balance
36    pub exploration_exploitation_balance: f64,
37}
38
39/// Triggers for adaptive optimization
40#[derive(Debug, Clone, PartialEq)]
41pub enum AdaptationTrigger {
42    PerformanceDegradation,
43    TimeInterval,
44    ErrorRateIncrease,
45    ResourceConstraintViolation,
46    UserRequest,
47    AutomaticDetection,
48}
49
50/// Parallel optimization configuration
51#[derive(Debug, Clone)]
52pub struct ParallelOptimizationConfig {
53    pub enable_parallel: bool,
54    pub max_parallel_jobs: usize,
55    pub load_balancing_strategy: LoadBalancingStrategy,
56    pub resource_allocation: ResourceAllocationStrategy,
57}
58
59/// Load balancing strategies for parallel optimization
60#[derive(Debug, Clone, PartialEq)]
61pub enum LoadBalancingStrategy {
62    RoundRobin,
63    LeastLoaded,
64    PerformanceBased,
65    PredictiveBased,
66}
67
68/// Resource allocation strategies
69#[derive(Debug, Clone, PartialEq)]
70pub enum ResourceAllocationStrategy {
71    Static,
72    Dynamic,
73    PredictiveBased,
74    LoadAware,
75    CapacityBased,
76}
77
78/// Circuit analysis configuration
79#[derive(Debug, Clone)]
80pub struct CircuitAnalysisConfig {
81    /// Enable comprehensive circuit analysis
82    pub enable_analysis: bool,
83    /// Analysis depth level
84    pub analysis_depth: AnalysisDepth,
85    /// Circuit complexity analysis
86    pub complexity_analysis: ComplexityAnalysisConfig,
87    /// Circuit structure analysis
88    pub structure_analysis: StructureAnalysisConfig,
89    /// Circuit optimization potential analysis
90    pub optimization_potential: OptimizationPotentialConfig,
91}
92
93/// Analysis depth levels
94#[derive(Debug, Clone, PartialEq)]
95pub enum AnalysisDepth {
96    Basic,
97    Intermediate,
98    Comprehensive,
99    ExhaustiveSearch,
100}
101
102/// Circuit complexity analysis configuration
103#[derive(Debug, Clone)]
104pub struct ComplexityAnalysisConfig {
105    /// Complexity metrics to compute
106    pub complexity_metrics: Vec<ComplexityMetric>,
107    /// Enable parallel complexity analysis
108    pub enable_parallel_analysis: bool,
109    /// Analysis timeout
110    pub analysis_timeout: Duration,
111    /// Resource limits for analysis
112    pub resource_limits: AnalysisResourceLimits,
113}
114
115/// Complexity metrics for circuit analysis
116#[derive(Debug, Clone, PartialEq)]
117pub enum ComplexityMetric {
118    CircuitDepth,
119    GateCount,
120    TwoQubitGateCount,
121    ParameterCount,
122    ConnectivityComplexity,
123    EntanglementComplexity,
124    ComputationalComplexity,
125    SimulationComplexity,
126}
127
128/// Circuit structure analysis configuration
129#[derive(Debug, Clone)]
130pub struct StructureAnalysisConfig {
131    /// Pattern recognition
132    pub pattern_recognition: bool,
133    /// Symmetry detection
134    pub symmetry_detection: bool,
135    /// Subcircuit identification
136    pub subcircuit_identification: bool,
137    /// Critical path analysis
138    pub critical_path_analysis: bool,
139}
140
141/// Optimization potential analysis configuration
142#[derive(Debug, Clone)]
143pub struct OptimizationPotentialConfig {
144    /// Potential metrics to evaluate
145    pub potential_metrics: Vec<PotentialMetric>,
146    /// Optimization opportunity detection
147    pub opportunity_detection: bool,
148    /// Bottleneck identification
149    pub bottleneck_identification: bool,
150    /// Resource utilization analysis
151    pub resource_utilization_analysis: bool,
152}
153
154/// Metrics for evaluating optimization potential
155#[derive(Debug, Clone, PartialEq)]
156pub enum PotentialMetric {
157    GateReduction,
158    DepthReduction,
159    ParallelizationOpportunity,
160    ResourceOptimization,
161    ErrorMitigationPotential,
162    ExecutionTimeImprovement,
163}
164
165/// Resource limits for circuit analysis
166#[derive(Debug, Clone)]
167pub struct AnalysisResourceLimits {
168    /// Maximum memory usage (MB)
169    pub max_memory_mb: usize,
170    /// Maximum CPU time
171    pub max_cpu_time: Duration,
172    /// Maximum parallel threads
173    pub max_threads: usize,
174}
175
176impl Default for AdaptiveStrategiesConfig {
177    fn default() -> Self {
178        Self {
179            enable_adaptive_circuits: true,
180            enable_adaptive_resources: true,
181            enable_adaptive_error_mitigation: true,
182            enable_adaptive_scheduling: true,
183            adaptation_triggers: vec![
184                AdaptationTrigger::PerformanceDegradation,
185                AdaptationTrigger::TimeInterval,
186                AdaptationTrigger::AutomaticDetection,
187            ],
188            adaptation_learning_rate: 0.01,
189            exploration_exploitation_balance: 0.1,
190        }
191    }
192}
193
194impl Default for ParallelOptimizationConfig {
195    fn default() -> Self {
196        Self {
197            enable_parallel: true,
198            max_parallel_jobs: 4,
199            load_balancing_strategy: LoadBalancingStrategy::PerformanceBased,
200            resource_allocation: ResourceAllocationStrategy::Dynamic,
201        }
202    }
203}
204
205impl Default for CircuitAnalysisConfig {
206    fn default() -> Self {
207        Self {
208            enable_analysis: true,
209            analysis_depth: AnalysisDepth::Intermediate,
210            complexity_analysis: ComplexityAnalysisConfig::default(),
211            structure_analysis: StructureAnalysisConfig::default(),
212            optimization_potential: OptimizationPotentialConfig::default(),
213        }
214    }
215}
216
217impl Default for ComplexityAnalysisConfig {
218    fn default() -> Self {
219        Self {
220            complexity_metrics: vec![
221                ComplexityMetric::CircuitDepth,
222                ComplexityMetric::GateCount,
223                ComplexityMetric::TwoQubitGateCount,
224                ComplexityMetric::ConnectivityComplexity,
225            ],
226            enable_parallel_analysis: true,
227            analysis_timeout: Duration::from_secs(60),
228            resource_limits: AnalysisResourceLimits::default(),
229        }
230    }
231}
232
233impl Default for StructureAnalysisConfig {
234    fn default() -> Self {
235        Self {
236            pattern_recognition: true,
237            symmetry_detection: true,
238            subcircuit_identification: true,
239            critical_path_analysis: true,
240        }
241    }
242}
243
244impl Default for OptimizationPotentialConfig {
245    fn default() -> Self {
246        Self {
247            potential_metrics: vec![
248                PotentialMetric::GateReduction,
249                PotentialMetric::DepthReduction,
250                PotentialMetric::ParallelizationOpportunity,
251            ],
252            opportunity_detection: true,
253            bottleneck_identification: true,
254            resource_utilization_analysis: true,
255        }
256    }
257}
258
259impl Default for AnalysisResourceLimits {
260    fn default() -> Self {
261        Self {
262            max_memory_mb: 2048,
263            max_cpu_time: Duration::from_secs(300),
264            max_threads: 8,
265        }
266    }
267}