use std::f64::consts::PI;
pub fn cross_in_tray(param: &[f64]) -> f64 {
assert!(param.len() == 2);
let (x1, x2) = (param[0], param[1]);
-0.0001
* ((x1.sin() * x2.sin() * (100.0 - (x1.powi(2) + x2.powi(2)).sqrt() / PI).abs().exp()).abs()
+ 1.0)
.powf(0.1)
}
mod tests {
#[test]
fn test_cross_in_tray_optimum() {
assert!(
(::cross_in_tray(&[1.34941_f64, 1.34941_f64]) + 2.062611870).abs()
< ::std::f32::EPSILON.into()
);
assert!(
(::cross_in_tray(&[1.34941_f64, -1.34941_f64]) + 2.062611870).abs()
< ::std::f32::EPSILON.into()
);
assert!(
(::cross_in_tray(&[-1.34941_f64, 1.34941_f64]) + 2.062611870).abs()
< ::std::f32::EPSILON.into()
);
assert!(
(::cross_in_tray(&[-1.34941_f64, -1.34941_f64]) + 2.062611870).abs()
< ::std::f32::EPSILON.into()
);
}
#[test]
#[should_panic]
fn test_cross_in_tray_param_length() {
::cross_in_tray(&[0.0, -1.0, 0.1]);
}
}