csr(4rheolef)
π csr β the distributed compressed sparse matrix, bestie π
okay so first things first: this is the manual page for csr, and yeah it's sitting in section 4rheolef of the rheolef docs (rheolef-7.2, if you're keeping score π). Strap in, it's giving β¨linear algebraβ¨ and honestly? she ate.
β¨ NAME β¨
csr β distributed compressed sparse matrix (rheolef-7.2) π
πΈ DESCRIPTION πΈ
So a sparse matrix gets compressed by rows. That's the whole vibe. And when you're out here in a distributed environment, the distribution follows the row distributor(4) β like, it just does what the row distributor says, no questions asked π«Ά
π ALGEBRA π
This class does the standard linear algebra, no cap. Here's the tea β:
- Wanna add or subtract two matrices? You literally just write
a+banda-b. That's it, that's the move β¨ - Multiply a matrix by a scalar?
lambda*a, slay π - Matrix-matrix product? Also just
a*b. Iconic behaviour honestly π - Matrix-vector product is
a*x, wherexis a vector from thevec(4)class π
And by extension (iykyk) π¦:
trans(a)gives you back the transpose- Multiplying a vector by the transpose matrix? That's
a.trans_mult(x), and here's the best part β it does NOT require you to actually build the transpose matrix. Not me saving you all that memory ππ
π IMPLEMENTATION π
ngl this whole documentation was generated straight from the file linalg/lib/csr.h π
The csr class is a template class, and both the floating type and the memory model are parameters. Below is the interface for the sequential memory model β the distributed case shows up with a similar interface, fr fr π«Ά
template<class T>
class csr<T,sequential> : public smart_pointer<csr_rep<T,sequential> > {
public:
// typedefs:
typedef csr_rep<T,sequential> rep;
typedef smart_pointer<rep> base;
typedef typename rep::memory_type memory_type;
typedef typename rep::size_type size_type;
typedef typename rep::element_type element_type;
typedef typename rep::iterator iterator;
typedef typename rep::const_iterator const_iterator;
typedef typename rep::data_iterator data_iterator;
typedef typename rep::const_data_iterator const_data_iterator;
// allocators/deallocators:
csr() : base(new_macro(rep())) {}
template<class A>
explicit csr(const asr<T,sequential,A>& a) : base(new_macro(rep(a))) {}
void resize (size_type loc_nrow1 = 0, size_type loc_ncol1 = 0, size_type loc_nnz1 = 0)
{ base::data().resize(loc_nrow1, loc_ncol1, loc_nnz1); }
void resize (const distributor& row_ownership, const distributor& col_ownership, size_type nnz1 = 0)
{ base::data().resize(row_ownership, col_ownership, nnz1); }
// allocators from initializer list
csr (const std::initializer_list<details::csr_concat_value<T,sequential> >& init_list);
csr (const std::initializer_list<details::csr_concat_line<T,sequential> >& init_list);
// accessors:
// global sizes
const distributor& row_ownership() const { return base::data().row_ownership(); }
const distributor& col_ownership() const { return base::data().col_ownership(); }
size_type dis_nrow () const { return row_ownership().dis_size(); }
size_type dis_ncol () const { return col_ownership().dis_size(); }
size_type dis_nnz () const { return base::data().nnz(); }
size_type dis_ext_nnz () const { return 0; }
bool is_symmetric() const { return base::data().is_symmetric(); }
void set_symmetry (bool is_symm) const { base::data().set_symmetry(is_symm); }
void set_symmetry_by_check (const T& tol = std::numeric_limits<T>::epsilon()) const
{ base::data().set_symmetry_by_check(); }
bool is_definite_positive() const { return base::data().is_definite_positive(); }
void set_definite_positive (bool is_defpos) const { base::data().set_definite_positive(is_defpos); }
size_type pattern_dimension() const { return base::data().pattern_dimension(); }
void set_pattern_dimension(size_type dim) const { base::data().set_pattern_dimension(dim); }
T max_abs () const { return base::data().max_abs(); }
// local sizes
size_type nrow () const { return base::data().nrow(); }
size_type ncol () const { return base::data().ncol(); }
size_type nnz () const { return base::data().nnz(); }
// range on local memory
size_type row_first_index () const { return base::data().row_first_index(); }
size_type row_last_index () const { return base::data().row_last_index(); }
size_type col_first_index () const { return base::data().col_first_index(); }
size_type col_last_index () const { return base::data().col_last_index(); }
const_iterator begin() const { return base::data().begin(); }
const_iterator end() const { return base::data().end(); }
iterator begin_nonconst() { return base::data().begin(); }
iterator end_nonconst() { return base::data().end(); }
// accessors, only for distributed (for interface compatibility)
size_type ext_nnz() const { return 0; }
const_iterator ext_begin() const { return const_iterator(); }
const_iterator ext_end() const { return const_iterator(); }
iterator ext_begin_nonconst() { return iterator(); }
iterator ext_end_nonconst() { return iterator(); }
size_type jext2dis_j (size_type jext) const { return 0; }
int constraint_process_rank() const;
// algebra:
// y := a*x
void mult (const vec<element_type,sequential>& x, vec<element_type,sequential>& y) const {
base::data().mult (x,y);
}
vec<element_type,sequential> operator* (const vec<element_type,sequential>& x) const {
vec<element_type,sequential> y (row_ownership(), element_type());
mult (x, y);
return y;
}
void trans_mult (const vec<element_type,sequential>& x, vec<element_type,sequential>& y) const {
base::data().trans_mult (x,y);
}
vec<element_type,sequential> trans_mult (const vec<element_type,sequential>& x) const {
vec<element_type,sequential> y (col_ownership(), element_type());
trans_mult (x, y);
return y;
}
// a+b, a-b, a*b
csr<T,sequential> operator+ (const csr<T,sequential>& b) const;
csr<T,sequential> operator- (const csr<T,sequential>& b) const;
csr<T,sequential> operator* (const csr<T,sequential>& b) const;
// lambda*a
csr<T,sequential>& operator*= (const T& lambda) {
base::data().operator*= (lambda);
return *this;
}
// output:
void dump (const std::string& name) const { base::data().dump(name); }
};
π AUTHOR π
Pierre Saramito β <Pierre.Saramito@imag.fr> βοΈ (yes, the whole thing, and he's the moment π)
π COPYRIGHT π
Copyright (C) 2000-2018 Pierre Saramito <Pierre.Saramito@imag.fr>
GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. π like genuinely, zero warranty bestie, do not come for anyone
and that's the whole page!! π¦ thanks for reading my little brain dump, mwah π
rheolef Β· Version 7.2 Β· csr(4rheolef) β ok bye ily, go multiply some matrices πβ¨
π¦ where this page comes from
- debian trixie: librheolef-dev 7.2-4 Β· GPL-3.0-or-later
- ubuntu noble: librheolef-dev 7.2-3build5 Β· GPL-3.0-or-later
- ubuntu questing: librheolef-dev 7.2-4build1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms