use ndarray::{Array1, Array2, Axis};
pub fn get_ideal(population_fitness: &Array2<f64>) -> Array1<f64> {
population_fitness.fold_axis(Axis(0), f64::INFINITY, |a, &b| a.min(b))
}
pub fn get_nadir(population_fitness: &Array2<f64>) -> Array1<f64> {
population_fitness.fold_axis(Axis(0), f64::NEG_INFINITY, |a, &b| a.max(b))
}
pub fn normalize_fitness(population_fitness: &Array2<f64>) -> Array2<f64> {
let ideal = get_ideal(population_fitness);
let nadir = get_nadir(population_fitness);
let mut range = &nadir - &ideal;
let eps = 1e-12;
range.mapv_inplace(|r| if r.abs() < eps { 1.0 } else { r });
let (nrows, ncols) = population_fitness.dim();
let ideal_b = ideal
.broadcast((nrows, ncols))
.expect("broadcast de ideal falló");
let range_b = range
.broadcast((nrows, ncols))
.expect("broadcast de range falló");
let mut normalized = population_fitness - &ideal_b;
normalized /= &range_b;
normalized
}
#[cfg(test)]
mod tests {
use super::*;
use ndarray::array;
#[test]
fn test_get_ideal() {
let fitness = array![[1.0, 4.0], [2.0, 3.0], [0.5, 5.0]];
let ideal = get_ideal(&fitness);
assert_eq!(ideal, array![0.5, 3.0]);
}
#[test]
fn test_get_nadir() {
let fitness = array![[1.0, 4.0], [2.0, 3.0], [0.5, 5.0]];
let nadir = get_nadir(&fitness);
assert_eq!(nadir, array![2.0, 5.0]);
}
}