use scirs2_core::ndarray::Array2;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use sklears_core::{
error::{Result, SklearsError},
traits::{Estimator, Fit, Trained, Transform, Untrained},
types::Float,
};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MiniBatchConfig {
pub n_components: usize,
pub batch_size: usize,
pub max_iter: usize,
}
impl Default for MiniBatchConfig {
fn default() -> Self {
Self {
n_components: 100,
batch_size: 10,
max_iter: 1000,
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MiniBatchResult {
pub components: Array2<Float>,
pub n_iter: usize,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MiniBatchDictionaryLearning<State = Untrained> {
config: MiniBatchConfig,
state: std::marker::PhantomData<State>,
components_: Option<Array2<Float>>,
}
impl MiniBatchDictionaryLearning<Untrained> {
pub fn new(config: MiniBatchConfig) -> Self {
Self {
config,
state: std::marker::PhantomData,
components_: None,
}
}
}
impl MiniBatchDictionaryLearning<Trained> {
pub fn components(&self) -> &Array2<Float> {
self.components_.as_ref().expect("Model is trained")
}
}
impl Estimator for MiniBatchDictionaryLearning<Untrained> {
type Config = MiniBatchConfig;
type Error = SklearsError;
type Float = Float;
fn config(&self) -> &Self::Config {
&self.config
}
}
impl Fit<Array2<Float>, ()> for MiniBatchDictionaryLearning<Untrained> {
type Fitted = MiniBatchDictionaryLearning<Trained>;
fn fit(self, x: &Array2<Float>, _y: &()) -> Result<Self::Fitted> {
let (_n_samples, n_features) = x.dim();
let components = Array2::zeros((self.config.n_components, n_features));
Ok(MiniBatchDictionaryLearning {
config: self.config,
state: std::marker::PhantomData,
components_: Some(components),
})
}
}
impl Transform<Array2<Float>, Array2<Float>> for MiniBatchDictionaryLearning<Trained> {
fn transform(&self, x: &Array2<Float>) -> Result<Array2<Float>> {
let (n_samples, _n_features) = x.dim();
let codes = Array2::zeros((n_samples, self.config.n_components));
Ok(codes)
}
}
pub type TrainedMiniBatchDictionaryLearning = MiniBatchDictionaryLearning<Trained>;