use rand_chacha::ChaChaRng;
use super::{Local, BIPOP, IPOP};
use crate::{CMAESOptions, TerminationData, TerminationReason, CMAES};
#[derive(Clone, Copy, Debug)]
pub enum RestartControl {
Continue,
MaxRunsReached,
}
impl RestartControl {
#[cfg(test)]
pub fn should_terminate(&self) -> bool {
match *self {
RestartControl::Continue => false,
RestartControl::MaxRunsReached => true,
}
}
}
#[derive(Clone, Debug)]
pub enum RestartStrategy {
Local(Local),
IPOP(IPOP),
BIPOP(BIPOP),
}
pub trait Strategy {
fn has_zero_max_runs(&self) -> bool;
fn next_run<F, R: FnOnce(&mut CMAES<F>) -> TerminationData>(
&mut self,
default_options: CMAESOptions,
search_range_size: f64,
objective_function: F,
run: R,
rng: &mut ChaChaRng,
) -> (CMAES<F>, Vec<TerminationReason>, RestartControl);
fn get_algorithm_name(&self) -> &'static str;
fn get_parameters_as_strings(&self) -> Vec<(String, String)>;
}
impl Strategy for RestartStrategy {
fn has_zero_max_runs(&self) -> bool {
match *self {
RestartStrategy::Local(ref s) => s.has_zero_max_runs(),
RestartStrategy::IPOP(ref s) => s.has_zero_max_runs(),
RestartStrategy::BIPOP(ref s) => s.has_zero_max_runs(),
}
}
fn next_run<F, R: FnOnce(&mut CMAES<F>) -> TerminationData>(
&mut self,
default_options: CMAESOptions,
search_range_size: f64,
objective_function: F,
run: R,
rng: &mut ChaChaRng,
) -> (CMAES<F>, Vec<TerminationReason>, RestartControl) {
match *self {
RestartStrategy::Local(ref mut s) => s.next_run(
default_options,
search_range_size,
objective_function,
run,
rng,
),
RestartStrategy::IPOP(ref mut s) => s.next_run(
default_options,
search_range_size,
objective_function,
run,
rng,
),
RestartStrategy::BIPOP(ref mut s) => s.next_run(
default_options,
search_range_size,
objective_function,
run,
rng,
),
}
}
fn get_algorithm_name(&self) -> &'static str {
match *self {
RestartStrategy::Local(ref s) => s.get_algorithm_name(),
RestartStrategy::IPOP(ref s) => s.get_algorithm_name(),
RestartStrategy::BIPOP(ref s) => s.get_algorithm_name(),
}
}
fn get_parameters_as_strings(&self) -> Vec<(String, String)> {
match *self {
RestartStrategy::Local(ref s) => s.get_parameters_as_strings(),
RestartStrategy::IPOP(ref s) => s.get_parameters_as_strings(),
RestartStrategy::BIPOP(ref s) => s.get_parameters_as_strings(),
}
}
}