sparsemat/
sparsemat_par.rs1use std::cmp::min;
2use std::cmp::max;
3use crate::sparsematrix::SparseMatrix;
9
10#[derive(Clone, Debug)]
12pub struct SparseMatPar<M> {
13 n_rows_sub_matrix: usize,
14 n_blocks: usize,
15 sub_matrices: Vec<M>,
16}
17
18impl<'a, M> SparseMatPar<M>
19where M: SparseMatrix<'a> {
20 pub fn with_sub_matrices(n_blocks: usize, max_n_rows: usize) -> Self {
21 let n_rows_sub_matrix = max_n_rows / n_blocks;
22 let sub_matrices = vec![M::with_capacity(n_rows_sub_matrix); n_blocks];
23 Self {
24 n_rows_sub_matrix: n_rows_sub_matrix,
25 n_blocks: n_blocks,
26 sub_matrices: sub_matrices,
27 }
28 }
29
30 fn get_block_and_row_id(&self, row: usize) -> (usize, usize) {
32 let block_id = min(row / self.n_rows_sub_matrix, self.n_blocks);
33 let row_id = row - block_id * self.n_rows_sub_matrix;
34 (block_id, row_id)
35 }
36
37 }
70
71impl<'a, M> SparseMatrix<'a> for SparseMatPar<M>
72where M: 'a + SparseMatrix<'a> {
73 type Value = M::Value;
74 type Index = M::Index;
75 type IterRow = M::IterRow;
77
78 fn iter_row(&'a self, row: usize) -> Self::IterRow {
87 let (block_id, row_id) = self.get_block_and_row_id(row);
88 self.sub_matrices[block_id].iter_row(row_id)
89 }
90
91 fn with_capacity(cap: usize) -> Self {
92 Self::with_sub_matrices(4, cap)
93 }
94
95 fn n_rows(&self) -> usize {
96 let mut last = 0;
97 for b in 0..self.sub_matrices.len() {
99 if self.sub_matrices[b].empty() {
100 break;
101 }
102 last = b;
103 }
104 last * self.n_rows_sub_matrix + self.sub_matrices[last].n_rows()
107 }
108
109 fn n_cols(&self) -> usize {
110 let mut ret = 0;
111 for mat in &self.sub_matrices {
112 ret = max(mat.n_cols(), ret);
113 }
114 ret
115 }
116
117 fn n_non_zero_entries(&self) -> usize {
118 let mut ret = 0;
119 for mat in &self.sub_matrices {
120 ret += mat.n_non_zero_entries();
121 }
122 ret
123 }
124
125 fn get(&self, i: usize, j: usize) -> Self::Value {
126 let (block_id, row_id) = self.get_block_and_row_id(i);
127 self.sub_matrices[block_id].get(row_id, j)
128 }
129
130 fn get_mut(&mut self, i: usize, j: usize) -> &mut Self::Value {
131 let (block_id, row_id) = self.get_block_and_row_id(i);
132 self.sub_matrices[block_id].get_mut(row_id, j)
133 }
134
135 fn scale(&mut self, rhs: Self::Value) {
136 for mat in &mut self.sub_matrices {
137 mat.scale(rhs);
138 }
139 }
140}