1use serde::{Deserialize, Serialize};
2
3use crate::acceptor::AcceptorConfig;
4use crate::forager::ForagerConfig;
5use crate::move_selector::{MoveSelectorConfig, VariableTargetConfig};
6use crate::termination::TerminationConfig;
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
10#[serde(tag = "type", rename_all = "snake_case")]
11pub enum PhaseConfig {
12 ConstructionHeuristic(ConstructionHeuristicConfig),
14
15 LocalSearch(LocalSearchConfig),
17
18 Vnd(VndConfig),
20
21 ExhaustiveSearch(ExhaustiveSearchConfig),
23
24 PartitionedSearch(PartitionedSearchConfig),
26
27 Custom(CustomPhaseConfig),
29}
30
31fn default_k() -> usize {
32 2
33}
34
35#[derive(Debug, Clone, Deserialize, Serialize)]
37#[serde(rename_all = "snake_case")]
38pub struct ConstructionHeuristicConfig {
39 #[serde(default)]
41 pub construction_heuristic_type: ConstructionHeuristicType,
42
43 #[serde(default)]
46 pub construction_obligation: ConstructionObligation,
47
48 #[serde(flatten)]
50 pub target: VariableTargetConfig,
51
52 #[serde(default = "default_k")]
54 pub k: usize,
55
56 pub value_candidate_limit: Option<usize>,
58
59 pub group_name: Option<String>,
61
62 pub group_candidate_limit: Option<usize>,
64
65 pub termination: Option<TerminationConfig>,
67}
68
69impl Default for ConstructionHeuristicConfig {
70 fn default() -> Self {
71 Self {
72 construction_heuristic_type: ConstructionHeuristicType::default(),
73 construction_obligation: ConstructionObligation::default(),
74 target: VariableTargetConfig::default(),
75 k: default_k(),
76 value_candidate_limit: None,
77 group_name: None,
78 group_candidate_limit: None,
79 termination: None,
80 }
81 }
82}
83
84#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
86#[serde(rename_all = "snake_case")]
87pub enum ConstructionObligation {
88 #[default]
90 PreserveUnassigned,
91
92 AssignWhenCandidateExists,
95}
96
97#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
99#[serde(rename_all = "snake_case")]
100pub enum ConstructionHeuristicType {
101 #[default]
103 FirstFit,
104
105 FirstFitDecreasing,
107
108 WeakestFit,
110
111 WeakestFitDecreasing,
113
114 StrongestFit,
116
117 StrongestFitDecreasing,
119
120 CheapestInsertion,
122
123 CoverageFirstFit,
125
126 AllocateEntityFromQueue,
128
129 AllocateToValueFromQueue,
131
132 ListRoundRobin,
135
136 ListCheapestInsertion,
139
140 ListRegretInsertion,
143
144 ListClarkeWright,
147
148 ListKOpt,
151}
152
153#[derive(Debug, Clone, Default, Deserialize, Serialize)]
155#[serde(rename_all = "snake_case")]
156pub struct LocalSearchConfig {
157 pub acceptor: Option<AcceptorConfig>,
159
160 pub forager: Option<ForagerConfig>,
162
163 pub move_selector: Option<MoveSelectorConfig>,
165
166 pub termination: Option<TerminationConfig>,
168}
169
170#[derive(Debug, Clone, Default, Deserialize, Serialize)]
172#[serde(rename_all = "snake_case")]
173pub struct VndConfig {
174 #[serde(default)]
176 pub neighborhoods: Vec<MoveSelectorConfig>,
177
178 pub termination: Option<TerminationConfig>,
180}
181
182#[derive(Debug, Clone, Default, Deserialize, Serialize)]
184#[serde(rename_all = "snake_case")]
185pub struct ExhaustiveSearchConfig {
186 #[serde(default)]
188 pub exhaustive_search_type: ExhaustiveSearchType,
189
190 pub termination: Option<TerminationConfig>,
192}
193
194#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
196#[serde(rename_all = "snake_case")]
197pub enum ExhaustiveSearchType {
198 #[default]
200 BranchAndBound,
201
202 BruteForce,
204}
205
206#[derive(Debug, Clone, Default, Deserialize, Serialize)]
208#[serde(rename_all = "snake_case")]
209pub struct PartitionedSearchConfig {
210 pub partition_count: Option<usize>,
212
213 pub termination: Option<TerminationConfig>,
215}
216
217#[derive(Debug, Clone, Default, Deserialize, Serialize)]
219#[serde(rename_all = "snake_case")]
220pub struct CustomPhaseConfig {
221 pub custom_phase_class: Option<String>,
223}