use crate::fitness::{FitnessEvaluator, FitnessFunction};
use crate::params::{CmaesParams, CmaesParamsValidator};
use crate::state::{CmaesState, CmaesStateLogic};
use crate::strategy::{CmaesAlgo, CmaesAlgoOptimizer};
#[allow(unused_imports)]
use std::io::{self, Write};
pub fn express_executor(objective_function: impl FitnessFunction) -> impl CmaesStateLogic {
let params = CmaesParams::new()
.unwrap()
.set_popsize(objective_function.cost_dim() as i32)
.unwrap()
.set_xstart(objective_function.cost_dim(), 0.0)
.unwrap()
.set_only_diag(true)
.unwrap();
let cmaes = CmaesAlgo::new(params).unwrap();
let mut state = CmaesState::init_state(&cmaes.params).unwrap();
let mut step = 1;
loop {
let mut pop = cmaes.ask(&mut state).unwrap();
let mut fitness = objective_function.evaluate(&pop).unwrap();
state = cmaes.tell(state, &mut pop, &mut fitness).unwrap();
if let Ok(true) = cmaes.is_done(&state, step) {
break;
}
step += 1;
}
state
}