Skip to main content

quantrs2_anneal/active_learning_decomposition/
subproblem_generation.rs

1//! Subproblem generation components
2
3use std::collections::HashMap;
4
5use super::{
6    GenerationStrategyType, OverlapResolutionMethod, OverlapStrategy, SizeBalancingStrategy,
7    SizeConstraints, ValidationCriterionType,
8};
9
10/// Subproblem generator
11#[derive(Debug, Clone)]
12pub struct SubproblemGenerator {
13    /// Generation strategies
14    pub generation_strategies: Vec<GenerationStrategy>,
15    /// Overlap manager
16    pub overlap_manager: OverlapManager,
17    /// Size controller
18    pub size_controller: SizeController,
19    /// Quality validator
20    pub quality_validator: QualityValidator,
21}
22
23impl SubproblemGenerator {
24    pub fn new() -> Result<Self, String> {
25        Ok(Self {
26            generation_strategies: Vec::new(),
27            overlap_manager: OverlapManager::new(),
28            size_controller: SizeController::new(),
29            quality_validator: QualityValidator::new(),
30        })
31    }
32}
33
34/// Generation strategy
35#[derive(Debug, Clone)]
36pub struct GenerationStrategy {
37    /// Strategy type
38    pub strategy_type: GenerationStrategyType,
39    /// Strategy parameters
40    pub parameters: GenerationParameters,
41    /// Success rate
42    pub success_rate: f64,
43    /// Average quality
44    pub average_quality: f64,
45}
46
47/// Generation parameters
48#[derive(Debug, Clone)]
49pub struct GenerationParameters {
50    /// Target number of subproblems
51    pub target_num_subproblems: usize,
52    /// Size balance tolerance
53    pub size_balance_tolerance: f64,
54    /// Quality threshold
55    pub quality_threshold: f64,
56    /// Maximum iterations
57    pub max_iterations: usize,
58}
59
60/// Overlap manager
61#[derive(Debug, Clone)]
62pub struct OverlapManager {
63    /// Overlap strategy
64    pub overlap_strategy: OverlapStrategy,
65    /// Overlap size
66    pub overlap_size: usize,
67    /// Overlap resolution method
68    pub resolution_method: OverlapResolutionMethod,
69}
70
71impl OverlapManager {
72    #[must_use]
73    pub const fn new() -> Self {
74        Self {
75            overlap_strategy: OverlapStrategy::NoOverlap,
76            overlap_size: 0,
77            resolution_method: OverlapResolutionMethod::Voting,
78        }
79    }
80}
81
82/// Size controller
83#[derive(Debug, Clone)]
84pub struct SizeController {
85    /// Size constraints
86    pub size_constraints: SizeConstraints,
87    /// Size balancing strategy
88    pub balancing_strategy: SizeBalancingStrategy,
89    /// Adaptive sizing enabled
90    pub adaptive_sizing: bool,
91}
92
93impl SizeController {
94    #[must_use]
95    pub fn new() -> Self {
96        Self {
97            size_constraints: SizeConstraints::default(),
98            balancing_strategy: SizeBalancingStrategy::Flexible,
99            adaptive_sizing: true,
100        }
101    }
102}
103
104/// Quality validator
105#[derive(Debug, Clone)]
106pub struct QualityValidator {
107    /// Validation criteria
108    pub validation_criteria: Vec<ValidationCriterion>,
109    /// Validation threshold
110    pub validation_threshold: f64,
111    /// Strict validation enabled
112    pub strict_validation: bool,
113}
114
115impl QualityValidator {
116    #[must_use]
117    pub fn new() -> Self {
118        Self {
119            validation_criteria: vec![
120                ValidationCriterion {
121                    criterion_type: ValidationCriterionType::ConnectivityPreservation,
122                    weight: 0.3,
123                    threshold: 0.8,
124                },
125                ValidationCriterion {
126                    criterion_type: ValidationCriterionType::SizeBalance,
127                    weight: 0.2,
128                    threshold: 0.7,
129                },
130                ValidationCriterion {
131                    criterion_type: ValidationCriterionType::CutQuality,
132                    weight: 0.5,
133                    threshold: 0.6,
134                },
135            ],
136            validation_threshold: 0.7,
137            strict_validation: false,
138        }
139    }
140}
141
142/// Validation criterion
143#[derive(Debug, Clone)]
144pub struct ValidationCriterion {
145    /// Criterion type
146    pub criterion_type: ValidationCriterionType,
147    /// Weight in overall validation
148    pub weight: f64,
149    /// Threshold for this criterion
150    pub threshold: f64,
151}