mgh 0.1.16

A Collection of Moré-Garbow-Hilstrom https://dl.acm.org/doi/pdf/10.1145/355934.355936
Documentation
pub fn variably_dimensioned(x: &[f64]) -> f64 {
    let mut res = 0.0;
    for item in x {
        // f_i(x) = x_i - 1
        res += (item - 1.).powi(2);
    }

    // sum j(x_j - 1)
    let sum_j = {
        let mut f = 0.0;
        for (i, &xi) in x.iter().enumerate() {
            let j = i as f64 + 1.0;
            f += j * (xi - 1.);
        }
        f
    };

    // F(x) = sum_i f_i(x)^2 + (sum_j f_j(x))^2 + (sum_j f_j(x))^4
    res + sum_j.powi(2) + sum_j.powi(4)
}

pub fn init(n: usize) -> Vec<f64> {
    let mut vec = vec![0.; n];
    for (i, item) in vec.iter_mut().enumerate().take(n) {
        *item = 1. - (i as f64 + 1.) / (n as f64);
    }
    vec
}

pub fn min(n: usize) -> Vec<f64> {
    vec![1.; n]
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_variably_dimensioned() {
        let n = 10;
        let x = init(n);
        let val = variably_dimensioned(&x);
        assert!(val.is_finite());
    }

    #[test]
    fn test_min() {
        let n = 3;
        let x = min(n);
        let val = variably_dimensioned(&x);
        assert_eq!(val, 0.);
    }
}