use super::{
super::{
super::{
test::{TestError, assert_eq_within_tols},
},
},
EqualityConstraint, FirstOrderRootFinding, LineSearch, NewtonRaphson, Scalar,
SecondOrderOptimization,
};
const CONTROL_1: Scalar = 1e-3;
const CONTROL_2: Scalar = 1e-1;
const CUT_BACK: Scalar = 9e-1;
const MAX_STEPS: usize = 25;
mod minimize {
use super::*;
#[test]
fn quadratic() -> Result<(), TestError> {
assert_eq_within_tols(
&NewtonRaphson::default().minimize(
|x: &Scalar| Ok(x.powi(2) / 2.0),
|x: &Scalar| Ok(*x),
|_: &Scalar| Ok(1.0),
1.0,
EqualityConstraint::None,
None,
)?,
&0.0,
)
}
mod line_search {
use super::*;
#[test]
fn armijo() -> Result<(), TestError> {
assert_eq_within_tols(
&NewtonRaphson {
line_search: LineSearch::Armijo {
control: CONTROL_1,
cut_back: CUT_BACK,
max_steps: MAX_STEPS,
},
..Default::default()
}
.minimize(
|x: &Scalar| Ok(x.powi(2) / 2.0),
|x: &Scalar| Ok(*x),
|_: &Scalar| Ok(1.0),
1.0,
EqualityConstraint::None,
None,
)?,
&0.0,
)
}
#[test]
fn goldstein() -> Result<(), TestError> {
assert_eq_within_tols(
&NewtonRaphson {
line_search: LineSearch::Goldstein {
control: CONTROL_1,
cut_back: CUT_BACK,
max_steps: MAX_STEPS,
},
..Default::default()
}
.minimize(
|x: &Scalar| Ok(x.powi(2) / 2.0),
|x: &Scalar| Ok(*x),
|_: &Scalar| Ok(1.0),
1.0,
EqualityConstraint::None,
None,
)?,
&0.0,
)
}
mod wolfe {
use super::*;
#[test]
fn strong() -> Result<(), TestError> {
assert_eq_within_tols(
&NewtonRaphson {
line_search: LineSearch::Wolfe {
control_1: CONTROL_1,
control_2: CONTROL_2,
cut_back: CUT_BACK,
max_steps: MAX_STEPS,
strong: true,
},
..Default::default()
}
.minimize(
|x: &Scalar| Ok(x.powi(2) / 2.0),
|x: &Scalar| Ok(*x),
|_: &Scalar| Ok(1.0),
1.0,
EqualityConstraint::None,
None,
)?,
&0.0,
)
}
#[test]
fn weak() -> Result<(), TestError> {
assert_eq_within_tols(
&NewtonRaphson {
line_search: LineSearch::Wolfe {
control_1: CONTROL_1,
control_2: CONTROL_2,
cut_back: CUT_BACK,
max_steps: MAX_STEPS,
strong: false,
},
..Default::default()
}
.minimize(
|x: &Scalar| Ok(x.powi(2) / 2.0),
|x: &Scalar| Ok(*x),
|_: &Scalar| Ok(1.0),
1.0,
EqualityConstraint::None,
None,
)?,
&0.0,
)
}
}
}
}
mod root {
use super::*;
#[test]
fn linear() -> Result<(), TestError> {
assert_eq_within_tols(
&NewtonRaphson::default().root(
|x: &Scalar| Ok(*x),
|_: &Scalar| Ok(1.0),
1.0,
EqualityConstraint::None,
)?,
&0.0,
)
}
}