use std::time::Instant;
use crate::{
fitness::{allow_objective_func, FitnessEvaluator, SquareAndSum},
CmaesAlgo, CmaesAlgoOptimizer, CmaesParams, CmaesParamsValidator, CmaesState, CmaesStateLogic,
};
use anyhow::Result;
pub fn example() -> Result<()> {
let start = Instant::now();
let objective_function = SquareAndSum { cost_dim: 45 };
let (obj, obj_dim) = allow_objective_func(objective_function)?;
let params = CmaesParams::new()?
.set_popsize(50)?
.set_xstart(vec![0.0; obj_dim])?
.set_sigma(0.75)?;
let cmaes = CmaesAlgo::new(params)?;
let mut state = CmaesState::init_state(&cmaes.params)?;
let mut step = 0;
loop {
let mut pop = cmaes.ask(&mut state)?;
let mut fitness = obj.evaluate(&pop)?;
state = cmaes.tell(state, &mut pop, &mut fitness)?;
let curr = state.best_y.first().unwrap();
if (curr - cmaes.params.obj_value).abs() < cmaes.params.tol {
break;
}
step += 1;
}
println!(
"Step {} | Fitness: {:+.4?} | Duration p/step: {:.4} secs",
step,
&state.best_y.first().unwrap(),
(start.elapsed().as_micros() as f32) / 1000000.0 / (step as f32)
);
Ok(())
}