Skip to main content

solverforge_config/
phase.rs

1use serde::{Deserialize, Serialize};
2
3use crate::acceptor::AcceptorConfig;
4use crate::forager::ForagerConfig;
5use crate::move_selector::MoveSelectorConfig;
6use crate::termination::TerminationConfig;
7
8/// Phase configuration.
9#[derive(Debug, Clone, Deserialize, Serialize)]
10#[serde(tag = "type", rename_all = "snake_case")]
11pub enum PhaseConfig {
12    /// Construction heuristic phase.
13    ConstructionHeuristic(ConstructionHeuristicConfig),
14
15    /// Local search phase.
16    LocalSearch(LocalSearchConfig),
17
18    /// Exhaustive search phase.
19    ExhaustiveSearch(ExhaustiveSearchConfig),
20
21    /// Partitioned search phase.
22    PartitionedSearch(PartitionedSearchConfig),
23
24    /// Custom phase.
25    Custom(CustomPhaseConfig),
26}
27
28/// Construction heuristic configuration.
29#[derive(Debug, Clone, Default, Deserialize, Serialize)]
30#[serde(rename_all = "snake_case")]
31pub struct ConstructionHeuristicConfig {
32    /// Type of construction heuristic.
33    #[serde(default)]
34    pub construction_heuristic_type: ConstructionHeuristicType,
35
36    /// Phase termination configuration.
37    pub termination: Option<TerminationConfig>,
38}
39
40/// Construction heuristic types.
41#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
42#[serde(rename_all = "snake_case")]
43pub enum ConstructionHeuristicType {
44    /// First fit heuristic (basic variables).
45    #[default]
46    FirstFit,
47
48    /// First fit decreasing (by entity difficulty).
49    FirstFitDecreasing,
50
51    /// Weakest fit heuristic.
52    WeakestFit,
53
54    /// Weakest fit decreasing.
55    WeakestFitDecreasing,
56
57    /// Strongest fit heuristic.
58    StrongestFit,
59
60    /// Strongest fit decreasing.
61    StrongestFitDecreasing,
62
63    /// Cheapest insertion (greedy, basic variables).
64    CheapestInsertion,
65
66    /// Allocate entity from queue.
67    AllocateEntityFromQueue,
68
69    /// Allocate to value from queue.
70    AllocateToValueFromQueue,
71
72    /// List round-robin construction: distributes elements evenly across entities.
73    ListRoundRobin,
74
75    /// List cheapest insertion: inserts each element at the score-minimizing position.
76    ListCheapestInsertion,
77
78    /// List regret insertion: inserts elements in order of highest placement regret.
79    ListRegretInsertion,
80
81    /// List Clarke-Wright savings: greedy route merging by savings value.
82    ListClarkeWright,
83}
84
85/// Local search configuration.
86#[derive(Debug, Clone, Default, Deserialize, Serialize)]
87#[serde(rename_all = "snake_case")]
88pub struct LocalSearchConfig {
89    /// Acceptor configuration.
90    pub acceptor: Option<AcceptorConfig>,
91
92    /// Forager configuration.
93    pub forager: Option<ForagerConfig>,
94
95    /// Move selector configuration.
96    pub move_selector: Option<MoveSelectorConfig>,
97
98    /// Phase termination configuration.
99    pub termination: Option<TerminationConfig>,
100}
101
102/// Exhaustive search configuration.
103#[derive(Debug, Clone, Default, Deserialize, Serialize)]
104#[serde(rename_all = "snake_case")]
105pub struct ExhaustiveSearchConfig {
106    /// Exhaustive search type.
107    #[serde(default)]
108    pub exhaustive_search_type: ExhaustiveSearchType,
109
110    /// Phase termination configuration.
111    pub termination: Option<TerminationConfig>,
112}
113
114/// Exhaustive search types.
115#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
116#[serde(rename_all = "snake_case")]
117pub enum ExhaustiveSearchType {
118    /// Branch and bound.
119    #[default]
120    BranchAndBound,
121
122    /// Brute force.
123    BruteForce,
124}
125
126/// Partitioned search configuration.
127#[derive(Debug, Clone, Default, Deserialize, Serialize)]
128#[serde(rename_all = "snake_case")]
129pub struct PartitionedSearchConfig {
130    /// Number of partitions.
131    pub partition_count: Option<usize>,
132
133    /// Phase termination configuration.
134    pub termination: Option<TerminationConfig>,
135}
136
137/// Custom phase configuration.
138#[derive(Debug, Clone, Default, Deserialize, Serialize)]
139#[serde(rename_all = "snake_case")]
140pub struct CustomPhaseConfig {
141    /// Custom phase class name.
142    pub custom_phase_class: Option<String>,
143}