use serde::{Deserialize, Serialize};
use crate::acceptor::AcceptorConfig;
use crate::forager::ForagerConfig;
use crate::move_selector::{MoveSelectorConfig, VariableTargetConfig};
use crate::solver_config::MoveThreadCount;
use crate::termination::TerminationConfig;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum PhaseConfig {
ConstructionHeuristic(ConstructionHeuristicConfig),
LocalSearch(LocalSearchConfig),
PartitionedSearch(PartitionedSearchConfig),
Custom(CustomPhaseConfig),
}
fn default_k() -> usize {
2
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ConstructionHeuristicConfig {
#[serde(default)]
pub construction_heuristic_type: ConstructionHeuristicType,
#[serde(default)]
pub construction_obligation: ConstructionObligation,
#[serde(flatten)]
pub target: VariableTargetConfig,
#[serde(default = "default_k")]
pub k: usize,
pub value_candidate_limit: Option<usize>,
pub group_name: Option<String>,
pub group_candidate_limit: Option<usize>,
pub termination: Option<TerminationConfig>,
}
impl Default for ConstructionHeuristicConfig {
fn default() -> Self {
Self {
construction_heuristic_type: ConstructionHeuristicType::default(),
construction_obligation: ConstructionObligation::default(),
target: VariableTargetConfig::default(),
k: default_k(),
value_candidate_limit: None,
group_name: None,
group_candidate_limit: None,
termination: None,
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ConstructionObligation {
#[default]
PreserveUnassigned,
AssignWhenCandidateExists,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ConstructionHeuristicType {
#[default]
FirstFit,
FirstFitDecreasing,
WeakestFit,
WeakestFitDecreasing,
StrongestFit,
StrongestFitDecreasing,
CheapestInsertion,
AllocateEntityFromQueue,
AllocateToValueFromQueue,
ListRoundRobin,
ListCheapestInsertion,
ListRegretInsertion,
ListClarkeWright,
ListKOpt,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum LocalSearchType {
#[default]
AcceptorForager,
VariableNeighborhoodDescent,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct LocalSearchConfig {
#[serde(default)]
pub local_search_type: LocalSearchType,
pub acceptor: Option<AcceptorConfig>,
pub forager: Option<ForagerConfig>,
pub move_selector: Option<MoveSelectorConfig>,
#[serde(default)]
pub neighborhoods: Vec<MoveSelectorConfig>,
pub termination: Option<TerminationConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct PartitionedSearchConfig {
pub partitioner: Option<String>,
#[serde(default)]
pub thread_count: MoveThreadCount,
#[serde(default)]
pub log_progress: bool,
#[serde(default)]
pub child_phases: Vec<PhaseConfig>,
pub termination: Option<TerminationConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct CustomPhaseConfig {
pub name: String,
}