sklears_decomposition/dictionary_learning/
lars_algorithms.rs1use scirs2_core::ndarray::{Array1, Array2};
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6use sklears_core::{error::Result, types::Float};
7
8#[derive(Debug, Clone)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct LARSConfig {
12 pub max_iter: usize,
14 pub alpha: Float,
16}
17
18impl Default for LARSConfig {
19 fn default() -> Self {
20 Self {
21 max_iter: 500,
22 alpha: 1.0,
23 }
24 }
25}
26
27#[derive(Debug, Clone)]
29#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
30pub struct LARSResult {
31 pub coefficients: Array2<Float>,
33 pub active_set: Vec<usize>,
35 pub n_iter: usize,
37}
38
39#[derive(Debug, Clone)]
41#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
42pub struct LARSDirection {
43 pub direction: Array1<Float>,
44 pub correlation: Float,
45}
46
47#[derive(Debug, Clone)]
49#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
50pub struct LARSStepSize {
51 pub step_size: Float,
52 pub next_variable: Option<usize>,
53}
54
55#[derive(Debug, Clone)]
57#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
58pub struct LARSEncoder {
59 config: LARSConfig,
60}
61
62impl LARSEncoder {
63 pub fn new(config: LARSConfig) -> Self {
64 Self { config }
65 }
66
67 pub fn encode(
69 &self,
70 dictionary: &Array2<Float>,
71 _signal: &Array1<Float>,
72 ) -> Result<LARSResult> {
73 let n_atoms = dictionary.nrows();
74
75 let coefficients = Array2::zeros((1, n_atoms));
77 let active_set = Vec::new();
78
79 Ok(LARSResult {
80 coefficients,
81 active_set,
82 n_iter: 0,
83 })
84 }
85}