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),
ListChangeMoveSelector(ListChangeMoveConfig),
NearbyListChangeMoveSelector(NearbyListChangeMoveConfig),
ListSwapMoveSelector(ListSwapMoveConfig),
NearbyListSwapMoveSelector(NearbyListSwapMoveConfig),
SubListChangeMoveSelector(SubListChangeMoveConfig),
SubListSwapMoveSelector(SubListSwapMoveConfig),
ListReverseMoveSelector(ListReverseMoveConfig),
KOptMoveSelector(KOptMoveSelectorConfig),
ListRuinMoveSelector(ListRuinMoveSelectorConfig),
UnionMoveSelector(UnionMoveSelectorConfig),
CartesianProductMoveSelector(CartesianProductConfig),
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ChangeMoveConfig {
#[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, 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, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct UnionMoveSelectorConfig {
pub selectors: Vec<MoveSelectorConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct CartesianProductConfig {
pub selectors: Vec<MoveSelectorConfig>,
}