use crate::core::stop_criterion::StopCriterion;
use super::{Comparison, Evaluation, Problem};
pub trait Solver<SC: StopCriterion<Self::P>, H: IterHook<Self::P>> {
type P: Problem;
fn iterate(&mut self, stop_criterion: &mut SC, hook: &mut H) -> Option<Evaluation<Self::P>>;
fn solve(&mut self, stop_criterion: &mut SC, hook: &mut H) -> Option<Evaluation<Self::P>> {
let mut best_evaluation = self.iterate(stop_criterion, hook)?;
hook.iterated(&best_evaluation);
stop_criterion.update(best_evaluation.value());
while !stop_criterion.should_stop() {
let candidate = {
match self.iterate(stop_criterion, hook) {
Some(s) => s,
None => break,
}
};
stop_criterion.update(candidate.value());
hook.iterated(&candidate);
if let Comparison::Better = candidate.compare(&best_evaluation) {
hook.better_changed(&best_evaluation, &candidate);
best_evaluation = candidate
}
}
Some(best_evaluation)
}
}
pub mod hook;
pub use hook::IterHook;