Skip to main content

solverforge_solver/phase/
sequence.rs

1use std::fmt::{self, Debug};
2
3use solverforge_core::domain::PlanningSolution;
4use solverforge_scoring::Director;
5
6use crate::phase::Phase;
7use crate::scope::{ProgressCallback, SolverScope};
8
9pub struct PhaseSequence<P> {
10    phases: Vec<P>,
11}
12
13impl<P> PhaseSequence<P> {
14    pub fn new(phases: Vec<P>) -> Self {
15        Self { phases }
16    }
17
18    pub fn phases(&self) -> &[P] {
19        &self.phases
20    }
21}
22
23impl<P: Debug> Debug for PhaseSequence<P> {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        f.debug_struct("PhaseSequence")
26            .field("phases", &self.phases)
27            .finish()
28    }
29}
30
31impl<S, D, ProgressCb, P> Phase<S, D, ProgressCb> for PhaseSequence<P>
32where
33    S: PlanningSolution,
34    D: Director<S>,
35    ProgressCb: ProgressCallback<S>,
36    P: Phase<S, D, ProgressCb>,
37{
38    fn solve(&mut self, solver_scope: &mut SolverScope<'_, S, D, ProgressCb>) {
39        for phase in &mut self.phases {
40            phase.solve(solver_scope);
41        }
42    }
43
44    fn phase_type_name(&self) -> &'static str {
45        "PhaseSequence"
46    }
47}