use std::collections::HashMap;
use crate::nn::Module;
use crate::{AutodiffError, Tensor};
#[derive(Debug)]
pub struct ExponentialMovingAverage {
inner: fandhe_ai_autodiff::nn::ExponentialMovingAverage,
}
impl ExponentialMovingAverage {
pub fn new(decay: f32, params: &[&Tensor<f32>]) -> Result<Self, AutodiffError> {
Ok(Self {
inner: fandhe_ai_autodiff::nn::ExponentialMovingAverage::new(decay, params)?,
})
}
pub fn from_named(
decay: f32,
named: Vec<(String, &Tensor<f32>)>,
) -> Result<Self, AutodiffError> {
Ok(Self {
inner: fandhe_ai_autodiff::nn::ExponentialMovingAverage::from_named(decay, named)?,
})
}
pub fn from_module(decay: f32, module: &dyn Module) -> Result<Self, AutodiffError> {
Self::from_named(decay, module.named_parameters())
}
pub fn decay(&self) -> f32 {
self.inner.decay()
}
pub fn num_updates(&self) -> u64 {
self.inner.num_updates()
}
pub fn update(&mut self, params: &[&Tensor<f32>]) -> Result<(), AutodiffError> {
self.inner.update(params)
}
pub fn update_named(
&mut self,
named: Vec<(String, &Tensor<f32>)>,
) -> Result<(), AutodiffError> {
self.inner.update_named(named)
}
pub fn update_from_module(&mut self, module: &dyn Module) -> Result<(), AutodiffError> {
self.update_named(module.named_parameters())
}
pub fn shadow(&self, name: &str) -> Option<&Tensor<f32>> {
self.inner.shadow(name)
}
pub fn shadow_parameters(&self) -> Vec<&Tensor<f32>> {
self.inner.shadow_parameters()
}
pub fn shadow_state_dict(&self) -> HashMap<String, Tensor<f32>> {
self.inner.shadow_state_dict()
}
pub fn apply(
&self,
model: &mut dyn Module,
) -> Result<HashMap<String, Tensor<f32>>, AutodiffError> {
let backup = model.state_dict();
model.load_state_dict(self.inner.shadow_state_dict())?;
Ok(backup)
}
pub fn restore(
model: &mut dyn Module,
backup: HashMap<String, Tensor<f32>>,
) -> Result<(), AutodiffError> {
model.load_state_dict(backup)
}
}