#![deny(missing_docs,
//missing_debug_implementations,
missing_copy_implementations,
trivial_casts,
trivial_numeric_casts,
unsafe_code,
unused_import_braces,
unused_qualifications)]
mod point;
mod simplex;
mod search_space;
mod algorithm;
pub use algorithm::Optimizer;
#[cfg(test)]
mod tests
{
use crate::algorithm::Optimizer;
#[test]
fn test_predict_during_optimization()
{
let f = |v: &[f64]| -(v[0] * v[0] + v[1] * v[1]); let input_interval = vec![(-5., 5.), (-5., 5.)];
let mut optimizer = Optimizer::new(f, &input_interval, true);
for _ in 0..50
{
optimizer.next();
}
for (coords, _actual_value) in optimizer.evaluated_points()
{
let prediction = optimizer.predict(coords);
assert!(prediction.is_some(),
"predict returned None for previously evaluated point {:?}",
coords);
}
let prediction_at_origin = optimizer.predict(&[0.0, 0.0]);
assert!(prediction_at_origin.is_some(), "predict returned None at origin");
let corners = vec![[-5.0, -5.0], [-5.0, 5.0], [5.0, -5.0], [5.0, 5.0], [0.0, 0.0], [2.5, -1.0]];
for corner in &corners
{
let prediction = optimizer.predict(corner);
assert!(prediction.is_some(), "predict returned None at {:?}", corner);
}
}
#[test]
fn test_predict_improves_with_iterations()
{
let f = |v: &[f64]| v[0] * v[0] + v[1] * v[1]; let input_interval = vec![(-5., 5.), (-5., 5.)];
let mut optimizer_short = Optimizer::new(f, &input_interval, true);
for _ in 0..10
{
optimizer_short.next();
}
let mut optimizer_long = Optimizer::new(f, &input_interval, true);
for _ in 0..100
{
optimizer_long.next();
}
let pred_short = optimizer_short.predict(&[0.0, 0.0]).unwrap();
let pred_long = optimizer_long.predict(&[0.0, 0.0]).unwrap();
assert!(pred_long.abs() <= pred_short.abs(),
"longer optimization should predict better at minimum: short={}, long={}",
pred_short,
pred_long);
}
}