#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Method {
Multistart,
Mlsl,
Basinhopping,
Flooding,
Deflation,
Tunneling,
}
impl Method {
pub fn parse(s: &str) -> Result<Self, String> {
Ok(match s {
"multistart" => Self::Multistart,
"mlsl" => Self::Mlsl,
"basinhopping" => Self::Basinhopping,
"flooding" => Self::Flooding,
"deflation" => Self::Deflation,
"tunneling" => Self::Tunneling,
other => {
return Err(format!(
"unknown --minima method '{other}'; choose from \
multistart, mlsl, basinhopping, flooding, deflation, tunneling"
));
}
})
}
pub fn as_str(&self) -> &'static str {
match self {
Self::Multistart => "multistart",
Self::Mlsl => "mlsl",
Self::Basinhopping => "basinhopping",
Self::Flooding => "flooding",
Self::Deflation => "deflation",
Self::Tunneling => "tunneling",
}
}
}
#[derive(Debug, Clone)]
pub struct MinimaOptions {
pub method: Method,
pub n_minima: usize,
pub max_solves: Option<usize>,
pub patience: usize,
pub dedup: f64,
pub psd_tol: f64,
pub kkt_tol: Option<f64>,
pub seed: u64,
pub sobol: bool,
pub sigma: Option<f64>,
pub sigma_frac: Option<f64>,
pub amplitude: Option<f64>,
pub amp_margin: Option<f64>,
pub eta: Option<f64>,
pub power: Option<f64>,
pub soft: Option<f64>,
pub length: Option<f64>,
pub length_frac: Option<f64>,
pub gamma: Option<f64>,
pub samples_per_round: Option<usize>,
pub step: Option<f64>,
pub temperature: Option<f64>,
pub restart_jitter: Option<f64>,
pub sigma_per_dim: Option<Vec<f64>>,
pub length_per_dim: Option<Vec<f64>>,
pub max_samples: Option<usize>,
pub amp_bump: Option<f64>,
pub amp_bump_cap: Option<f64>,
pub amp_fallback: Option<f64>,
}
impl MinimaOptions {
pub fn max_solves_or_default(&self) -> usize {
self.max_solves.unwrap_or(8 * self.n_minima)
}
}
impl Default for MinimaOptions {
fn default() -> Self {
Self {
method: Method::Deflation,
n_minima: 10,
max_solves: None,
patience: 8,
dedup: 1e-4,
psd_tol: 1e-6,
kkt_tol: Some(1e-4),
seed: 0,
sobol: true,
sigma: None,
sigma_frac: None,
amplitude: None,
amp_margin: None,
eta: None,
power: None,
soft: None,
length: None,
length_frac: None,
gamma: None,
samples_per_round: None,
step: None,
temperature: None,
restart_jitter: None,
sigma_per_dim: None,
length_per_dim: None,
max_samples: None,
amp_bump: None,
amp_bump_cap: None,
amp_fallback: None,
}
}
}