#include <CompressedRowSparseMatrixGeneric.h>
Classes | |
struct | IndexedBlock |
class | Range |
Public Attributes | |
Index | nBlockRow |
Size. More... | |
Index | nBlockCol |
Mathematical size of the matrix, in blocks. More... | |
VecIndex | rowIndex |
Compressed sparse data structure. More... | |
VecIndex | rowBegin |
column indices of non-empty blocks in each row. The column indices of the non-empty block within the i-th non-empty row are all the colsIndex[j], j in [rowBegin[i],rowBegin[i+1]) More... | |
VecIndex | colsIndex |
column indices of all the non-empty blocks, sorted by increasing row index and column index More... | |
VecBlock | colsValue |
values of the non-empty blocks, in the same order as in colsIndex More... | |
VecFlag | touchedBlock |
boolean vector, i-th value is true if block has been touched since last compression. More... | |
VecIndexedBlock | btemp |
Additional storage to make block insertion more efficient. More... | |
bool | skipCompressZero |
VecIndex | oldRowIndex |
Temporary vectors used during compression. More... | |
VecIndex | oldRowBegin |
VecIndex | oldColsIndex |
VecBlock | oldColsValue |
Static Public Attributes | |
static constexpr sofa::Index | NL = traits::NL |
Number of rows of a block. More... | |
static constexpr sofa::Index | NC = traits::NC |
Number of columns of a block. More... | |
static constexpr Index | s_invalidIndex = std::is_signed_v<Index> ? std::numeric_limits<Index>::lowest() : std::numeric_limits<Index>::max() |
Static Public Attributes inherited from sofa::linearalgebra::CRSDefaultPolicy | |
static constexpr bool | IsAlwaysSquare = false |
Set to true if this matrix is always square (must be true for symmetric) More... | |
static constexpr bool | IsAlwaysSymmetric = false |
Set to true if this matrix is always symmetric (IsAlwaysSquare should be true) More... | |
static constexpr bool | AutoSize = false |
Set to true if the size of the matrix should be automatically increased when new blocks are added. More... | |
static constexpr bool | AutoCompress = true |
Set to true if the matrix should be automatically compressed (easier to use, but might cause issues in multithreading) More... | |
static constexpr bool | CompressZeros = true |
Set to true if the blocks that are all zeros should be removed from the matrix when compressing (expensive) More... | |
static constexpr bool | ClearByZeros = true |
Set to true if clear methods will put all concerned value to zero instead of clearing vectors (CompressZeros should be true) More... | |
static constexpr bool | OrderedInsertion = false |
Set to true if insertion in matrix are in most case at last line index or last col index. More... | |
static constexpr bool | StoreLowerTriangularBlock = true |
Set to false to disable storage of blocks on the lower triangular part (IsAlwaysSymmetric must be true) More... | |
static constexpr int | matrixType = 0 |
Do not change this value, has to be overrided for all derivated class. More... | |
Public Member Functions | |
CompressedRowSparseMatrixGeneric () | |
CompressedRowSparseMatrixGeneric (Index nbBlockRow, Index nbBlockCol) | |
virtual | ~CompressedRowSparseMatrixGeneric ()=default |
Index | rowBSize () const |
Index | colBSize () const |
const VecIndex & | getRowIndex () const |
const VecIndex & | getRowBegin () const |
Range | getRowRange (Index id) const |
Returns the range of indices from the column indices corresponding to the id-th row. More... | |
const VecIndex & | getColsIndex () const |
const VecBlock & | getColsValue () const |
virtual void | resizeBlock (Index nbBRow, Index nbBCol) |
void | resizeBloc (Index nbBRow, Index nbBCol) |
void | compress () |
void | swap (Matrix &m) |
void | fullRows () |
Make sure all rows have an entry even if they are empty. More... | |
void | shiftIndices (Index base) |
const Block & | block (Index i, Index j) const |
Get block method. More... | |
const Block & | bloc (Index i, Index j) const |
Block * | wblock (Index i, Index j, bool create=false) |
Write block method. More... | |
Block * | wbloc (Index i, Index j, bool create=false) |
Block * | wblock (Index i, Index j, Index &rowId, Index &colId, bool create=false) |
Write block method when rowId and colId are known, this is an optimized wblock specification. More... | |
const Block & | getBlock (Index i, Index j) const |
const BlockTranspose | getSymBlock (Index i, Index j) const |
void | setBlock (Index i, Index j, const Block &v) |
void | addBlock (Index i, Index j, const Block &v) |
void | setBlock (Index i, Index j, Index &rowId, Index &colId, const Block &v) |
void | addBlock (Index i, Index j, Index &rowId, Index &colId, const Block &v) |
Block * | getWBlock (Index i, Index j, bool create=false) |
void | clearRowBlock (Index i) |
Clear row block method. Clear all col of this line. More... | |
void | clearColBlock (Index j) |
Clear col block method. Clear this col in all row of matrix. More... | |
std::size_t | countEmptyBlocks () const |
template<typename = typename std::enable_if< Policy::IsAlwaysSquare>> | |
void | clearRowColBlock (Index i) |
Clear both row i and column i in a square matrix. More... | |
void | clear () |
Completely clear the matrix. More... | |
bool | check_matrix () |
std::ostream & | write (std::ostream &os) const |
std::istream & | read (std::istream &is) |
BlockMatrixWriter operators | |
void | add (unsigned int bi, unsigned int bj, const Block &b) |
void | add (unsigned int bi, unsigned int bj, int &rowId, int &colId, const Block &b) |
void | addDBlock (unsigned int bi, unsigned int bj, const DBlock &b) |
void | addDValue (unsigned int bi, unsigned int bj, const Real b) |
void | addDValue (unsigned int bi, unsigned int bj, int &rowId, int &colId, const Real b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSquare>> | |
void | addDiag (unsigned int bi, const Block &b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSquare>> | |
void | addDiag (unsigned int bi, int &rowId, int &colId, const Block &b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSquare>> | |
void | addDiagDBlock (unsigned int bi, const DBlock &b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSquare>> | |
void | addDiagDValue (unsigned int bi, const Real b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSquare>> | |
void | addDiagDValue (unsigned int bi, int &rowId, int &colId, const Real b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSymmetric>> | |
void | addSym (unsigned int bi, unsigned int bj, const Block &b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSymmetric>> | |
void | addSym (unsigned int bi, unsigned int bj, int &rowId, int &colId, int &rowIdT, int &colIdT, const Block &b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSymmetric>> | |
void | addSymDBlock (unsigned int bi, unsigned int bj, const DBlock &b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSymmetric>> | |
void | addSymDValue (unsigned int bi, unsigned int bj, const Real b) |
template<typename = typename std::enable_if< Policy::IsAlwaysSymmetric>> | |
void | addSymDValue (unsigned int bi, unsigned int bj, int &rowId, int &colId, int &rowIdT, int &colIdT, Real b) |
Static Public Member Functions | |
static bool | sortedFind (const VecIndex &v, Range in, Index val, Index &result) |
static bool | sortedFind (const VecIndex &v, Index val, Index &result) |
static const char * | Name () |
static bool | check_matrix (Index nzmax, Index m, Index n, Index *a_p, Index *a_i, Block *a_x) |
Protected Member Functions | |
bool | registerNewCol (Index &colId, TBlock &bvalue) |
Add a new col into matrix. More... | |
std::pair< Index, Index > | registerBtempLine (typename VecIndexedBlock::const_iterator &itbtemp) |
Add a complete new line from btemp into matrix. More... | |
void | fullyCompressBtemp () |
Clear matrix and just add btemp array. More... | |
Block * | insertBtemp (const Index i, const Index j) |
Method to easy insert new block into btemp. More... | |
template<typename = typename std::enable_if< Policy::AutoSize>> | |
Index | getMaxColIndex () |
Method to easy have the max colIndex. Could only be used if AutoSize policy is activated. More... | |
void | deleteRow (Index rowId) |
Method to easy delete row given position in rowIndex. More... | |
void | compressBtemp () |
Clear matrix and compute new triplet's arrays by combining old ones and btemp(VecIndexedBlock) array. More... | |
void | compressCSR () |
template<typename TVec > | |
void | writeVector (const TVec &vec, std::ostream &os) |
template<typename TVec > | |
void | readVector (TVec &vec, std::istream &in) |
Matrix operators | |
static auto | blockMultTranspose (const TBlock &blockA, const TBlock &blockB) |
template<typename TBlock2 , typename TPolicy2 > | |
void | transposeFullRows (CompressedRowSparseMatrixGeneric< TBlock2, TPolicy2 > &res) const |
Transpose the matrix into res, works only for 3 array variant ("full rows") matrices, ie which can be expressed using the rowBegin, colsIndex and colsValue arrays solely. More... | |
template<typename RB , typename RP , typename MB , typename MP > | |
void | mul (CompressedRowSparseMatrixGeneric< RB, RP > &res, const CompressedRowSparseMatrixGeneric< MB, MP > &m) const |
template<typename RB , typename RP , typename MB , typename MP > | |
void | mulTranspose (CompressedRowSparseMatrixGeneric< RB, RP > &res, const CompressedRowSparseMatrixGeneric< MB, MP > &m) const |
VecIndexedBlock sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::btemp |
Additional storage to make block insertion more efficient.
unsorted blocks and their indices
VecIndex sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::colsIndex |
column indices of all the non-empty blocks, sorted by increasing row index and column index
VecBlock sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::colsValue |
values of the non-empty blocks, in the same order as in colsIndex
Index sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::nBlockCol |
Mathematical size of the matrix, in blocks.
Index sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::nBlockRow |
Size.
|
staticconstexpr |
Number of columns of a block.
|
staticconstexpr |
Number of rows of a block.
VecIndex sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::oldColsIndex |
VecBlock sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::oldColsValue |
VecIndex sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::oldRowBegin |
VecIndex sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::oldRowIndex |
Temporary vectors used during compression.
VecIndex sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::rowBegin |
column indices of non-empty blocks in each row. The column indices of the non-empty block within the i-th non-empty row are all the colsIndex[j], j in [rowBegin[i],rowBegin[i+1])
VecIndex sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::rowIndex |
Compressed sparse data structure.
indices of non-empty block rows
|
staticconstexpr |
bool sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::skipCompressZero |
When true, only compressBtemp if needed This is to avoid compressCRS costly method when no change into matrix size occurs.
VecFlag sofa::linearalgebra::CompressedRowSparseMatrixGeneric< TBlock, TPolicy >::touchedBlock |
boolean vector, i-th value is true if block has been touched since last compression.
|
inline |
|
inline |
|
virtualdefault |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Get block method.
Line | index i and column index j |
|
inlinestatic |
|
inline |
|
inlinestatic |
|
inline |
Completely clear the matrix.
|
inline |
Clear col block method. Clear this col in all row of matrix.
j | : Col index considering size of matrix in block. |
|
inline |
Clear row block method. Clear all col of this line.
i | : Line index considering size of matrix in block. |
|
inline |
Clear both row i and column i in a square matrix.
i | : Row and Col index considering size of matrix in block. |
|
inline |
|
inline |
|
inlineprotected |
Clear matrix and compute new triplet's arrays by combining old ones and btemp(VecIndexedBlock) array.
|
inlineprotected |
|
inline |
|
inlineprotected |
Method to easy delete row given position in rowIndex.
RowId | position on line in rowIndex |
|
inline |
Make sure all rows have an entry even if they are empty.
|
inlineprotected |
Clear matrix and just add btemp array.
|
inline |
|
inline |
|
inline |
|
inlineprotected |
Method to easy have the max colIndex. Could only be used if AutoSize policy is activated.
|
inline |
|
inline |
|
inline |
Returns the range of indices from the column indices corresponding to the id-th row.
|
inline |
|
inline |
|
inlineprotected |
Method to easy insert new block into btemp.
Line | index i and column index j |
|
inline |
Compute res = this * m
|
inline |
Compute res = this.transpose * m
|
inlinestatic |
|
inline |
|
inlineprotected |
|
inlineprotected |
Add a complete new line from btemp into matrix.
itbtemp | : Reference to actual status of iterator on btemp |
|
inlineprotected |
Add a new col into matrix.
colId | : Index of column |
bvalue | : Block value to add |
|
inline |
|
inlinevirtual |
|
inline |
|
inline |
|
inline |
|
inline |
Add the given base to all indices. Use 1 to convert do Fortran 1-based notation. Note that the matrix will no longer be valid from the point of view of C/C++ codes. You need to call again with -1 as base to undo it.
|
inlinestatic |
|
inlinestatic |
|
inline |
|
inline |
Transpose the matrix into res, works only for 3 array variant ("full rows") matrices, ie which can be expressed using the rowBegin, colsIndex and colsValue arrays solely.
|
inline |
|
inline |
Write block method.
Line | index i and column index j |
create,boolean | to decide if wblock could add new value into not existing line/column |
|
inline |
Write block method when rowId and colId are known, this is an optimized wblock specification.
Line | index i and column index j |
rowId | : Index of value i into rowIndex internal vector |
colId | : Index of value j into colIndex internal vector |
create,boolean | to decide if wblock could add new value into not existing line/column |
|
inline |
|
inlineprotected |