quantrs2_anneal/active_learning_decomposition/
mod.rs1pub mod config;
17pub mod core;
18pub mod knowledge_base;
19pub mod performance_evaluation;
20pub mod problem_analysis;
21pub mod strategy_learning;
22pub mod subproblem_generation;
23pub mod types;
24pub mod utils;
25
26pub use config::*;
27pub use core::*;
28pub use knowledge_base::*;
29pub use performance_evaluation::*;
30pub use problem_analysis::*;
31pub use strategy_learning::*;
32pub use subproblem_generation::*;
33pub use types::*;
34pub use utils::*;
35
36use crate::ising::IsingModel;
37use crate::simulator::AnnealingResult;
38use scirs2_core::ndarray::Array1;
39use std::time::{Duration, Instant};
40
41#[derive(Debug, Clone, PartialEq, Eq, Hash)]
43pub enum DecompositionStrategy {
44 GraphPartitioning,
46 CommunityDetection,
48 SpectralClustering,
50 Hierarchical,
52 Random,
54 Greedy,
56 NoDecomposition,
58 Custom(String),
60}
61
62#[derive(Debug, Clone)]
64pub struct ProblemAnalysis {
65 pub graph_metrics: GraphMetrics,
67 pub communities: Vec<DetectedCommunity>,
69 pub structures: Vec<DetectedStructure>,
71 pub complexity: ComplexityEstimate,
73 pub decomposability: DecomposabilityScore,
75 pub problem_features: Array1<f64>,
77}
78
79#[derive(Debug, Clone)]
81pub struct DetectedCommunity {
82 pub id: usize,
84 pub vertices: Vec<usize>,
86 pub modularity: f64,
88 pub internal_density: f64,
90 pub external_density: f64,
92}
93
94#[derive(Debug, Clone)]
96pub struct Subproblem {
97 pub id: usize,
99 pub model: IsingModel,
101 pub vertices: Vec<usize>,
103 pub boundary_edges: Vec<BoundaryEdge>,
105 pub metadata: SubproblemMetadata,
107}
108
109impl Subproblem {
110 #[must_use]
111 pub fn from_full_problem(problem: &IsingModel) -> Self {
112 Self {
113 id: 0,
114 model: problem.clone(),
115 vertices: (0..problem.num_qubits).collect(),
116 boundary_edges: Vec::new(),
117 metadata: SubproblemMetadata::new(),
118 }
119 }
120}
121
122#[derive(Debug, Clone)]
124pub struct BoundaryEdge {
125 pub internal_vertex: usize,
127 pub external_vertex: usize,
129 pub coupling_strength: f64,
131}
132
133#[derive(Debug, Clone)]
135pub struct SubproblemMetadata {
136 pub creation_time: Instant,
138 pub size: usize,
140 pub complexity_estimate: f64,
142 pub expected_solution_time: Duration,
144}
145
146impl SubproblemMetadata {
147 #[must_use]
148 pub fn new() -> Self {
149 Self {
150 creation_time: Instant::now(),
151 size: 0,
152 complexity_estimate: 0.0,
153 expected_solution_time: Duration::from_secs(1),
154 }
155 }
156}
157
158#[derive(Debug, Clone)]
160pub struct DecompositionResult {
161 pub subproblems: Vec<Subproblem>,
163 pub strategy_used: DecompositionStrategy,
165 pub quality_score: f64,
167 pub analysis: ProblemAnalysis,
169 pub metadata: DecompositionMetadata,
171}
172
173#[derive(Debug, Clone)]
175pub struct DecompositionMetadata {
176 pub decomposition_time: Duration,
178 pub strategy_selection_time: Duration,
180 pub total_subproblems: usize,
182 pub decomposition_depth: usize,
184}
185
186impl DecompositionMetadata {
187 #[must_use]
188 pub const fn new() -> Self {
189 Self {
190 decomposition_time: Duration::from_secs(0),
191 strategy_selection_time: Duration::from_secs(0),
192 total_subproblems: 0,
193 decomposition_depth: 1,
194 }
195 }
196}