use num::Float;
pub fn paraboloid<G: Float>(x: &Vec<G>) -> f64 {
let mut result = G::from(0.0).unwrap();
for (n, val) in x.iter().enumerate() {
result = result + (*val - (G::from(n).unwrap() + G::from(1.0).unwrap())).powi(2);
}
result.to_f64().unwrap()
}
pub fn schwefel<G: Float>(x: &Vec<G>) -> f64 {
let result = G::from(418.9829).unwrap() * G::from(x.len()).unwrap() - x.iter().fold(G::zero(), |acc, &xi| acc + xi * xi.abs().sqrt().sin());
result.to_f64().unwrap()
}
pub fn rastrigin<G: Float>(x: &Vec<G>) -> f64 {
let a = G::from(10.0_f64).unwrap();
let pi = G::from(3.14159265358979_f64).unwrap();
let result = a * G::from(x.len()).unwrap() +
x.iter().fold(G::zero(), |acc, &xi| acc + xi * xi - a * (G::from(2).unwrap() * pi * xi).cos());
result.to_f64().unwrap()
}
pub fn rosenbrock<G: Float>(x: &Vec<G>) -> f64 {
let mut sum = G::from(0.0).unwrap();
for n in 0..x.len() - 1 {
sum = sum + G::from(100.0).unwrap() * ((x[n + 1] - x[n] * x[n]).powi(2)) + (G::from(1.0).unwrap() - x[n]).powi(2);
}
sum.to_f64().unwrap()
}