pub mod config;
pub mod core;
pub mod knowledge_base;
pub mod performance_evaluation;
pub mod problem_analysis;
pub mod strategy_learning;
pub mod subproblem_generation;
pub mod types;
pub mod utils;
pub use config::*;
pub use core::*;
pub use knowledge_base::*;
pub use performance_evaluation::*;
pub use problem_analysis::*;
pub use strategy_learning::*;
pub use subproblem_generation::*;
pub use types::*;
pub use utils::*;
use crate::ising::IsingModel;
use crate::simulator::AnnealingResult;
use scirs2_core::ndarray::Array1;
use std::time::{Duration, Instant};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum DecompositionStrategy {
GraphPartitioning,
CommunityDetection,
SpectralClustering,
Hierarchical,
Random,
Greedy,
NoDecomposition,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct ProblemAnalysis {
pub graph_metrics: GraphMetrics,
pub communities: Vec<DetectedCommunity>,
pub structures: Vec<DetectedStructure>,
pub complexity: ComplexityEstimate,
pub decomposability: DecomposabilityScore,
pub problem_features: Array1<f64>,
}
#[derive(Debug, Clone)]
pub struct DetectedCommunity {
pub id: usize,
pub vertices: Vec<usize>,
pub modularity: f64,
pub internal_density: f64,
pub external_density: f64,
}
#[derive(Debug, Clone)]
pub struct Subproblem {
pub id: usize,
pub model: IsingModel,
pub vertices: Vec<usize>,
pub boundary_edges: Vec<BoundaryEdge>,
pub metadata: SubproblemMetadata,
}
impl Subproblem {
#[must_use]
pub fn from_full_problem(problem: &IsingModel) -> Self {
Self {
id: 0,
model: problem.clone(),
vertices: (0..problem.num_qubits).collect(),
boundary_edges: Vec::new(),
metadata: SubproblemMetadata::new(),
}
}
}
#[derive(Debug, Clone)]
pub struct BoundaryEdge {
pub internal_vertex: usize,
pub external_vertex: usize,
pub coupling_strength: f64,
}
#[derive(Debug, Clone)]
pub struct SubproblemMetadata {
pub creation_time: Instant,
pub size: usize,
pub complexity_estimate: f64,
pub expected_solution_time: Duration,
}
impl SubproblemMetadata {
#[must_use]
pub fn new() -> Self {
Self {
creation_time: Instant::now(),
size: 0,
complexity_estimate: 0.0,
expected_solution_time: Duration::from_secs(1),
}
}
}
#[derive(Debug, Clone)]
pub struct DecompositionResult {
pub subproblems: Vec<Subproblem>,
pub strategy_used: DecompositionStrategy,
pub quality_score: f64,
pub analysis: ProblemAnalysis,
pub metadata: DecompositionMetadata,
}
#[derive(Debug, Clone)]
pub struct DecompositionMetadata {
pub decomposition_time: Duration,
pub strategy_selection_time: Duration,
pub total_subproblems: usize,
pub decomposition_depth: usize,
}
impl DecompositionMetadata {
#[must_use]
pub const fn new() -> Self {
Self {
decomposition_time: Duration::from_secs(0),
strategy_selection_time: Duration::from_secs(0),
total_subproblems: 0,
decomposition_depth: 1,
}
}
}