use crate::error::Error;
use crate::neural_network::optimizers::adam_core::AdamCore;
use crate::neural_network::traits::{Layer, Optimizer};
#[derive(Debug)]
pub struct Adam {
core: AdamCore,
}
impl Adam {
pub fn new(
learning_rate: f32,
beta1: f32,
beta2: f32,
epsilon: f32,
weight_decay: f32,
) -> Result<Self, Error> {
Ok(Self {
core: AdamCore::new(learning_rate, beta1, beta2, epsilon, weight_decay, false)?,
})
}
pub fn with_clip_norm(self, clip_norm: f32) -> Result<Self, Error> {
Ok(Self {
core: self.core.with_clip_norm(clip_norm)?,
})
}
}
impl Optimizer for Adam {
fn clip_norm(&self) -> Option<f32> {
self.core.clip_norm()
}
fn set_learning_rate(&mut self, learning_rate: f32) {
self.core.set_learning_rate(learning_rate);
}
fn step(&mut self) {
self.core.step();
}
fn update(&mut self, layer: &mut dyn Layer, grad_scale: f32) {
self.core.update(layer, grad_scale);
}
}