use crate::core::candidate::Candidate;
use crate::core::population::Population;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct OptimizationResult<D> {
pub population: Population<D>,
pub pareto_front: Vec<Candidate<D>>,
pub best: Option<Candidate<D>>,
pub evaluations: usize,
pub generations: usize,
}
impl<D> OptimizationResult<D> {
pub fn new(
population: Population<D>,
pareto_front: Vec<Candidate<D>>,
best: Option<Candidate<D>>,
evaluations: usize,
generations: usize,
) -> Self {
Self {
population,
pareto_front,
best,
evaluations,
generations,
}
}
pub fn population(&self) -> &Population<D> {
&self.population
}
pub fn pareto_front(&self) -> &[Candidate<D>] {
&self.pareto_front
}
pub fn best(&self) -> Option<&Candidate<D>> {
self.best.as_ref()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::evaluation::Evaluation;
#[test]
fn accessors_return_expected_data() {
let cand = Candidate::new(1.0_f64, Evaluation::new(vec![1.0]));
let pop = Population::new(vec![cand.clone()]);
let r = OptimizationResult::new(pop, vec![cand.clone()], Some(cand.clone()), 5, 2);
assert_eq!(r.population().len(), 1);
assert_eq!(r.pareto_front().len(), 1);
assert!(r.best().is_some());
assert_eq!(r.evaluations, 5);
assert_eq!(r.generations, 2);
}
}