iterative_solvers/nalgebra/
ops.rs

1use 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    // y = alpha * self * x + beta * y
18    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}