1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use crate::number::Number;
use std::collections::HashMap;

pub mod index;
pub mod mul;
pub mod mul_lhs;
pub mod mul_rhs;

#[derive(Clone, Debug, Default)]
pub struct SparseMatrix<T = f64>
where
  T: Number,
{
  pub rows: usize,
  pub cols: usize,
  pub elems: HashMap<(usize, usize), T>,
  default: T,
}

impl<T> SparseMatrix<T>
where
  T: Number,
{
  pub fn new(rows: usize, cols: usize) -> Self {
    Self {
      rows,
      cols,
      elems: HashMap::new(),
      default: T::default(),
    }
  }

  pub fn from(rows: usize, cols: usize, elems: HashMap<(usize, usize), T>) -> Self {
    Self {
      rows,
      cols,
      elems,
      default: T::default(),
    }
  }

  pub fn eject(self) -> HashMap<(usize, usize), T> {
    self.elems
  }

  pub fn t(&self) -> Self {
    Self::from(
      self.cols,
      self.rows,
      self.elems.iter().fold(
        HashMap::<(usize, usize), T>::new(),
        |mut m: HashMap<(usize, usize), T>, (&(i, j), &value)| {
          m.insert((j, i), value);

          m
        },
      ),
    )
  }
}