pub mod adagrad;
pub mod sgd;
pub use adagrad::{AdaGrad, AdaGradConfig};
pub use sgd::{Sgd, SgdConfig};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Optimizer {
Sgd(Sgd),
AdaGrad(AdaGrad),
}
impl Optimizer {
pub fn sgd(feature_count: usize, config: SgdConfig) -> Result<Self, RillError> {
Ok(Optimizer::Sgd(Sgd::new(feature_count, config)?))
}
pub fn adagrad(feature_count: usize, config: AdaGradConfig) -> Result<Self, RillError> {
Ok(Optimizer::AdaGrad(AdaGrad::new(feature_count, config)?))
}
pub fn param_count(&self) -> usize {
match self {
Optimizer::Sgd(o) => o.param_count(),
Optimizer::AdaGrad(o) => o.param_count(),
}
}
pub fn samples_seen(&self) -> u64 {
match self {
Optimizer::Sgd(o) => o.samples_seen(),
Optimizer::AdaGrad(o) => o.samples_seen(),
}
}
pub fn step(
&mut self,
weights: &mut [f64],
intercept: &mut f64,
grad_weights: &[f64],
grad_intercept: f64,
) -> Result<(), RillError> {
match self {
Optimizer::Sgd(o) => o.step(weights, intercept, grad_weights, grad_intercept),
Optimizer::AdaGrad(o) => o.step(weights, intercept, grad_weights, grad_intercept),
}
}
pub fn reset(&mut self) {
match self {
Optimizer::Sgd(o) => o.reset(),
Optimizer::AdaGrad(o) => o.reset(),
}
}
}
use crate::error::RillError;