Skip to main content

solverforge_solver/termination/
mod.rs

1//! Termination conditions for solver phases.
2
3mod best_score;
4mod composite;
5mod diminished_returns;
6mod move_count;
7mod score_calculation_count;
8mod step_count;
9mod time;
10mod unimproved;
11
12use std::fmt::Debug;
13
14use solverforge_core::domain::PlanningSolution;
15use solverforge_scoring::Director;
16
17use crate::scope::BestSolutionCallback;
18use crate::scope::SolverScope;
19
20pub use best_score::{BestScoreFeasibleTermination, BestScoreTermination};
21pub use composite::{AndTermination, OrTermination};
22pub use diminished_returns::DiminishedReturnsTermination;
23pub use move_count::MoveCountTermination;
24pub use score_calculation_count::ScoreCalculationCountTermination;
25pub use step_count::StepCountTermination;
26pub use time::TimeTermination;
27pub use unimproved::{UnimprovedStepCountTermination, UnimprovedTimeTermination};
28
29/// Trait for determining when to stop solving.
30///
31/// # Type Parameters
32/// * `S` - The planning solution type
33/// * `D` - The score director type
34/// * `BestCb` - The best-solution callback type (default `()`)
35pub trait Termination<S: PlanningSolution, D: Director<S>, BestCb: BestSolutionCallback<S> = ()>:
36    Send + Debug
37{
38    /// Returns true if solving should terminate.
39    fn is_terminated(&self, solver_scope: &SolverScope<S, D, BestCb>) -> bool;
40
41    /// Installs this termination's limit as an in-phase limit on the solver scope.
42    ///
43    /// This allows the termination to fire inside the phase step loop (T1 fix).
44    /// The default implementation is a no-op.
45    fn install_inphase_limits(&self, _solver_scope: &mut SolverScope<S, D, BestCb>) {}
46}
47
48#[cfg(test)]
49mod tests;