sklears_decomposition/dictionary_learning/
sparse_encoding.rs1use scirs2_core::ndarray::Array2;
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6use sklears_core::{error::Result, types::Float};
7
8#[derive(Debug, Clone, Copy)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub enum EncodingAlgorithm {
12 OMP,
13 LARS,
14 CoordinateDescent,
15}
16
17#[derive(Debug, Clone)]
19#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
20pub struct SparseEncodingConfig {
21 pub algorithm: EncodingAlgorithm,
22 pub max_iter: usize,
23 pub tol: Float,
24}
25
26impl Default for SparseEncodingConfig {
27 fn default() -> Self {
28 Self {
29 algorithm: EncodingAlgorithm::OMP,
30 max_iter: 1000,
31 tol: 1e-4,
32 }
33 }
34}
35
36#[derive(Debug, Clone)]
38#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
39pub struct SparseEncodingResult {
40 pub codes: Array2<Float>,
41 pub reconstruction_error: Float,
42}
43
44#[derive(Debug, Clone)]
46#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
47pub struct SparseEncoder {
48 config: SparseEncodingConfig,
49}
50
51#[derive(Debug, Clone)]
53#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
54pub struct SparseCoder;
55
56impl SparseEncoder {
57 pub fn new(config: SparseEncodingConfig) -> Self {
58 Self { config }
59 }
60
61 pub fn encode(
62 &self,
63 dictionary: &Array2<Float>,
64 signals: &Array2<Float>,
65 ) -> Result<SparseEncodingResult> {
66 let (n_samples, _n_features) = signals.dim();
67 let n_atoms = dictionary.nrows();
68
69 let codes = Array2::zeros((n_samples, n_atoms));
70 let reconstruction_error = 0.0;
71
72 Ok(SparseEncodingResult {
73 codes,
74 reconstruction_error,
75 })
76 }
77}