solverforge-solver 0.8.6

Solver engine for SolverForge
Documentation
// Step count termination.

use solverforge_core::domain::PlanningSolution;
use solverforge_scoring::Director;

use super::Termination;
use crate::scope::ProgressCallback;
use crate::scope::SolverScope;

/* Terminates after a step count.

# Example

```
use solverforge_solver::termination::StepCountTermination;

let term = StepCountTermination::new(1000);
```
*/
#[derive(Debug, Clone)]
pub struct StepCountTermination {
    limit: u64,
}

impl StepCountTermination {
    pub fn new(limit: u64) -> Self {
        Self { limit }
    }
}

impl<S: PlanningSolution, D: Director<S>, BestCb: ProgressCallback<S>> Termination<S, D, BestCb>
    for StepCountTermination
{
    fn is_terminated(&self, solver_scope: &SolverScope<S, D, BestCb>) -> bool {
        solver_scope.total_step_count() >= self.limit
    }

    fn install_inphase_limits(&self, solver_scope: &mut SolverScope<S, D, BestCb>) {
        // Take the minimum if multiple step limits are registered
        let limit = match solver_scope.inphase_step_count_limit {
            Some(existing) => existing.min(self.limit),
            None => self.limit,
        };
        solver_scope.inphase_step_count_limit = Some(limit);
    }
}