use scirs2_core::ndarray::Array2;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use sklears_core::{error::Result, types::Float};
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum EncodingAlgorithm {
OMP,
LARS,
CoordinateDescent,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SparseEncodingConfig {
pub algorithm: EncodingAlgorithm,
pub max_iter: usize,
pub tol: Float,
}
impl Default for SparseEncodingConfig {
fn default() -> Self {
Self {
algorithm: EncodingAlgorithm::OMP,
max_iter: 1000,
tol: 1e-4,
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SparseEncodingResult {
pub codes: Array2<Float>,
pub reconstruction_error: Float,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SparseEncoder {
config: SparseEncodingConfig,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SparseCoder;
impl SparseEncoder {
pub fn new(config: SparseEncodingConfig) -> Self {
Self { config }
}
pub fn encode(
&self,
dictionary: &Array2<Float>,
signals: &Array2<Float>,
) -> Result<SparseEncodingResult> {
let (n_samples, _n_features) = signals.dim();
let n_atoms = dictionary.nrows();
let codes = Array2::zeros((n_samples, n_atoms));
let reconstruction_error = 0.0;
Ok(SparseEncodingResult {
codes,
reconstruction_error,
})
}
}