use crate::strategy::PopulationY;
use anyhow::Result;
use ndarray::{Array2, Axis};
#[derive(Debug, Clone)]
pub struct Fitness {
pub values: Array2<f32>, }
pub trait FitnessEvaluator {
type IndividualsEvaluated;
fn evaluate(&self, pop: &PopulationY) -> Result<Self::IndividualsEvaluated>;
}
pub struct SquareAndSum;
impl FitnessEvaluator for SquareAndSum {
type IndividualsEvaluated = Fitness;
fn evaluate(&self, pop: &PopulationY) -> Result<Self::IndividualsEvaluated> {
let values = pop
.y
.map_axis(Axis(1), |row| row.map(|elem| elem.powi(2)).sum())
.into_shape((pop.y.nrows(), 1))
.unwrap()
;
Ok(Fitness { values })
}
}
pub struct SimpleStd;
impl FitnessEvaluator for SimpleStd {
type IndividualsEvaluated = Fitness;
fn evaluate(&self, pop: &PopulationY) -> Result<Self::IndividualsEvaluated> {
let values = pop
.y
.map_axis(Axis(1), |row| row.std(1.0))
.into_shape((pop.y.nrows(), 1))
.unwrap()
;
Ok(Fitness { values })
}
}
#[allow(dead_code)]
pub fn allow_objective_func<E: FitnessEvaluator>(evaluator: E) -> Result<E> {
Ok(evaluator)
}