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
82/// Local search configuration.
83#[derive(Debug, Clone, Default, Deserialize, Serialize)]
84#[serde(rename_all = "snake_case")]
85pub struct LocalSearchConfig {
86    /// Acceptor configuration.
87    pub acceptor: Option<AcceptorConfig>,
88
89    /// Forager configuration.
90    pub forager: Option<ForagerConfig>,
91
92    /// Move selector configuration.
93    pub move_selector: Option<MoveSelectorConfig>,
94
95    /// Phase termination configuration.
96    pub termination: Option<TerminationConfig>,
97}
98
99/// Exhaustive search configuration.
100#[derive(Debug, Clone, Default, Deserialize, Serialize)]
101#[serde(rename_all = "snake_case")]
102pub struct ExhaustiveSearchConfig {
103    /// Exhaustive search type.
104    #[serde(default)]
105    pub exhaustive_search_type: ExhaustiveSearchType,
106
107    /// Phase termination configuration.
108    pub termination: Option<TerminationConfig>,
109}
110
111/// Exhaustive search types.
112#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
113#[serde(rename_all = "snake_case")]
114pub enum ExhaustiveSearchType {
115    /// Branch and bound.
116    #[default]
117    BranchAndBound,
118
119    /// Brute force.
120    BruteForce,
121}
122
123/// Partitioned search configuration.
124#[derive(Debug, Clone, Default, Deserialize, Serialize)]
125#[serde(rename_all = "snake_case")]
126pub struct PartitionedSearchConfig {
127    /// Number of partitions.
128    pub partition_count: Option<usize>,
129
130    /// Phase termination configuration.
131    pub termination: Option<TerminationConfig>,
132}
133
134/// Custom phase configuration.
135#[derive(Debug, Clone, Default, Deserialize, Serialize)]
136#[serde(rename_all = "snake_case")]
137pub struct CustomPhaseConfig {
138    /// Custom phase class name.
139    pub custom_phase_class: Option<String>,
140}