use std::time::{Duration, Instant};
use crate::ga::TerminationCause;
use crate::stats::GenerationStats;
use crate::traits::ChromosomeT;
#[allow(deprecated)]
use super::Reporter;
pub struct DurationReporter {
start: Option<Instant>,
}
impl DurationReporter {
pub fn new() -> Self {
Self { start: None }
}
}
impl Default for DurationReporter {
fn default() -> Self {
Self::new()
}
}
#[allow(deprecated)]
impl<U: ChromosomeT> Reporter<U> for DurationReporter {
fn on_start(&mut self) {
self.start = Some(Instant::now());
}
fn on_finish(&mut self, cause: TerminationCause, all_stats: &[GenerationStats]) {
let elapsed = self
.start
.map(|s| s.elapsed())
.unwrap_or(Duration::ZERO);
let gens = all_stats.len();
println!("Run complete ({:?}) in {:.2?} over {} generations", cause, elapsed, gens);
if gens > 0 {
let avg = elapsed / gens as u32;
println!(" Avg per generation: {:.2?}", avg);
}
if self.start.is_none() {
log::warn!("DurationReporter: on_start was not called before on_finish");
}
}
}