Skip to main content

math_audio_test_functions/functions/
levy.rs

1//! Levy test function
2
3use ndarray::Array1;
4
5/// Levy function - multimodal function (generalized version)
6/// Global minimum: f(x) = 0 at x = (1, 1, ..., 1)
7/// Bounds: x_i in [-10, 10]
8pub fn levy(x: &Array1<f64>) -> f64 {
9    use std::f64::consts::PI;
10
11    let w: Vec<f64> = x.iter().map(|&xi| 1.0 + (xi - 1.0) / 4.0).collect();
12
13    let first_term = (PI * w[0]).sin().powi(2);
14
15    let middle_sum: f64 = w
16        .iter()
17        .take(w.len() - 1)
18        .map(|&wi| (wi - 1.0).powi(2) * (1.0 + 10.0 * (PI * wi + 1.0).sin().powi(2)))
19        .sum();
20
21    let last_term = {
22        let wn = w[w.len() - 1];
23        (wn - 1.0).powi(2) * (1.0 + (2.0 * PI * wn).sin().powi(2))
24    };
25
26    first_term + middle_sum + last_term
27}