solverforge_config/
phase.rs1use serde::{Deserialize, Serialize};
2
3use crate::acceptor::AcceptorConfig;
4use crate::forager::ForagerConfig;
5use crate::move_selector::MoveSelectorConfig;
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 ExhaustiveSearch(ExhaustiveSearchConfig),
20
21 PartitionedSearch(PartitionedSearchConfig),
23
24 Custom(CustomPhaseConfig),
26}
27
28fn default_k() -> usize {
29 2
30}
31
32#[derive(Debug, Clone, Deserialize, Serialize)]
34#[serde(rename_all = "snake_case")]
35pub struct ConstructionHeuristicConfig {
36 #[serde(default)]
38 pub construction_heuristic_type: ConstructionHeuristicType,
39
40 #[serde(default = "default_k")]
42 pub k: usize,
43
44 pub termination: Option<TerminationConfig>,
46}
47
48impl Default for ConstructionHeuristicConfig {
49 fn default() -> Self {
50 Self {
51 construction_heuristic_type: ConstructionHeuristicType::default(),
52 k: default_k(),
53 termination: None,
54 }
55 }
56}
57
58#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
60#[serde(rename_all = "snake_case")]
61pub enum ConstructionHeuristicType {
62 #[default]
64 FirstFit,
65
66 FirstFitDecreasing,
68
69 WeakestFit,
71
72 WeakestFitDecreasing,
74
75 StrongestFit,
77
78 StrongestFitDecreasing,
80
81 CheapestInsertion,
83
84 AllocateEntityFromQueue,
86
87 AllocateToValueFromQueue,
89
90 ListRoundRobin,
92
93 ListCheapestInsertion,
95
96 ListRegretInsertion,
98
99 ListClarkeWright,
101
102 ListKOpt,
104}
105
106#[derive(Debug, Clone, Default, Deserialize, Serialize)]
108#[serde(rename_all = "snake_case")]
109pub struct LocalSearchConfig {
110 pub acceptor: Option<AcceptorConfig>,
112
113 pub forager: Option<ForagerConfig>,
115
116 pub move_selector: Option<MoveSelectorConfig>,
118
119 pub termination: Option<TerminationConfig>,
121}
122
123#[derive(Debug, Clone, Default, Deserialize, Serialize)]
125#[serde(rename_all = "snake_case")]
126pub struct ExhaustiveSearchConfig {
127 #[serde(default)]
129 pub exhaustive_search_type: ExhaustiveSearchType,
130
131 pub termination: Option<TerminationConfig>,
133}
134
135#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
137#[serde(rename_all = "snake_case")]
138pub enum ExhaustiveSearchType {
139 #[default]
141 BranchAndBound,
142
143 BruteForce,
145}
146
147#[derive(Debug, Clone, Default, Deserialize, Serialize)]
149#[serde(rename_all = "snake_case")]
150pub struct PartitionedSearchConfig {
151 pub partition_count: Option<usize>,
153
154 pub termination: Option<TerminationConfig>,
156}
157
158#[derive(Debug, Clone, Default, Deserialize, Serialize)]
160#[serde(rename_all = "snake_case")]
161pub struct CustomPhaseConfig {
162 pub custom_phase_class: Option<String>,
164}