use std::convert::Infallible; use eoa_lib::{ constraints::ConstraintFunction, fitness::FitnessFunction, }; use nalgebra::SVector; /// Individual constraint fitness function - wraps a single constraint to act as a fitness function pub struct SingleConstraintFitness, Out = f64>> { constraint: TConstraint, capped: bool } impl, Out = f64>> SingleConstraintFitness { pub fn new(constraint: TConstraint, capped: bool) -> Self { Self { constraint, capped } } } impl, Out = f64>> FitnessFunction for SingleConstraintFitness { type In = SVector; type Out = f64; type Err = Infallible; fn fit(&self, inp: &Self::In) -> Result { Ok(if self.constraint.is_feasible(inp).unwrap() && self.capped { 0.0 } else { self.constraint.evaluate(inp).unwrap() }) } }