pub(crate) mod implementations;
pub(crate) mod traits;
use std::path::PathBuf;
use crate::algorithms::termination::{ExecutionStateSnapshot, TerminationReason};
pub use implementations::{
chart_observer::ChartObserver, console_observer::ConsoleObserver,
html_report_observer::HtmlReportObserver,
};
pub use traits::{AlgorithmObserver, Observable};
#[derive(Debug, Clone)]
pub struct ObserverState {
pub seq_id: u64,
pub iteration: usize,
pub evaluations: usize,
pub best_fitness: f64,
pub average_fitness: f64,
pub worst_fitness: f64,
pub best_solution_presentation: String,
}
impl ObserverState {
pub fn new(
seq_id: u64,
iteration: usize,
evaluations: usize,
best_fitness: f64,
average_fitness: f64,
worst_fitness: f64,
best_solution_presentation: String,
) -> Self {
Self {
seq_id,
iteration,
evaluations,
best_fitness,
average_fitness,
worst_fitness,
best_solution_presentation,
}
}
pub(crate) fn from_snapshot<T, Q>(
snapshot: ExecutionStateSnapshot<T, Q>,
best_solution_presentation: String,
seq_id: u64,
) -> Self
where
T: Clone,
Q: Clone,
{
Self::new(
seq_id,
snapshot.iteration,
snapshot.evaluations,
snapshot.best_fitness,
snapshot.average_fitness,
snapshot.worst_fitness,
best_solution_presentation,
)
}
}
pub(crate) fn default_observers_output_path() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("target")
.join("observers_outputs")
}
#[derive(Debug, Clone)]
pub enum AlgorithmEvent<T, Q = f64>
where
T: Clone,
Q: Clone,
{
Start {
algorithm_name: String,
},
ExecutionStateUpdated {
state: ObserverState,
},
End {
total_generations: usize,
total_evaluations: usize,
termination_reason: Option<TerminationReason>,
},
Failed {
total_generations: usize,
total_evaluations: usize,
termination_reason: Option<TerminationReason>,
error_message: String,
},
_Phantom(std::marker::PhantomData<(T, Q)>),
}