mod utils;
mod vec;
mod algo;
mod target;
pub use target::*;
pub struct Options {
pub adam: bool,
pub iterations: usize,
pub lr: Option<f64>,
pub lr_decay: f64,
pub lr_power: f64,
pub px: f64,
pub px_decay: f64,
pub px_power: f64,
pub momentum: f64,
pub beta: f64,
pub epsilon: f64
}
impl Default for Options {
fn default() -> Self {
Self {
adam: true,
iterations: 10_000,
lr: None,
lr_decay: 1e-3,
lr_power: 0.5,
px: 2.0,
px_decay: 1e-2,
px_power: 0.161,
momentum: 0.9,
beta: 0.999,
epsilon: 1e-7
}
}
}
#[derive(Default, Clone)]
pub struct Optimizer([Vec<f64>; algo::REGISTER_NUM]);
#[non_exhaustive]
pub struct Iteration<'a> {
pub iteration: usize,
pub point: &'a mut [f64],
pub gradient: &'a mut [f64],
pub learning_rate: &'a mut f64,
}
impl Optimizer {
pub fn new() -> Self {
Self::default()
}
pub fn optimize<T: Target>(&mut self, target: T, vector: &mut [f64], options: Options) {
let size = vector.len();
for v in &mut self.0 {
v.clear();
v.resize(size, 0.0);
}
algo::optimize(target, options, vector, &mut self.0)
}
}