use std::collections::HashMap;
use crate::nn::Module;
use crate::{AutodiffError, Tensor};
#[derive(Debug, Clone)]
pub struct AveragedModel {
inner: fandhe_ai_autodiff::nn::AveragedModel,
}
impl AveragedModel {
pub fn new(params: &[&Tensor<f32>]) -> Result<Self, AutodiffError> {
Ok(Self {
inner: fandhe_ai_autodiff::nn::AveragedModel::new(params)?,
})
}
pub fn from_named(named: Vec<(String, &Tensor<f32>)>) -> Result<Self, AutodiffError> {
Ok(Self {
inner: fandhe_ai_autodiff::nn::AveragedModel::from_named(named)?,
})
}
pub fn from_module(module: &dyn Module) -> Result<Self, AutodiffError> {
Self::from_named(module.named_parameters())
}
pub fn n_averaged(&self) -> u64 {
self.inner.n_averaged()
}
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 averaged(&self, name: &str) -> Option<&Tensor<f32>> {
self.inner.averaged(name)
}
pub fn averaged_parameters(&self) -> Vec<&Tensor<f32>> {
self.inner.averaged_parameters()
}
pub fn averaged_state_dict(&self) -> HashMap<String, Tensor<f32>> {
self.inner.averaged_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.averaged_state_dict())?;
Ok(backup)
}
pub fn restore(
model: &mut dyn Module,
backup: HashMap<String, Tensor<f32>>,
) -> Result<(), AutodiffError> {
model.load_state_dict(backup)
}
}