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::ScoreDirector;
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<
36    S: PlanningSolution,
37    D: ScoreDirector<S>,
38    BestCb: BestSolutionCallback<S> = (),
39>: Send + Debug
40{
41    /// Returns true if solving should terminate.
42    fn is_terminated(&self, solver_scope: &SolverScope<S, D, BestCb>) -> bool;
43
44    /// Installs this termination's limit as an in-phase limit on the solver scope.
45    ///
46    /// This allows the termination to fire inside the phase step loop (T1 fix).
47    /// The default implementation is a no-op.
48    fn install_inphase_limits(&self, _solver_scope: &mut SolverScope<S, D, BestCb>) {}
49}
50
51#[cfg(test)]
52mod tests;