use crate::calibration::types::FixedParameters;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct CmaEsConfig {
pub seed: Option<u64>,
pub parallel_eval: bool,
pub verbosity: u8,
pub ipop_restarts: usize,
pub ipop_increase_factor: f64,
pub max_evaluations: usize,
pub sigma0: f64,
pub bipop_restarts: usize,
pub lbfgsb_enabled: bool,
pub lbfgsb_max_iterations: usize,
pub total_evals_budget: usize,
pub use_subrun_budgeting: bool,
pub mini_cmaes_on_refinement: bool,
}
impl Default for CmaEsConfig {
fn default() -> Self {
Self {
seed: Some(123456),
parallel_eval: true,
verbosity: 0, ipop_restarts: 0,
ipop_increase_factor: 2.0,
max_evaluations: 100000,
sigma0: 0.3,
bipop_restarts: 5,
lbfgsb_enabled: true,
lbfgsb_max_iterations: 200,
total_evals_budget: 200000,
use_subrun_budgeting: false,
mini_cmaes_on_refinement: true,
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct AdaptiveBoundsConfig {
pub enabled: bool,
pub max_iterations: usize,
pub proximity_threshold: f64,
pub expansion_factor: f64,
}
impl Default for AdaptiveBoundsConfig {
fn default() -> Self {
Self {
enabled: false,
max_iterations: 3,
proximity_threshold: 0.1, expansion_factor: 0.25, }
}
}
#[derive(Debug, Deserialize, Clone)]
pub struct OptimizationConfig {
#[serde(default = "default_max_iterations")]
pub max_iterations: usize,
#[serde(default = "default_tolerance")]
pub tolerance: f64,
#[serde(default)]
pub fixed_params: FixedParameters,
#[serde(default = "default_pop_size")]
pub pop_size: usize,
#[serde(default = "default_max_gen")]
pub max_gen: usize,
#[serde(default = "default_obj_tol")]
pub obj_tol: f64,
#[serde(default = "default_alpha_cov")]
pub alpha_cov: f64,
#[serde(default = "default_alpha_sigma")]
pub alpha_sigma: f64,
#[serde(default = "default_target_sr")]
pub target_sr: f64,
#[serde(default)]
pub cmaes: CmaEsConfig,
#[serde(default)]
pub adaptive_bounds: AdaptiveBoundsConfig,
}
impl Default for OptimizationConfig {
fn default() -> Self {
Self {
max_iterations: default_max_iterations(),
tolerance: default_tolerance(),
fixed_params: FixedParameters::default(),
pop_size: default_pop_size(),
max_gen: default_max_gen(),
obj_tol: default_obj_tol(),
alpha_cov: default_alpha_cov(),
alpha_sigma: default_alpha_sigma(),
target_sr: default_target_sr(),
cmaes: CmaEsConfig::default(),
adaptive_bounds: AdaptiveBoundsConfig::default(),
}
}
}
impl OptimizationConfig {
pub fn production() -> Self {
Self {
max_iterations: 1000,
tolerance: 1e-8,
fixed_params: FixedParameters::default(),
pop_size: 25,
max_gen: 50,
obj_tol: 1e-8,
alpha_cov: 0.2,
alpha_sigma: 0.5,
target_sr: 0.2,
cmaes: CmaEsConfig {
verbosity: 0, max_evaluations: 100000,
total_evals_budget: 200000,
..CmaEsConfig::default()
},
adaptive_bounds: AdaptiveBoundsConfig::default(),
}
}
pub fn fast() -> Self {
Self {
max_iterations: 1000,
tolerance: 1e-6,
fixed_params: FixedParameters::default(),
pop_size: 30,
max_gen: 50,
obj_tol: 1e-6,
alpha_cov: 0.2,
alpha_sigma: 0.5,
target_sr: 0.2,
cmaes: CmaEsConfig {
verbosity: 2,
max_evaluations: 10000,
total_evals_budget: 20000,
bipop_restarts: 2,
..CmaEsConfig::default()
},
adaptive_bounds: AdaptiveBoundsConfig::default(),
}
}
pub fn research() -> Self {
Self {
max_iterations: 10000,
tolerance: 1e-9,
fixed_params: FixedParameters::default(),
pop_size: 100,
max_gen: 200,
obj_tol: 1e-9,
alpha_cov: 0.15,
alpha_sigma: 0.3,
target_sr: 0.15,
cmaes: CmaEsConfig {
verbosity: 1,
max_evaluations: 500000,
total_evals_budget: 1000000,
bipop_restarts: 5,
ipop_restarts: 3,
..CmaEsConfig::default()
},
adaptive_bounds: AdaptiveBoundsConfig::default(),
}
}
pub fn minimal() -> Self {
Self {
max_iterations: 100,
tolerance: 1e-4,
fixed_params: FixedParameters::default(),
pop_size: 10,
max_gen: 20,
obj_tol: 1e-4,
alpha_cov: 0.3,
alpha_sigma: 0.7,
target_sr: 0.3,
cmaes: CmaEsConfig {
verbosity: 0,
max_evaluations: 1000,
total_evals_budget: 2000,
bipop_restarts: 1,
..CmaEsConfig::default()
},
adaptive_bounds: AdaptiveBoundsConfig::default(),
}
}
}
fn default_max_iterations() -> usize {
5000
}
fn default_tolerance() -> f64 {
1e-6
}
fn default_pop_size() -> usize {
50
}
fn default_max_gen() -> usize {
100
}
fn default_obj_tol() -> f64 {
1e-8
}
fn default_alpha_cov() -> f64 {
0.2
}
fn default_alpha_sigma() -> f64 {
0.5
}
fn default_target_sr() -> f64 {
0.2
}