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 AllocateEntityFromQueue,
125
126 AllocateToValueFromQueue,
128
129 ListRoundRobin,
132
133 ListCheapestInsertion,
136
137 ListRegretInsertion,
140
141 ListClarkeWright,
144
145 ListKOpt,
148}
149
150#[derive(Debug, Clone, Default, Deserialize, Serialize)]
152#[serde(rename_all = "snake_case")]
153pub struct LocalSearchConfig {
154 pub acceptor: Option<AcceptorConfig>,
156
157 pub forager: Option<ForagerConfig>,
159
160 pub move_selector: Option<MoveSelectorConfig>,
162
163 pub termination: Option<TerminationConfig>,
165}
166
167#[derive(Debug, Clone, Default, Deserialize, Serialize)]
169#[serde(rename_all = "snake_case")]
170pub struct VndConfig {
171 #[serde(default)]
173 pub neighborhoods: Vec<MoveSelectorConfig>,
174
175 pub termination: Option<TerminationConfig>,
177}
178
179#[derive(Debug, Clone, Default, Deserialize, Serialize)]
181#[serde(rename_all = "snake_case")]
182pub struct ExhaustiveSearchConfig {
183 #[serde(default)]
185 pub exhaustive_search_type: ExhaustiveSearchType,
186
187 pub termination: Option<TerminationConfig>,
189}
190
191#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
193#[serde(rename_all = "snake_case")]
194pub enum ExhaustiveSearchType {
195 #[default]
197 BranchAndBound,
198
199 BruteForce,
201}
202
203#[derive(Debug, Clone, Default, Deserialize, Serialize)]
205#[serde(rename_all = "snake_case")]
206pub struct PartitionedSearchConfig {
207 pub partition_count: Option<usize>,
209
210 pub termination: Option<TerminationConfig>,
212}
213
214#[derive(Debug, Clone, Default, Deserialize, Serialize)]
216#[serde(rename_all = "snake_case")]
217pub struct CustomPhaseConfig {
218 pub custom_phase_class: Option<String>,
220}