use crate::{NDimensional, UnConstrained, UnBounded, Bounded, SingleObjective, FixedDimensional, Constrained};
pub struct Sphere {}
impl NDimensional for Sphere {}
impl UnConstrained for Sphere {}
impl UnBounded for Sphere {}
impl SingleObjective for Sphere {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let mut f = 0f64;
for xi in x {
f -= xi.powi(2);
}
f
}
fn minimizer(n: usize) -> Vec<f64> {
vec![0.0; n]
}
}
#[cfg(test)]
mod sphere_tests {
use super::{Sphere as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Rastrigin {}
impl NDimensional for Rastrigin {}
impl UnConstrained for Rastrigin {}
impl Bounded for Rastrigin {
const BOUNDS: (f64, f64) = (-5.12, 5.12);
}
impl SingleObjective for Rastrigin {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let a = 10.0;
let n = x.len() ;
let mut fx = a*(n as f64);
for xi in x {
fx += xi.powi(2) - a*(2.0*xi*std::f64::consts::PI).cos();
}
fx
}
fn minimizer(n: usize) -> Vec<f64> {
vec![0.0; n]
}
}
#[cfg(test)]
mod rastrigin_tests {
use super::{Rastrigin as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Rosenbrock {}
impl NDimensional for Rosenbrock {}
impl UnConstrained for Rosenbrock {}
impl Bounded for Rosenbrock {
const BOUNDS: (f64, f64) = (-5.0, 10.0);
}
impl SingleObjective for Rosenbrock {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let n = x.len();
let mut fx = 0.0;
for i in 0..(n-1) {
fx += 100.0*(x[i+1] - x[i].powi(2)).powi(2) + (1.0 - x[i]).powi(2);
}
fx
}
fn minimizer(n: usize) -> Vec<f64> {
vec![1.0; n]
}
}
#[cfg(test)]
mod rosenbrock_tests {
use super::{Rosenbrock as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Ackley {}
impl NDimensional for Ackley {}
impl UnConstrained for Ackley {}
impl Bounded for Ackley {
const BOUNDS: (f64, f64) = (-5.0, 5.0);
}
impl SingleObjective for Ackley {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let n=x.len();
let mut fx = 0.0;
let mut square_sum = 0.0;
let mut cosine_sum = 0.0;
for xi in x {
square_sum += xi.powi(2);
cosine_sum += (2.0*std::f64::consts::PI*xi).cos();
}
fx += -20.0*(-0.2*(0.5*square_sum).sqrt()).exp();
fx -= (cosine_sum/(n as f64)).exp();
fx + std::f64::consts::E + 20.0
}
fn minimizer(n: usize) -> Vec<f64> {
vec![0.0; n]
}
}
#[cfg(test)]
mod ackley_tests {
use super::{Ackley as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Matyas {}
impl NDimensional for Matyas {}
impl UnConstrained for Matyas {}
impl Bounded for Matyas {
const BOUNDS: (f64, f64) = (-10.0, 10.0);
}
impl SingleObjective for Matyas {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let mut square_sum = 0.0;
let mut prod = 1.0;
for xi in x {
square_sum += xi.powi(2);
prod *= xi;
}
0.26*square_sum - 0.48*prod
}
fn minimizer(n: usize) -> Vec<f64> {
vec![0.0; n]
}
}
#[cfg(test)]
mod matyas_tests {
use super::{Matyas as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Griewank {}
impl NDimensional for Griewank {}
impl UnConstrained for Griewank {}
impl Bounded for Griewank {
const BOUNDS: (f64, f64) = (-600.0, 600.0);
}
impl SingleObjective for Griewank {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let mut cosine_prod = 1.0;
let mut square_sum = 0.0;
for (i, xi) in x.iter().enumerate() {
square_sum += xi.powi(2);
cosine_prod *= (xi/((i+1) as f64).sqrt()).cos();
}
1.0 + square_sum/4000.0 - cosine_prod
}
fn minimizer(n: usize) -> Vec<f64> {
vec![0.0; n]
}
}
#[cfg(test)]
mod griewank_tests {
use super::{Griewank as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Ridge {}
impl NDimensional for Ridge {}
impl UnConstrained for Ridge {}
impl Bounded for Ridge {
const BOUNDS: (f64, f64) = (-5.0, 5.0);
}
impl SingleObjective for Ridge {
const MINIMUM: f64 = -5.0;
fn f(x: Vec<f64>) -> f64 {
let d = 1.0;
let alpha = 0.0;
let mut square_sum = 0.0;
for xi in x.iter().skip(1) {
square_sum += xi.powi(2);
}
-1.0 + x[0] + d * square_sum.powf(alpha)
}
fn minimizer(n: usize) -> Vec<f64> {
let mut v = vec![0.0; n];
v[0] = -5.0;
v
}
}
#[cfg(test)]
mod ridge_tests {
use super::{Ridge as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Zakharov {}
impl NDimensional for Zakharov {}
impl UnConstrained for Zakharov {}
impl Bounded for Zakharov {
const BOUNDS: (f64, f64) = (-5.0, 10.0);
}
impl SingleObjective for Zakharov {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let mut square_sum: f64 = 0.0;
let mut sum_ixi: f64 = 0.0;
for (i, xi) in x.iter().enumerate() {
square_sum += xi.powi(2);
sum_ixi += 0.5*xi*(i as f64);
}
square_sum + sum_ixi.powi(2) + sum_ixi.powi(4)
}
fn minimizer(n: usize) -> Vec<f64> {
vec![0.0; n]
}
}
#[cfg(test)]
mod zakharov_tests {
use super::{Zakharov as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct Salomon {}
impl NDimensional for Salomon {}
impl UnConstrained for Salomon {}
impl Bounded for Salomon {
const BOUNDS: (f64, f64) = (-100.0, 100.0);
}
impl SingleObjective for Salomon {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
let mut square_sum = 0.0;
for xi in x {
square_sum += xi.powi(2);
}
1.0 - (2.0*std::f64::consts::PI*square_sum.sqrt()).cos() + 0.1*square_sum.sqrt()
}
fn minimizer(n: usize) -> Vec<f64> {
vec![0.0; n]
}
}
#[cfg(test)]
mod salomon_tests {
use super::{Salomon as F, NDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::LOW_D)
}
#[test]
fn high_d() {
F::check_minimizer(F::HIGH_D)
}
}
pub struct RosenbrockConst1 {}
impl UnBounded for RosenbrockConst1 {}
impl Constrained for RosenbrockConst1 {
const NH: usize = 0;
const NG: usize = 2;
fn equality_constraints(_x: Vec<f64>) -> Vec<f64> {
vec![0.0; Self::NH]
}
fn inequality_constraints(x: Vec<f64>) -> Vec<f64> {
let mut fx: Vec<f64> = vec![0.0; Self::NG];
fx[0] = (x[0]-1.0).powi(3) - x[1] + 1.0;
fx[1] = x[0] + x[1] - 2.0;
fx
}
}
impl FixedDimensional for RosenbrockConst1 {
const D: usize = 2;
}
impl SingleObjective for RosenbrockConst1 {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
Self::check_input(x.clone());
(1.0 - x[0]).powi(2) + 100.0*(x[1] - x[0].powi(2)).powi(2)
}
fn minimizer(_n: usize) -> Vec<f64> {
vec![1.0; 2]
}
}
#[cfg(test)]
mod rosenbrock_const1_tests {
use super::{RosenbrockConst1 as F, FixedDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::D)
}
}
pub struct RosenbrockConst2 {}
impl UnBounded for RosenbrockConst2 {}
impl Constrained for RosenbrockConst2 {
const NH: usize = 0;
const NG: usize = 1;
fn equality_constraints(_x: Vec<f64>) -> Vec<f64> {
vec![0.0; Self::NH]
}
fn inequality_constraints(x: Vec<f64>) -> Vec<f64> {
let mut fx: Vec<f64> = vec![0.0; Self::NG];
fx[0] = x[0].powi(2) + x[1].powi(2) - 2.0;
fx
}
}
impl FixedDimensional for RosenbrockConst2 {
const D: usize = 2;
}
impl SingleObjective for RosenbrockConst2 {
const MINIMUM: f64 = 0.0;
fn f(x: Vec<f64>) -> f64 {
Self::check_input(x.clone());
(1.0 - x[0]).powi(2) + 100.0*(x[1] - x[0].powi(2)).powi(2)
}
fn minimizer(_n: usize) -> Vec<f64> {
vec![1.0; 2]
}
}
#[cfg(test)]
mod rosenbrock_const2_tests {
use super::{RosenbrockConst2 as F, FixedDimensional, SingleObjective};
#[test]
fn low_d() {
F::check_minimizer(F::D)
}
}