use std::collections::HashMap;
use super::{
GenerationStrategyType, OverlapResolutionMethod, OverlapStrategy, SizeBalancingStrategy,
SizeConstraints, ValidationCriterionType,
};
#[derive(Debug, Clone)]
pub struct SubproblemGenerator {
pub generation_strategies: Vec<GenerationStrategy>,
pub overlap_manager: OverlapManager,
pub size_controller: SizeController,
pub quality_validator: QualityValidator,
}
impl SubproblemGenerator {
pub fn new() -> Result<Self, String> {
Ok(Self {
generation_strategies: Vec::new(),
overlap_manager: OverlapManager::new(),
size_controller: SizeController::new(),
quality_validator: QualityValidator::new(),
})
}
}
#[derive(Debug, Clone)]
pub struct GenerationStrategy {
pub strategy_type: GenerationStrategyType,
pub parameters: GenerationParameters,
pub success_rate: f64,
pub average_quality: f64,
}
#[derive(Debug, Clone)]
pub struct GenerationParameters {
pub target_num_subproblems: usize,
pub size_balance_tolerance: f64,
pub quality_threshold: f64,
pub max_iterations: usize,
}
#[derive(Debug, Clone)]
pub struct OverlapManager {
pub overlap_strategy: OverlapStrategy,
pub overlap_size: usize,
pub resolution_method: OverlapResolutionMethod,
}
impl OverlapManager {
#[must_use]
pub const fn new() -> Self {
Self {
overlap_strategy: OverlapStrategy::NoOverlap,
overlap_size: 0,
resolution_method: OverlapResolutionMethod::Voting,
}
}
}
#[derive(Debug, Clone)]
pub struct SizeController {
pub size_constraints: SizeConstraints,
pub balancing_strategy: SizeBalancingStrategy,
pub adaptive_sizing: bool,
}
impl SizeController {
#[must_use]
pub fn new() -> Self {
Self {
size_constraints: SizeConstraints::default(),
balancing_strategy: SizeBalancingStrategy::Flexible,
adaptive_sizing: true,
}
}
}
#[derive(Debug, Clone)]
pub struct QualityValidator {
pub validation_criteria: Vec<ValidationCriterion>,
pub validation_threshold: f64,
pub strict_validation: bool,
}
impl QualityValidator {
#[must_use]
pub fn new() -> Self {
Self {
validation_criteria: vec![
ValidationCriterion {
criterion_type: ValidationCriterionType::ConnectivityPreservation,
weight: 0.3,
threshold: 0.8,
},
ValidationCriterion {
criterion_type: ValidationCriterionType::SizeBalance,
weight: 0.2,
threshold: 0.7,
},
ValidationCriterion {
criterion_type: ValidationCriterionType::CutQuality,
weight: 0.5,
threshold: 0.6,
},
],
validation_threshold: 0.7,
strict_validation: false,
}
}
}
#[derive(Debug, Clone)]
pub struct ValidationCriterion {
pub criterion_type: ValidationCriterionType,
pub weight: f64,
pub threshold: f64,
}