1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
4#[serde(rename_all = "snake_case")]
5pub struct VariableTargetConfig {
6 pub entity_class: Option<String>,
7 pub variable_name: Option<String>,
8}
9
10#[derive(Debug, Clone, Deserialize, Serialize)]
12#[serde(tag = "type", rename_all = "snake_case")]
13pub enum MoveSelectorConfig {
14 ChangeMoveSelector(ChangeMoveConfig),
16
17 SwapMoveSelector(SwapMoveConfig),
19
20 ListChangeMoveSelector(ListChangeMoveConfig),
22
23 NearbyListChangeMoveSelector(NearbyListChangeMoveConfig),
25
26 ListSwapMoveSelector(ListSwapMoveConfig),
28
29 NearbyListSwapMoveSelector(NearbyListSwapMoveConfig),
31
32 SubListChangeMoveSelector(SubListChangeMoveConfig),
34
35 SubListSwapMoveSelector(SubListSwapMoveConfig),
37
38 ListReverseMoveSelector(ListReverseMoveConfig),
40
41 KOptMoveSelector(KOptMoveSelectorConfig),
43
44 ListRuinMoveSelector(ListRuinMoveSelectorConfig),
46
47 UnionMoveSelector(UnionMoveSelectorConfig),
49
50 CartesianProductMoveSelector(CartesianProductConfig),
52}
53
54#[derive(Debug, Clone, Default, Deserialize, Serialize)]
56#[serde(rename_all = "snake_case")]
57pub struct ChangeMoveConfig {
58 #[serde(flatten)]
59 pub target: VariableTargetConfig,
60}
61
62#[derive(Debug, Clone, Default, Deserialize, Serialize)]
64#[serde(rename_all = "snake_case")]
65pub struct SwapMoveConfig {
66 #[serde(flatten)]
67 pub target: VariableTargetConfig,
68}
69
70#[derive(Debug, Clone, Default, Deserialize, Serialize)]
72#[serde(rename_all = "snake_case")]
73pub struct ListChangeMoveConfig {
74 #[serde(flatten)]
75 pub target: VariableTargetConfig,
76}
77
78#[derive(Debug, Clone, Deserialize, Serialize)]
80#[serde(rename_all = "snake_case")]
81pub struct NearbyListChangeMoveConfig {
82 pub max_nearby: usize,
84 #[serde(flatten)]
85 pub target: VariableTargetConfig,
86}
87
88impl Default for NearbyListChangeMoveConfig {
89 fn default() -> Self {
90 Self {
91 max_nearby: 10,
92 target: VariableTargetConfig::default(),
93 }
94 }
95}
96
97#[derive(Debug, Clone, Default, Deserialize, Serialize)]
99#[serde(rename_all = "snake_case")]
100pub struct ListSwapMoveConfig {
101 #[serde(flatten)]
102 pub target: VariableTargetConfig,
103}
104
105#[derive(Debug, Clone, Deserialize, Serialize)]
107#[serde(rename_all = "snake_case")]
108pub struct NearbyListSwapMoveConfig {
109 pub max_nearby: usize,
111 #[serde(flatten)]
112 pub target: VariableTargetConfig,
113}
114
115impl Default for NearbyListSwapMoveConfig {
116 fn default() -> Self {
117 Self {
118 max_nearby: 10,
119 target: VariableTargetConfig::default(),
120 }
121 }
122}
123
124#[derive(Debug, Clone, Deserialize, Serialize)]
126#[serde(rename_all = "snake_case")]
127pub struct SubListChangeMoveConfig {
128 pub min_sublist_size: usize,
130 pub max_sublist_size: usize,
132 #[serde(flatten)]
133 pub target: VariableTargetConfig,
134}
135
136impl Default for SubListChangeMoveConfig {
137 fn default() -> Self {
138 Self {
139 min_sublist_size: 1,
140 max_sublist_size: 3,
141 target: VariableTargetConfig::default(),
142 }
143 }
144}
145
146#[derive(Debug, Clone, Deserialize, Serialize)]
148#[serde(rename_all = "snake_case")]
149pub struct SubListSwapMoveConfig {
150 pub min_sublist_size: usize,
152 pub max_sublist_size: usize,
154 #[serde(flatten)]
155 pub target: VariableTargetConfig,
156}
157
158impl Default for SubListSwapMoveConfig {
159 fn default() -> Self {
160 Self {
161 min_sublist_size: 1,
162 max_sublist_size: 3,
163 target: VariableTargetConfig::default(),
164 }
165 }
166}
167
168#[derive(Debug, Clone, Default, Deserialize, Serialize)]
170#[serde(rename_all = "snake_case")]
171pub struct ListReverseMoveConfig {
172 #[serde(flatten)]
173 pub target: VariableTargetConfig,
174}
175
176#[derive(Debug, Clone, Deserialize, Serialize)]
178#[serde(rename_all = "snake_case")]
179pub struct KOptMoveSelectorConfig {
180 pub k: usize,
182 pub min_segment_len: usize,
184 pub max_nearby: usize,
187 #[serde(flatten)]
188 pub target: VariableTargetConfig,
189}
190
191impl Default for KOptMoveSelectorConfig {
192 fn default() -> Self {
193 Self {
194 k: 3,
195 min_segment_len: 1,
196 max_nearby: 0,
197 target: VariableTargetConfig::default(),
198 }
199 }
200}
201
202#[derive(Debug, Clone, Deserialize, Serialize)]
204#[serde(rename_all = "snake_case")]
205pub struct ListRuinMoveSelectorConfig {
206 pub min_ruin_count: usize,
208 pub max_ruin_count: usize,
210 pub moves_per_step: Option<usize>,
212 #[serde(flatten)]
213 pub target: VariableTargetConfig,
214}
215
216impl Default for ListRuinMoveSelectorConfig {
217 fn default() -> Self {
218 Self {
219 min_ruin_count: 2,
220 max_ruin_count: 5,
221 moves_per_step: None,
222 target: VariableTargetConfig::default(),
223 }
224 }
225}
226
227#[derive(Debug, Clone, Default, Deserialize, Serialize)]
229#[serde(rename_all = "snake_case")]
230pub struct UnionMoveSelectorConfig {
231 pub selectors: Vec<MoveSelectorConfig>,
233}
234
235#[derive(Debug, Clone, Default, Deserialize, Serialize)]
237#[serde(rename_all = "snake_case")]
238pub struct CartesianProductConfig {
239 pub selectors: Vec<MoveSelectorConfig>,
241}