iterative_solvers/nalgebra/
ops.rs1use nalgebra::{DMatrix, DVector};
2use nalgebra_sparse::{
3 CscMatrix, CsrMatrix,
4 ops::{
5 Op,
6 serial::{spmm_csc_dense, spmm_csr_dense},
7 },
8};
9
10pub trait MatrixOp {
11 fn nrows(&self) -> usize;
12
13 fn ncols(&self) -> usize;
14
15 fn is_square(&self) -> bool;
16
17 fn gemv(&self, alpha: f64, x: &DVector<f64>, beta: f64, y: &mut DVector<f64>);
19
20 fn is_empty(&self) -> bool;
21}
22
23impl MatrixOp for DMatrix<f64> {
24 fn nrows(&self) -> usize {
25 self.nrows()
26 }
27
28 fn ncols(&self) -> usize {
29 self.ncols()
30 }
31
32 fn is_square(&self) -> bool {
33 self.is_square()
34 }
35
36 fn gemv(&self, alpha: f64, x: &DVector<f64>, beta: f64, y: &mut DVector<f64>) {
37 y.gemv(alpha, self, x, beta)
38 }
39
40 fn is_empty(&self) -> bool {
41 self.is_empty()
42 }
43}
44
45impl MatrixOp for CsrMatrix<f64> {
46 fn nrows(&self) -> usize {
47 self.nrows()
48 }
49
50 fn ncols(&self) -> usize {
51 self.ncols()
52 }
53
54 fn is_empty(&self) -> bool {
55 self.nrows() == 0 || self.ncols() == 0
56 }
57
58 fn is_square(&self) -> bool {
59 self.nrows() == self.ncols()
60 }
61
62 fn gemv(&self, alpha: f64, x: &DVector<f64>, beta: f64, y: &mut DVector<f64>) {
63 spmm_csr_dense(beta, y, alpha, Op::NoOp(self), Op::NoOp(x))
64 }
65}
66
67impl MatrixOp for CscMatrix<f64> {
68 fn nrows(&self) -> usize {
69 self.nrows()
70 }
71
72 fn ncols(&self) -> usize {
73 self.ncols()
74 }
75
76 fn is_empty(&self) -> bool {
77 self.nrows() == 0 || self.ncols() == 0
78 }
79
80 fn is_square(&self) -> bool {
81 self.nrows() == self.ncols()
82 }
83
84 fn gemv(&self, alpha: f64, x: &DVector<f64>, beta: f64, y: &mut DVector<f64>) {
85 spmm_csc_dense(beta, y, alpha, Op::NoOp(self), Op::NoOp(x))
86 }
87}