use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct VariableTargetConfig {
pub entity_class: Option<String>,
pub variable_name: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MoveSelectorConfig {
ChangeMoveSelector(ChangeMoveConfig),
SwapMoveSelector(SwapMoveConfig),
NearbyChangeMoveSelector(NearbyChangeMoveConfig),
NearbySwapMoveSelector(NearbySwapMoveConfig),
PillarChangeMoveSelector(PillarChangeMoveConfig),
PillarSwapMoveSelector(PillarSwapMoveConfig),
RuinRecreateMoveSelector(RuinRecreateMoveSelectorConfig),
GroupedScalarMoveSelector(GroupedScalarMoveSelectorConfig),
ListChangeMoveSelector(ListChangeMoveConfig),
NearbyListChangeMoveSelector(NearbyListChangeMoveConfig),
ListSwapMoveSelector(ListSwapMoveConfig),
NearbyListSwapMoveSelector(NearbyListSwapMoveConfig),
SublistChangeMoveSelector(SublistChangeMoveConfig),
SublistSwapMoveSelector(SublistSwapMoveConfig),
ListReverseMoveSelector(ListReverseMoveConfig),
KOptMoveSelector(KOptMoveSelectorConfig),
ListRuinMoveSelector(ListRuinMoveSelectorConfig),
LimitedNeighborhood(LimitedNeighborhoodConfig),
UnionMoveSelector(UnionMoveSelectorConfig),
CartesianProductMoveSelector(CartesianProductConfig),
ConflictRepairMoveSelector(ConflictRepairMoveSelectorConfig),
CompoundConflictRepairMoveSelector(CompoundConflictRepairMoveSelectorConfig),
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ChangeMoveConfig {
pub value_candidate_limit: Option<usize>,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SwapMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbyChangeMoveConfig {
pub max_nearby: usize,
pub value_candidate_limit: Option<usize>,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbyChangeMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
value_candidate_limit: None,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbySwapMoveConfig {
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbySwapMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct PillarChangeMoveConfig {
pub minimum_sub_pillar_size: usize,
pub maximum_sub_pillar_size: usize,
pub value_candidate_limit: Option<usize>,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct PillarSwapMoveConfig {
pub minimum_sub_pillar_size: usize,
pub maximum_sub_pillar_size: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RecreateHeuristicType {
#[default]
FirstFit,
CheapestInsertion,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum UnionSelectionOrder {
#[default]
Sequential,
RoundRobin,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct RuinRecreateMoveSelectorConfig {
pub min_ruin_count: usize,
pub max_ruin_count: usize,
pub moves_per_step: Option<usize>,
pub value_candidate_limit: Option<usize>,
pub recreate_heuristic_type: RecreateHeuristicType,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for RuinRecreateMoveSelectorConfig {
fn default() -> Self {
Self {
min_ruin_count: 2,
max_ruin_count: 5,
moves_per_step: None,
value_candidate_limit: None,
recreate_heuristic_type: RecreateHeuristicType::FirstFit,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct GroupedScalarMoveSelectorConfig {
pub group_name: String,
pub value_candidate_limit: Option<usize>,
pub max_moves_per_step: Option<usize>,
#[serde(default)]
pub require_hard_improvement: bool,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListChangeMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbyListChangeMoveConfig {
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbyListChangeMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListSwapMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbyListSwapMoveConfig {
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbyListSwapMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SublistChangeMoveConfig {
pub min_sublist_size: usize,
pub max_sublist_size: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for SublistChangeMoveConfig {
fn default() -> Self {
Self {
min_sublist_size: 1,
max_sublist_size: 3,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SublistSwapMoveConfig {
pub min_sublist_size: usize,
pub max_sublist_size: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for SublistSwapMoveConfig {
fn default() -> Self {
Self {
min_sublist_size: 1,
max_sublist_size: 3,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListReverseMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct KOptMoveSelectorConfig {
pub k: usize,
pub min_segment_len: usize,
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for KOptMoveSelectorConfig {
fn default() -> Self {
Self {
k: 3,
min_segment_len: 1,
max_nearby: 0,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListRuinMoveSelectorConfig {
pub min_ruin_count: usize,
pub max_ruin_count: usize,
pub moves_per_step: Option<usize>,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for ListRuinMoveSelectorConfig {
fn default() -> Self {
Self {
min_ruin_count: 2,
max_ruin_count: 5,
moves_per_step: None,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct LimitedNeighborhoodConfig {
pub selected_count_limit: usize,
pub selector: Box<MoveSelectorConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct UnionMoveSelectorConfig {
#[serde(default)]
pub selection_order: UnionSelectionOrder,
pub selectors: Vec<MoveSelectorConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct CartesianProductConfig {
#[serde(default)]
pub require_hard_improvement: bool,
pub selectors: Vec<MoveSelectorConfig>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct ConflictRepairMoveSelectorConfig {
pub constraints: Vec<String>,
#[serde(default = "default_conflict_repair_max_matches")]
pub max_matches_per_step: usize,
#[serde(default = "default_conflict_repair_max_repairs")]
pub max_repairs_per_match: usize,
#[serde(default = "default_conflict_repair_max_moves")]
pub max_moves_per_step: usize,
#[serde(default)]
pub require_hard_improvement: bool,
#[serde(default)]
pub include_soft_matches: bool,
}
impl Default for ConflictRepairMoveSelectorConfig {
fn default() -> Self {
Self {
constraints: Vec::new(),
max_matches_per_step: default_conflict_repair_max_matches(),
max_repairs_per_match: default_conflict_repair_max_repairs(),
max_moves_per_step: default_conflict_repair_max_moves(),
require_hard_improvement: false,
include_soft_matches: false,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct CompoundConflictRepairMoveSelectorConfig {
pub constraints: Vec<String>,
#[serde(default = "default_conflict_repair_max_matches")]
pub max_matches_per_step: usize,
#[serde(default = "default_conflict_repair_max_repairs")]
pub max_repairs_per_match: usize,
#[serde(default = "default_conflict_repair_max_moves")]
pub max_moves_per_step: usize,
#[serde(default = "default_require_hard_improvement")]
pub require_hard_improvement: bool,
#[serde(default)]
pub include_soft_matches: bool,
}
impl Default for CompoundConflictRepairMoveSelectorConfig {
fn default() -> Self {
Self {
constraints: Vec::new(),
max_matches_per_step: default_conflict_repair_max_matches(),
max_repairs_per_match: default_conflict_repair_max_repairs(),
max_moves_per_step: default_conflict_repair_max_moves(),
require_hard_improvement: default_require_hard_improvement(),
include_soft_matches: false,
}
}
}
fn default_conflict_repair_max_matches() -> usize {
16
}
fn default_conflict_repair_max_repairs() -> usize {
32
}
fn default_conflict_repair_max_moves() -> usize {
256
}
fn default_require_hard_improvement() -> bool {
true
}