use serde::{Deserialize, Serialize};
use crate::acceptor::AcceptorConfig;
use crate::forager::ForagerConfig;
use crate::move_selector::{MoveSelectorConfig, VariableTargetConfig};
use crate::termination::TerminationConfig;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum PhaseConfig {
ConstructionHeuristic(ConstructionHeuristicConfig),
LocalSearch(LocalSearchConfig),
Vnd(VndConfig),
ExhaustiveSearch(ExhaustiveSearchConfig),
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(flatten)]
pub target: VariableTargetConfig,
#[serde(default = "default_k")]
pub k: usize,
pub termination: Option<TerminationConfig>,
}
impl Default for ConstructionHeuristicConfig {
fn default() -> Self {
Self {
construction_heuristic_type: ConstructionHeuristicType::default(),
target: VariableTargetConfig::default(),
k: default_k(),
termination: None,
}
}
}
#[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, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct LocalSearchConfig {
pub acceptor: Option<AcceptorConfig>,
pub forager: Option<ForagerConfig>,
pub move_selector: Option<MoveSelectorConfig>,
pub termination: Option<TerminationConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct VndConfig {
#[serde(default)]
pub neighborhoods: Vec<MoveSelectorConfig>,
pub termination: Option<TerminationConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ExhaustiveSearchConfig {
#[serde(default)]
pub exhaustive_search_type: ExhaustiveSearchType,
pub termination: Option<TerminationConfig>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ExhaustiveSearchType {
#[default]
BranchAndBound,
BruteForce,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct PartitionedSearchConfig {
pub partition_count: Option<usize>,
pub termination: Option<TerminationConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct CustomPhaseConfig {
pub custom_phase_class: Option<String>,
}