Skip to main content

solverforge_solver/scope/solver/
progress.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum SolverProgressKind {
3    Progress,
4    BestSolution,
5}
6
7#[derive(Debug, Clone)]
8pub struct SolverProgressRef<'a, S: PlanningSolution> {
9    pub kind: SolverProgressKind,
10    pub status: SolverLifecycleState,
11    pub solution: Option<&'a S>,
12    pub current_score: Option<&'a S::Score>,
13    pub best_score: Option<&'a S::Score>,
14    pub telemetry: crate::stats::SolverTelemetry,
15}
16
17pub trait ProgressCallback<S: PlanningSolution>: Send + Sync {
18    #[doc(hidden)]
19    const PUBLISHES_PROGRESS: bool = true;
20
21    fn invoke(&self, progress: SolverProgressRef<'_, S>);
22}
23
24impl<S: PlanningSolution> ProgressCallback<S> for () {
25    const PUBLISHES_PROGRESS: bool = false;
26
27    fn invoke(&self, _progress: SolverProgressRef<'_, S>) {}
28}
29
30impl<S, F> ProgressCallback<S> for F
31where
32    S: PlanningSolution,
33    F: for<'a> Fn(SolverProgressRef<'a, S>) + Send + Sync,
34{
35    fn invoke(&self, progress: SolverProgressRef<'_, S>) {
36        self(progress);
37    }
38}