use solverforge_core::domain::PlanningSolution;
use solverforge_scoring::Director;
use super::solver::ProgressCallback;
use super::PhaseScope;
pub struct StepScope<'t, 'a, 'b, S: PlanningSolution, D: Director<S>, BestCb = ()> {
phase_scope: &'a mut PhaseScope<'t, 'b, S, D, BestCb>,
step_index: u64,
step_score: Option<S::Score>,
}
impl<'t, 'a, 'b, S: PlanningSolution, D: Director<S>, BestCb: ProgressCallback<S>>
StepScope<'t, 'a, 'b, S, D, BestCb>
{
pub fn new(phase_scope: &'a mut PhaseScope<'t, 'b, S, D, BestCb>) -> Self {
let step_index = phase_scope.step_count();
Self {
phase_scope,
step_index,
step_score: None,
}
}
pub fn step_index(&self) -> u64 {
self.step_index
}
pub fn step_score(&self) -> Option<&S::Score> {
self.step_score.as_ref()
}
pub fn set_step_score(&mut self, score: S::Score)
where
S::Score: Copy,
{
self.phase_scope.solver_scope_mut().set_current_score(score);
self.step_score = Some(score);
}
pub fn complete(&mut self) {
self.phase_scope.increment_step_count();
}
pub fn phase_scope(&self) -> &PhaseScope<'t, 'b, S, D, BestCb> {
self.phase_scope
}
pub fn phase_scope_mut(&mut self) -> &mut PhaseScope<'t, 'b, S, D, BestCb> {
self.phase_scope
}
pub fn score_director(&self) -> &D {
self.phase_scope.score_director()
}
pub fn score_director_mut(&mut self) -> &mut D {
self.phase_scope.score_director_mut()
}
pub fn calculate_score(&mut self) -> S::Score {
self.phase_scope.calculate_score()
}
}