69
72
_row_ownership = distributor (distributor::decide, communicator(), loc_nrow1);
70
73
_col_ownership = distributor (distributor::decide, communicator(), loc_ncol1);
71
74
_data.resize (loc_nnz1);
75
// first pointer points to the beginning of the data:
76
vector_of_iterator<pair_type>::operator[](0) = _data.begin().operator->();
74
csr_seq_rep<T>::csr_seq_rep(const csr_seq_rep<T>& a)
75
: vector_of_iterator<pair_type>(a.nrow()+1),
76
_row_ownership (a.row_ownership()),
77
_col_ownership (a.col_ownership()),
79
_is_symmetric (a._is_symmetric),
80
_pattern_dimension (a._pattern_dimension)
79
csr_seq_rep<T>::csr_seq_rep(const csr_seq_rep<T>& b)
80
: vector_of_iterator<pair_type>(b.nrow()+1),
81
_row_ownership (b.row_ownership()),
82
_col_ownership (b.col_ownership()),
84
_is_symmetric (b._is_symmetric),
85
_pattern_dimension (b._pattern_dimension)
82
// TODO: performs copy of arrays
83
fatal_macro ("physical copy of csr");
87
// physical copy of csr
88
typedef typename csr_seq_rep<T>::size_type size_type;
89
typename csr_seq_rep<T>::const_iterator ib = b.begin();
90
typename csr_seq_rep<T>::iterator ia = begin();
91
ia[0] = _data.begin().operator->();
92
for (size_type i = 0, n = b.nrow(); i < n; i++) {
93
ia [i+1] = ia[0] + (ib[i+1] - ib[0]);
86
97
csr_seq_rep<T>::csr_seq_rep(const asr_seq_rep<T>& a)
87
98
: vector_of_iterator<pair_type>(a.nrow()+1),
137
148
csr_seq_rep<T>::put (odiststream& ops, size_type istart) const
139
150
std::ostream& os = ops.os();
140
os << "%%MatrixMarket matrix coordinate real general" << std::endl
151
os << setprecision (std::numeric_limits<T>::digits10)
152
<< "%%MatrixMarket matrix coordinate real general" << std::endl
141
153
<< nrow() << " " << ncol() << " " << nnz() << endl;
142
154
const_iterator ia = begin();
143
155
const size_type base = 1;
196
csr_seq_rep<T>::trans_mult(
197
const vec<T,sequential>& x,
198
vec<T,sequential>& y)
201
// reset y and then cumul
202
std::fill (y.begin(), y.end(), T(0));
203
csr_cumul_trans_mult (
204
vector_of_iterator<pair_type>::begin(),
205
vector_of_iterator<pair_type>::end(),
212
csr_seq_rep<T>::operator*= (const T& lambda)
214
iterator ia = begin();
215
for (data_iterator p = ia[0], last_p = ia[nrow()]; p != last_p; p++) {
216
(*p).second *= lambda;
182
220
// ----------------------------------------------------------------------------
183
221
// expression c=a+b and c=a-b with a temporary c=*this
184
222
// ----------------------------------------------------------------------------
248
286
set_pattern_dimension (std::max(a.pattern_dimension(), b.pattern_dimension()));
250
288
// ----------------------------------------------------------------------------
290
// ----------------------------------------------------------------------------
292
\vfill \pagebreak \mbox{} \vfill \begin{algorithm}[h]
293
\caption{{\tt sort}: sort rows by increasing column order}
295
\INPUT {the matrix in CSR format}
296
ia(0:nrow), ja(0:nnz-1), a(0:nnz-1)
298
\OUTPUT {the sorted CSR matrix}
299
iao(0:nrow), jao(0:nnzl-1), ao(0:nnzl-1)
302
{\em first: reset iao} \\
303
\FORTO {i := 0} {nrow}
307
{\em second: compute lengths from pointers} \\
308
\FORTO {i := 0} {nrow-1}
309
\FORTO {p := ia(i)} {ia(i+1)-1}
314
{\em third: compute pointers from lengths} \\
315
\FORTO {i := 0} {nrow-1}
319
{\em fourth: copy values} \\
320
\FORTO {i := 0} {nrow-1}
321
\FORTO {p := ia(i)} {ia(i+1)-1}
330
{\em fiveth: reshift pointers} \\
331
\FORTOSTEP {i := nrow-1} {0} {-1}
336
\end{algorithmic} \end{algorithm}
337
\vfill \pagebreak \mbox{} \vfill
340
// NOTE: transposed matrix has always rows sorted by increasing column indexes
341
// even if original matrix has not
344
csr_seq_rep<T>::build_transpose (csr_seq_rep<T>& b) const
346
b.resize (col_ownership(), row_ownership(), nnz());
348
// first pass: set ib(*) to ib(0)
349
iterator ib = b.begin();
350
for (size_type j = 0, m = b.nrow(); j < m; j++) {
353
// second pass: compute lengths of row(i) of a^T in ib(i+1)-ib(0)
354
const_iterator ia = begin();
355
for (size_type i = 0, n = nrow(); i < n; i++) {
356
for (const_data_iterator p = ia[i], last_p = ia[i+1]; p != last_p; p++) {
357
size_type j = (*p).first;
361
// third pass: compute pointers from lengths
362
for (size_type j = 0, m = b.nrow(); j < m; j++) {
363
ib [j+1] += (ib[j]-ib[0]);
365
// fourth pass: store values
366
data_iterator q0 = ib[0];
367
for (size_type i = 0, n = nrow(); i < n; i++) {
368
for (const_data_iterator p = ia[i], last_p = ia[i+1]; p != last_p; p++) {
369
size_type j = (*p).first;
370
data_iterator q = ib[j];
372
(*q).second = (*p).second;
376
// fiveth: shift pointers
377
for (long int j = b.nrow()-1; j >= 0; j--) {
382
// ----------------------------------------------------------------------------
251
383
// instanciation in library
252
384
// ----------------------------------------------------------------------------
253
385
template class csr_seq_rep<Float>;