solverforge-config 0.10.0

Configuration system for SolverForge constraint solver
Documentation
use serde::{Deserialize, Serialize};

// Acceptor configuration.
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AcceptorConfig {
    // Hill climbing (only accept improving moves).
    HillClimbing,

    // Step counting hill climbing (allow limited non-improving moves).
    StepCountingHillClimbing(StepCountingHillClimbingConfig),

    // Tabu search acceptor.
    TabuSearch(TabuSearchConfig),

    // Simulated annealing acceptor.
    SimulatedAnnealing(SimulatedAnnealingConfig),

    // Late acceptance acceptor.
    LateAcceptance(LateAcceptanceConfig),

    // Diversified late acceptance acceptor.
    DiversifiedLateAcceptance(DiversifiedLateAcceptanceConfig),

    // Great deluge acceptor.
    GreatDeluge(GreatDelugeConfig),
}

// Step counting hill climbing configuration.
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct StepCountingHillClimbingConfig {
    pub step_count_limit: Option<u64>,
}

// Tabu search configuration.
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct TabuSearchConfig {
    // Size of entity tabu list. Explicit `0` is invalid.
    pub entity_tabu_size: Option<usize>,

    // Size of value tabu list. Explicit `0` is invalid.
    pub value_tabu_size: Option<usize>,

    // Size of move tabu list. Explicit `0` is invalid.
    pub move_tabu_size: Option<usize>,

    // Size of undo move tabu list. Explicit `0` is invalid.
    pub undo_move_tabu_size: Option<usize>,

    // Whether aspiration can override tabu on strict new-best candidates.
    // When all sizes are omitted, the canonical runtime normalizes to
    // move-tabu-only with `move_tabu_size = 10` and `aspiration_enabled = true`.
    pub aspiration_enabled: Option<bool>,
}

// Simulated annealing configuration.
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SimulatedAnnealingConfig {
    // Per-score-level delta temperatures, highest priority level first.
    pub level_temperatures: Option<Vec<f64>>,

    // Decay rate.
    pub decay_rate: Option<f64>,

    // Temperature at or below which worsening moves are rejected deterministically.
    pub hill_climbing_temperature: Option<f64>,

    // Hard-regression policy.
    pub hard_regression_policy: Option<HardRegressionPolicyConfig>,

    // Sampled auto-calibration settings used when level_temperatures is omitted.
    pub calibration: Option<SimulatedAnnealingCalibrationConfig>,
}

#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum HardRegressionPolicyConfig {
    #[default]
    TemperatureControlled,
    NeverAcceptHardRegression,
}

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SimulatedAnnealingCalibrationConfig {
    pub sample_size: Option<usize>,
    pub target_acceptance_probability: Option<f64>,
    pub fallback_temperature: Option<f64>,
}

// Late acceptance configuration.
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct LateAcceptanceConfig {
    // Size of late acceptance list.
    pub late_acceptance_size: Option<usize>,
}

// Diversified late acceptance configuration.
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct DiversifiedLateAcceptanceConfig {
    // Size of late acceptance list.
    pub late_acceptance_size: Option<usize>,

    // Fractional tolerance against the phase-best score.
    pub tolerance: Option<f64>,
}

// Great deluge configuration.
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct GreatDelugeConfig {
    // Water level increase ratio.
    pub water_level_increase_ratio: Option<f64>,
}