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 SelectedCountLimitMoveSelector(SelectedCountLimitMoveSelectorConfig),
49
50 UnionMoveSelector(UnionMoveSelectorConfig),
52
53 CartesianProductMoveSelector(CartesianProductConfig),
55}
56
57#[derive(Debug, Clone, Default, Deserialize, Serialize)]
59#[serde(rename_all = "snake_case")]
60pub struct ChangeMoveConfig {
61 #[serde(flatten)]
62 pub target: VariableTargetConfig,
63}
64
65#[derive(Debug, Clone, Default, Deserialize, Serialize)]
67#[serde(rename_all = "snake_case")]
68pub struct SwapMoveConfig {
69 #[serde(flatten)]
70 pub target: VariableTargetConfig,
71}
72
73#[derive(Debug, Clone, Default, Deserialize, Serialize)]
75#[serde(rename_all = "snake_case")]
76pub struct ListChangeMoveConfig {
77 #[serde(flatten)]
78 pub target: VariableTargetConfig,
79}
80
81#[derive(Debug, Clone, Deserialize, Serialize)]
83#[serde(rename_all = "snake_case")]
84pub struct NearbyListChangeMoveConfig {
85 pub max_nearby: usize,
87 #[serde(flatten)]
88 pub target: VariableTargetConfig,
89}
90
91impl Default for NearbyListChangeMoveConfig {
92 fn default() -> Self {
93 Self {
94 max_nearby: 10,
95 target: VariableTargetConfig::default(),
96 }
97 }
98}
99
100#[derive(Debug, Clone, Default, Deserialize, Serialize)]
102#[serde(rename_all = "snake_case")]
103pub struct ListSwapMoveConfig {
104 #[serde(flatten)]
105 pub target: VariableTargetConfig,
106}
107
108#[derive(Debug, Clone, Deserialize, Serialize)]
110#[serde(rename_all = "snake_case")]
111pub struct NearbyListSwapMoveConfig {
112 pub max_nearby: usize,
114 #[serde(flatten)]
115 pub target: VariableTargetConfig,
116}
117
118impl Default for NearbyListSwapMoveConfig {
119 fn default() -> Self {
120 Self {
121 max_nearby: 10,
122 target: VariableTargetConfig::default(),
123 }
124 }
125}
126
127#[derive(Debug, Clone, Deserialize, Serialize)]
129#[serde(rename_all = "snake_case")]
130pub struct SubListChangeMoveConfig {
131 pub min_sublist_size: usize,
133 pub max_sublist_size: usize,
135 #[serde(flatten)]
136 pub target: VariableTargetConfig,
137}
138
139impl Default for SubListChangeMoveConfig {
140 fn default() -> Self {
141 Self {
142 min_sublist_size: 1,
143 max_sublist_size: 3,
144 target: VariableTargetConfig::default(),
145 }
146 }
147}
148
149#[derive(Debug, Clone, Deserialize, Serialize)]
151#[serde(rename_all = "snake_case")]
152pub struct SubListSwapMoveConfig {
153 pub min_sublist_size: usize,
155 pub max_sublist_size: usize,
157 #[serde(flatten)]
158 pub target: VariableTargetConfig,
159}
160
161impl Default for SubListSwapMoveConfig {
162 fn default() -> Self {
163 Self {
164 min_sublist_size: 1,
165 max_sublist_size: 3,
166 target: VariableTargetConfig::default(),
167 }
168 }
169}
170
171#[derive(Debug, Clone, Default, Deserialize, Serialize)]
173#[serde(rename_all = "snake_case")]
174pub struct ListReverseMoveConfig {
175 #[serde(flatten)]
176 pub target: VariableTargetConfig,
177}
178
179#[derive(Debug, Clone, Deserialize, Serialize)]
181#[serde(rename_all = "snake_case")]
182pub struct KOptMoveSelectorConfig {
183 pub k: usize,
185 pub min_segment_len: usize,
187 pub max_nearby: usize,
190 #[serde(flatten)]
191 pub target: VariableTargetConfig,
192}
193
194impl Default for KOptMoveSelectorConfig {
195 fn default() -> Self {
196 Self {
197 k: 3,
198 min_segment_len: 1,
199 max_nearby: 0,
200 target: VariableTargetConfig::default(),
201 }
202 }
203}
204
205#[derive(Debug, Clone, Deserialize, Serialize)]
207#[serde(rename_all = "snake_case")]
208pub struct ListRuinMoveSelectorConfig {
209 pub min_ruin_count: usize,
211 pub max_ruin_count: usize,
213 pub moves_per_step: Option<usize>,
215 #[serde(flatten)]
216 pub target: VariableTargetConfig,
217}
218
219impl Default for ListRuinMoveSelectorConfig {
220 fn default() -> Self {
221 Self {
222 min_ruin_count: 2,
223 max_ruin_count: 5,
224 moves_per_step: None,
225 target: VariableTargetConfig::default(),
226 }
227 }
228}
229
230#[derive(Debug, Clone, Deserialize, Serialize)]
232#[serde(rename_all = "snake_case")]
233pub struct SelectedCountLimitMoveSelectorConfig {
234 pub selected_count_limit: usize,
236 pub selector: Box<MoveSelectorConfig>,
238}
239
240#[derive(Debug, Clone, Default, Deserialize, Serialize)]
242#[serde(rename_all = "snake_case")]
243pub struct UnionMoveSelectorConfig {
244 pub selectors: Vec<MoveSelectorConfig>,
246}
247
248#[derive(Debug, Clone, Default, Deserialize, Serialize)]
250#[serde(rename_all = "snake_case")]
251pub struct CartesianProductConfig {
252 pub selectors: Vec<MoveSelectorConfig>,
254}