pub enum Continue {
Stop,
Forward,
}
pub trait State<Observations, EvalState, Model, Error>
where
Self: std::marker::Sized,
{
fn init(obs: &Observations, model: Model) -> Self;
fn step(&self) -> Result<Model, Error>;
fn eval(&self, obs: &Observations, new_model: Model) -> EvalState;
fn stop_criterion(self, nb_iter: usize, eval_state: EvalState) -> (Self, Continue);
fn iterative_solve(obs: &Observations, initial_model: Model) -> Result<(Self, usize), Error> {
let mut state = Self::init(obs, initial_model);
let mut nb_iter = 0;
loop {
nb_iter += 1;
let new_model = state.step()?;
let eval_state = state.eval(obs, new_model);
let (kept_state, continuation) = state.stop_criterion(nb_iter, eval_state);
state = kept_state;
if let Continue::Stop = continuation {
return Ok((state, nb_iter));
}
}
}
}