use std::time::{Duration, Instant};
use crate::core::problem::Problem;
use crate::core::result::OptimizationResult;
use crate::observer::{Observer, Snapshot};
pub trait Optimizer<P>
where
P: Problem,
{
fn run(&mut self, problem: &P) -> OptimizationResult<P::Decision>;
fn run_with<O>(&mut self, problem: &P, observer: &mut O) -> OptimizationResult<P::Decision>
where
O: Observer<P::Decision>,
{
let started = Instant::now();
let result = self.run(problem);
let elapsed = started.elapsed();
notify_final(&result, elapsed, problem, observer);
result
}
}
fn notify_final<P, O>(
result: &OptimizationResult<P::Decision>,
elapsed: Duration,
problem: &P,
observer: &mut O,
) where
P: Problem,
O: Observer<P::Decision>,
{
let objectives = problem.objectives();
let snap = Snapshot {
iteration: result.generations,
evaluations: result.evaluations,
elapsed,
population: result.population.as_slice(),
pareto_front: Some(result.pareto_front.as_slice()),
best: result.best.as_ref(),
objectives: &objectives,
};
let _ = observer.observe(&snap);
}