use std::convert::Infallible; #[cfg(test)] use crate::test_infra::load_test_file; use super::FitnessFunction; pub struct Rosenbrock; impl Rosenbrock { pub fn new() -> Self { Rosenbrock } } impl FitnessFunction for Rosenbrock { type In = Vec; type Out = f64; type Err = Infallible; fn fit(self: &Self, inp: &Vec) -> Result { Ok(inp.windows(2) .map(|xs| 100.0 * (xs[1] - xs[0].powi(2)).powi(2) + (1.0 - xs[0]).powi(2)) .sum()) } } #[test] fn test_rosenbrock() { let data = load_test_file::("tests/rosenbrock.txt"); for test in data { assert_eq!( Rosenbrock::new().fit(&test.inp).unwrap(), test.out ) } }