use std::time::Duration;
use crate::ga::TerminationCause;
use crate::stats::GenerationStats;
use crate::traits::ChromosomeT;
#[derive(Debug, Clone, Copy)]
pub struct ExtensionEvent {
pub generation: usize,
pub diversity: f64,
pub extension_type: &'static str,
pub threshold: f64,
}
pub trait GaObserver<U: ChromosomeT>: Send + Sync {
fn on_run_start(&self) {}
fn on_generation_start(&self, _generation: usize) {}
fn on_selection_complete(&self, _generation: usize, _duration: Duration, _population_size: usize) {}
fn on_crossover_complete(&self, _generation: usize, _duration: Duration, _offspring_count: usize) {}
fn on_mutation_complete(&self, _generation: usize, _duration: Duration, _population_size: usize) {}
fn on_fitness_evaluation_complete(&self, _generation: usize, _duration: Duration, _population_size: usize) {}
fn on_survivor_selection_complete(&self, _generation: usize, _duration: Duration, _population_size: usize) {}
fn on_new_best(&self, _generation: usize, _best: U) {}
fn on_stagnation(&self, _generation: usize, _stagnation_count: usize) {}
fn on_extension_triggered(&self, _event: ExtensionEvent) {}
fn on_generation_end(&self, _stats: &GenerationStats) {}
fn on_run_end(&self, _cause: TerminationCause, _all_stats: &[GenerationStats]) {}
}
pub struct NoopObserver;
impl<U: ChromosomeT> GaObserver<U> for NoopObserver {}
pub trait IslandGaObserver<U: ChromosomeT>: Send + Sync {
fn on_island_run_start(&self, _island_id: usize) {}
fn on_island_run_end(&self, _island_id: usize) {}
fn on_island_generation_end(&self, _island_id: usize, _generation: usize, _stats: &GenerationStats) {}
fn on_migration_triggered(&self, _generation: usize, _migration_count: usize) {}
}
pub trait Nsga2Observer<U: ChromosomeT>: Send + Sync {
fn on_pareto_front_assigned(&self, _generation: usize, _front_count: usize, _population_size: usize) {}
fn on_non_dominated_sort_complete(&self, _generation: usize, _duration_ms: f64) {}
fn on_crowding_distance_calculated(&self, _generation: usize, _duration_ms: f64) {}
}
pub trait AllObserver<U: ChromosomeT>:
GaObserver<U> + IslandGaObserver<U> + Nsga2Observer<U> + Send + Sync
{}
impl<U, T> AllObserver<U> for T
where
U: ChromosomeT,
T: GaObserver<U> + IslandGaObserver<U> + Nsga2Observer<U> + Send + Sync,
{}
mod log;
pub use log::LogObserver;
#[cfg(feature = "observer-tracing")]
mod tracing_observer;
#[cfg(feature = "observer-tracing")]
pub use tracing_observer::TracingObserver;
#[cfg(feature = "observer-metrics")]
mod metrics_observer;
#[cfg(feature = "observer-metrics")]
pub use metrics_observer::MetricsObserver;
mod composite;
pub use composite::CompositeObserver;