#[derive(Debug, Clone, Copy)]
pub struct Sphere {
pub dim: usize,
}
impl Sphere {
#[must_use]
pub const fn new(dim: usize) -> Self {
Self { dim }
}
#[must_use]
pub fn evaluate(&self, x: &[f64]) -> f64 {
assert_eq!(x.len(), self.dim, "input dimension mismatch");
x.iter().map(|xi| xi * xi).sum()
}
#[must_use]
pub const fn bounds(&self) -> (f64, f64) {
(-5.12, 5.12)
}
}
#[cfg(test)]
mod tests {
use super::*;
use approx::assert_relative_eq;
#[test]
fn global_minimum_at_origin() {
let s = Sphere::new(4);
assert_relative_eq!(s.evaluate(&[0.0; 4]), 0.0, epsilon = 1e-12);
}
#[test]
fn positive_elsewhere() {
let s = Sphere::new(3);
assert_relative_eq!(s.evaluate(&[1.0, 2.0, 3.0]), 14.0, epsilon = 1e-12);
}
}