10 #ifndef EIGEN_SPARSE_BLOCK_H
11 #define EIGEN_SPARSE_BLOCK_H
19 template <
typename XprType,
int BlockRows,
int BlockCols>
29 enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
40 m_outerStart(
convert_index(IsRowMajor ? startRow : startCol)),
41 m_outerSize(
convert_index(IsRowMajor ? blockRows : blockCols)) {}
48 EvaluatorType matEval(m_matrix);
50 Index end = m_outerStart + m_outerSize.value();
52 for (
typename EvaluatorType::InnerIterator it(matEval,
j); it; ++it) ++nnz;
57 return m_matrix.coeff(
row + (IsRowMajor ? m_outerStart : 0),
col + (IsRowMajor ? 0 : m_outerStart));
61 return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
68 Index blockRows()
const {
return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
69 Index blockCols()
const {
return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
92 template <
typename SparseMatrixType,
int BlockRows,
int BlockCols>
116 template <
typename OtherDerived>
137 Index tmp_start =
tmp.outerIndexPtr()[0];
139 bool update_trailing_pointers =
false;
140 if (nnz > free_size) {
142 typename SparseMatrixType::Storage newdata(
m_matrix.data().allocatedSize() - block_size + nnz);
149 newdata.indexPtr() +
start);
152 newdata.valuePtr() +
start + nnz);
154 newdata.indexPtr() +
start + nnz);
156 newdata.resize(
m_matrix.outerIndexPtr()[
m_matrix.outerSize()] - block_size + nnz);
158 matrix.data().swap(newdata);
160 update_trailing_pointers =
true;
162 if (
m_matrix.isCompressed() && nnz != block_size) {
171 update_trailing_pointers =
true;
186 StorageIndex nnz_k = internal::convert_index<StorageIndex>(
tmp.innerVector(
k).nonZeros());
193 if (update_trailing_pointers) {
194 StorageIndex offset = internal::convert_index<StorageIndex>(nnz - block_size);
196 matrix.outerIndexPtr()[
k] += offset;
260 template <
typename Scalar_,
int Options_,
typename StorageIndex_,
int BlockRows,
int BlockCols>
270 :
Base(xpr, startRow, startCol, blockRows, blockCols) {}
272 using Base::operator=;
275 template <
typename Scalar_,
int Options_,
typename StorageIndex_,
int BlockRows,
int BlockCols>
286 :
Base(xpr, startRow, startCol, blockRows, blockCols) {}
288 using Base::operator=;
291 template <
typename Derived>
293 template <
typename Derived>
302 template <
typename XprType,
int BlockRows,
int BlockCols,
bool InnerPanel>
321 m_blockRows(BlockRows == 1 ? 1 : xpr.
rows()),
322 m_blockCols(BlockCols == 1 ? 1 : xpr.
cols()) {}
333 inline Index rows()
const {
return m_blockRows.value(); }
334 inline Index cols()
const {
return m_blockCols.value(); }
337 return m_matrix.coeffRef(
row + m_startRow.value(),
col + m_startCol.value());
341 return m_matrix.coeff(
row + m_startRow.value(),
col + m_startCol.value());
345 return m_matrix.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
346 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
350 return m_matrix.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
351 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
377 template <
typename T>
386 template <
typename ArgType,
int BlockRows,
int BlockCols,
bool InnerPanel>
388 :
public evaluator_base<Block<ArgType, BlockRows, BlockCols, InnerPanel> > {
389 class InnerVectorInnerIterator;
390 class OuterVectorInnerIterator;
398 IsRowMajor = XprType::IsRowMajor,
399 OuterVector = (BlockCols == 1 && ArgType::IsRowMajor) || (BlockRows == 1 && !ArgType::IsRowMajor),
401 Flags = XprType::Flags
404 typedef std::conditional_t<OuterVector, OuterVectorInnerIterator, InnerVectorInnerIterator>
InnerIterator;
409 const Index nnz = m_block.nonZeros();
413 const Index nested_sz = m_block.nestedExpression().size();
414 return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz;
426 template <
typename ArgType,
int BlockRows,
int BlockCols,
bool InnerPanel>
432 enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
438 :
EvalIterator(aEval.m_argImpl, outer + (XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
439 m_block(aEval.m_block),
440 m_end(XprIsRowMajor ? aEval.m_block.startCol() + aEval.m_block.blockCols()
441 : aEval.m_block.startRow() + aEval.m_block.blockRows()) {
442 while ((EvalIterator::operator
bool()) &&
443 (EvalIterator::index() < (XprIsRowMajor ? m_block.startCol() : m_block.startRow())))
448 return EvalIterator::index() - convert_index<StorageIndex>(XprIsRowMajor ? m_block.startCol() : m_block.startRow());
451 return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol());
456 inline operator bool()
const {
return EvalIterator::operator
bool() && EvalIterator::index() < m_end; }
459 template <
typename ArgType,
int BlockRows,
int BlockCols,
bool InnerPanel>
462 enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
472 m_outerPos((XprIsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow())),
473 m_innerIndex(XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
474 m_end(XprIsRowMajor ? aEval.m_block.startCol() + aEval.m_block.blockCols()
475 : aEval.m_block.startRow() + aEval.m_block.blockRows()),
476 m_it(m_eval.m_argImpl, m_outerPos) {
480 while (m_it && m_it.index() < m_innerIndex) ++m_it;
481 if ((!m_it) || (m_it.index() != m_innerIndex)) ++(*this);
485 return convert_index<StorageIndex>(m_outerPos -
486 (XprIsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow()));
489 inline Index row()
const {
return XprIsRowMajor ? 0 : index(); }
490 inline Index col()
const {
return XprIsRowMajor ? index() : 0; }
497 while (++m_outerPos < m_end) {
502 while (m_it && m_it.index() < m_innerIndex) ++m_it;
503 if (m_it && m_it.index() == m_innerIndex)
break;
508 inline operator bool()
const {
return m_outerPos < m_end; }
511 template <
typename Scalar_,
int Options_,
typename StorageIndex_,
int BlockRows,
int BlockCols>
514 SparseCompressedBase<Block<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> > > {
520 template <
typename Scalar_,
int Options_,
typename StorageIndex_,
int BlockRows,
int BlockCols>
524 Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> > > {
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define eigen_internal_assert(x)
Definition: Macros.h:916
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:966
#define eigen_assert(x)
Definition: Macros.h:910
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
Definition: SparseUtil.h:39
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE)
Definition: StaticAssert.h:36
float * p
Definition: Tutorial_Map_using.cpp:9
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
SCALAR Scalar
Definition: bench_gemm.cpp:45
internal::sparse_matrix_block_impl< SparseMatrixType, BlockRows, BlockCols > Base
Definition: SparseBlock.h:266
StorageIndex_ StorageIndex
Definition: SparseBlock.h:264
BlockImpl(SparseMatrixType &xpr, Index i)
Definition: SparseBlock.h:267
SparseMatrix< Scalar_, Options_, StorageIndex_ > SparseMatrixType
Definition: SparseBlock.h:265
BlockImpl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:269
XprType & nestedExpression()
Definition: SparseBlock.h:355
Scalar & coeffRef(Index index)
Definition: SparseBlock.h:344
const Scalar coeff(Index index) const
Definition: SparseBlock.h:349
internal::ref_selector< XprType >::non_const_type m_matrix
Definition: SparseBlock.h:368
Index startRow() const
Definition: SparseBlock.h:356
Index blockCols() const
Definition: SparseBlock.h:359
const internal::variable_if_dynamic< Index, XprType::ColsAtCompileTime==1 ? 0 :Dynamic > m_startCol
Definition: SparseBlock.h:370
BlockImpl & operator=(const T &)
Definition: SparseBlock.h:378
BlockImpl(XprType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:326
Index startCol() const
Definition: SparseBlock.h:357
Index cols() const
Definition: SparseBlock.h:334
internal::remove_all_t< typename XprType::Nested > MatrixTypeNested_
Definition: SparseBlock.h:313
const internal::variable_if_dynamic< Index, RowsAtCompileTime > m_blockRows
Definition: SparseBlock.h:371
const internal::variable_if_dynamic< Index, ColsAtCompileTime > m_blockCols
Definition: SparseBlock.h:372
Block< XprType, BlockRows, BlockCols, InnerPanel > BlockType
Definition: SparseBlock.h:305
const Scalar coeff(Index row, Index col) const
Definition: SparseBlock.h:340
Index blockRows() const
Definition: SparseBlock.h:358
Scalar & coeffRef(Index row, Index col)
Definition: SparseBlock.h:336
SparseMatrixBase< BlockType > Base
Definition: SparseBlock.h:306
const XprType & nestedExpression() const
Definition: SparseBlock.h:354
const internal::variable_if_dynamic< Index, XprType::RowsAtCompileTime==1 ? 0 :Dynamic > m_startRow
Definition: SparseBlock.h:369
Index rows() const
Definition: SparseBlock.h:333
const XprType & nestedExpression() const
Definition: SparseBlock.h:64
Block< XprType, BlockRows, BlockCols, true > BlockType
Definition: SparseBlock.h:23
Index m_outerStart
Definition: SparseBlock.h:73
Index startCol() const
Definition: SparseBlock.h:67
EIGEN_STRONG_INLINE Index rows() const
Definition: SparseBlock.h:43
const internal::variable_if_dynamic< Index, OuterSize > m_outerSize
Definition: SparseBlock.h:74
const Scalar coeff(Index row, Index col) const
Definition: SparseBlock.h:56
internal::ref_selector< XprType >::non_const_type m_matrix
Definition: SparseBlock.h:72
EIGEN_STRONG_INLINE Index cols() const
Definition: SparseBlock.h:44
BlockImpl(XprType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:38
XprType & nestedExpression()
Definition: SparseBlock.h:65
Index blockCols() const
Definition: SparseBlock.h:69
SparseMatrixBase< BlockType > Base
Definition: SparseBlock.h:30
Index blockRows() const
Definition: SparseBlock.h:68
BlockImpl & operator=(const T &)
Definition: SparseBlock.h:80
Index nonZeros() const
Definition: SparseBlock.h:46
Index startRow() const
Definition: SparseBlock.h:66
internal::remove_all_t< typename XprType::Nested > MatrixTypeNested_
Definition: SparseBlock.h:22
const Scalar coeff(Index index) const
Definition: SparseBlock.h:60
BlockImpl(SparseMatrixType &xpr, Index i)
Definition: SparseBlock.h:283
internal::sparse_matrix_block_impl< SparseMatrixType, BlockRows, BlockCols > Base
Definition: SparseBlock.h:282
BlockImpl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:285
StorageIndex_ StorageIndex
Definition: SparseBlock.h:280
BlockImpl(const SparseMatrixBase< Derived > &xpr)
BlockImpl(const SparseMatrixBase< Derived > &xpr, Index i)
const SparseMatrix< Scalar_, Options_, StorageIndex_ > SparseMatrixType
Definition: SparseBlock.h:281
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:110
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Definition: CwiseBinaryOp.h:79
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:264
Common base class for sparse [compressed]-{row|column}-storage format.
Definition: SparseCompressedBase.h:43
Index nonZeros() const
Definition: SparseCompressedBase.h:64
Base::IndexVector IndexVector
Definition: SparseCompressedBase.h:51
Base class of any sparse matrices or sparse expressions.
Definition: SparseMatrixBase.h:30
internal::traits< Block< SparseMatrixType, BlockRows, BlockCols, true > >::StorageIndex StorageIndex
Definition: SparseMatrixBase.h:44
internal::traits< Block< XprType, BlockRows, BlockCols, true > >::Scalar Scalar
Definition: SparseMatrixBase.h:32
const Derived & derived() const
Definition: SparseMatrixBase.h:144
@ IsVectorAtCompileTime
Definition: SparseMatrixBase.h:81
static StorageIndex convert_index(const Index idx)
Definition: SparseMatrixBase.h:391
A versatible sparse matrix representation.
Definition: SparseMatrix.h:121
Definition: XprHelper.h:134
Definition: SparseBlock.h:93
@ OuterSize
Definition: SparseBlock.h:104
const StorageIndex * innerIndexPtr() const
Definition: SparseBlock.h:208
BlockType & operator=(const SparseMatrixBase< OtherDerived > &other)
Definition: SparseBlock.h:117
StorageIndex * outerIndexPtr()
Definition: SparseBlock.h:212
const StorageIndex * outerIndexPtr() const
Definition: SparseBlock.h:211
SparseCompressedBase< Block< SparseMatrixType, BlockRows, BlockCols, true > > Base
Definition: SparseBlock.h:96
Index blockRows() const
Definition: SparseBlock.h:249
internal::ref_selector< SparseMatrixType >::non_const_type m_matrix
Definition: SparseBlock.h:253
StorageIndex * innerNonZeroPtr()
Definition: SparseBlock.h:217
@ IsRowMajor
Definition: SparseBlock.h:100
const Scalar coeff(Index index) const
Definition: SparseBlock.h:229
SparseMatrixType & nestedExpression()
Definition: SparseBlock.h:246
Block< SparseMatrixType, BlockRows, BlockCols, true > BlockType
Definition: SparseBlock.h:95
const SparseMatrixType & nestedExpression() const
Definition: SparseBlock.h:245
sparse_matrix_block_impl(SparseMatrixType &xpr, Index i)
Definition: SparseBlock.h:107
Scalar & coeffRef(Index row, Index col)
Definition: SparseBlock.h:221
internal::remove_all_t< typename SparseMatrixType::Nested > MatrixTypeNested_
Definition: SparseBlock.h:94
const internal::variable_if_dynamic< Index, OuterSize > m_outerSize
Definition: SparseBlock.h:255
EIGEN_STRONG_INLINE Index cols() const
Definition: SparseBlock.h:243
Base::IndexVector IndexVector
Definition: SparseBlock.h:103
const Scalar & lastCoeff() const
Definition: SparseBlock.h:233
Index startCol() const
Definition: SparseBlock.h:248
BlockType & operator=(const BlockType &other)
Definition: SparseBlock.h:203
const Scalar coeff(Index row, Index col) const
Definition: SparseBlock.h:225
Index blockCols() const
Definition: SparseBlock.h:250
StorageIndex * innerIndexPtr()
Definition: SparseBlock.h:209
const Scalar * valuePtr() const
Definition: SparseBlock.h:205
Scalar * valuePtr()
Definition: SparseBlock.h:206
Index startRow() const
Definition: SparseBlock.h:247
Index m_outerStart
Definition: SparseBlock.h:254
const StorageIndex * innerNonZeroPtr() const
Definition: SparseBlock.h:214
EIGEN_STRONG_INLINE Index rows() const
Definition: SparseBlock.h:242
sparse_matrix_block_impl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:110
bool isCompressed() const
Definition: SparseBlock.h:219
OuterVectorInnerIterator & operator++()
Definition: SparseBlock.h:495
const Index m_innerIndex
Definition: SparseBlock.h:465
const unary_evaluator & m_eval
Definition: SparseBlock.h:463
Index m_outerPos
Definition: SparseBlock.h:464
Index outer() const
Definition: SparseBlock.h:488
Index col() const
Definition: SparseBlock.h:490
Index m_end
Definition: SparseBlock.h:466
Index row() const
Definition: SparseBlock.h:489
EvalIterator m_it
Definition: SparseBlock.h:467
StorageIndex index() const
Definition: SparseBlock.h:484
Scalar & valueRef()
Definition: SparseBlock.h:493
Scalar value() const
Definition: SparseBlock.h:492
EIGEN_STRONG_INLINE OuterVectorInnerIterator(const unary_evaluator &aEval, Index outer)
Definition: SparseBlock.h:470
Index row() const
Definition: SparseBlock.h:453
Index outer() const
Definition: SparseBlock.h:450
EIGEN_STRONG_INLINE InnerVectorInnerIterator(const unary_evaluator &aEval, Index outer)
Definition: SparseBlock.h:437
StorageIndex index() const
Definition: SparseBlock.h:447
Index m_end
Definition: SparseBlock.h:434
const XprType & m_block
Definition: SparseBlock.h:433
Index col() const
Definition: SparseBlock.h:454
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value()
Definition: XprHelper.h:161
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
char char char int int * k
Definition: level2_impl.h:374
char char * op
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator++(bfloat16 &a)
Definition: BFloat16.h:307
EIGEN_DEVICE_FUNC T * construct_at(T *p, Args &&... args)
Definition: Memory.h:1321
EIGEN_DEVICE_FUNC void destroy_at(T *p)
Definition: Memory.h:1335
EIGEN_DEVICE_FUNC IndexDest convert_index(const IndexSrc &idx)
Definition: XprHelper.h:63
typename remove_all< T >::type remove_all_t
Definition: Meta.h:142
EIGEN_DEVICE_FUNC void smart_copy(const T *start, const T *end, T *target)
Definition: Memory.h:569
void smart_memmove(const T *start, const T *end, T *target)
Definition: Memory.h:594
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
Extend namespace for flags.
Definition: fsi_chan_precond_driver.cc:56
Definition: Eigen_Colamd.h:49
void start(const unsigned &i)
(Re-)start i-th timer
Definition: oomph_utilities.cc:243
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:43
Definition: Constants.h:522
Definition: Constants.h:580
Definition: CoreEvaluators.h:118
std::conditional_t< bool(traits< T >::Flags &NestByRefBit), T &, T > non_const_type
Definition: XprHelper.h:509
Definition: ForwardDeclarations.h:21
Block< ArgType, BlockRows, BlockCols, InnerPanel > XprType
Definition: SparseBlock.h:390
evaluator< ArgType >::InnerIterator EvalIterator
Definition: SparseBlock.h:420
unary_evaluator(const XprType &op)
Definition: SparseBlock.h:406
evaluator< ArgType > m_argImpl
Definition: SparseBlock.h:422
const XprType & m_block
Definition: SparseBlock.h:423
Index nonZerosEstimate() const
Definition: SparseBlock.h:408
std::conditional_t< OuterVector, OuterVectorInnerIterator, InnerVectorInnerIterator > InnerIterator
Definition: SparseBlock.h:404
XprType::StorageIndex StorageIndex
Definition: SparseBlock.h:394
XprType::Scalar Scalar
Definition: SparseBlock.h:395
Block< SparseMatrix< Scalar_, Options_, StorageIndex_ >, BlockRows, BlockCols, true > XprType
Definition: SparseBlock.h:515
unary_evaluator(const XprType &xpr)
Definition: SparseBlock.h:517
evaluator< SparseCompressedBase< XprType > > Base
Definition: SparseBlock.h:516
unary_evaluator(const XprType &xpr)
Definition: SparseBlock.h:527
Block< const SparseMatrix< Scalar_, Options_, StorageIndex_ >, BlockRows, BlockCols, true > XprType
Definition: SparseBlock.h:525
evaluator< SparseCompressedBase< XprType > > Base
Definition: SparseBlock.h:526
Definition: CoreEvaluators.h:82
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2