10#ifndef EIGEN_SPARSE_BLOCK_H
11#define EIGEN_SPARSE_BLOCK_H
16template<
typename XprType,
int BlockRows,
int BlockCols>
25 enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
32 : m_matrix(xpr), m_outerStart(
convert_index(i)), m_outerSize(OuterSize)
36 : m_matrix(xpr), m_outerStart(
convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(
convert_index(IsRowMajor ? blockRows : blockCols))
45 EvaluatorType matEval(m_matrix);
47 Index end = m_outerStart + m_outerSize.value();
48 for(
Index j=m_outerStart; j<
end; ++j)
49 for(
typename EvaluatorType::InnerIterator it(matEval, j); it; ++it)
56 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(); }
95template<
typename SparseMatrixType,
int BlockRows,
int BlockCols>
119 template<
typename OtherDerived>
123 _NestedMatrixType& matrix =
m_matrix;
132 Index nnz = tmp.nonZeros();
139 ?
Index(matrix.data().allocatedSize()) + block_size
142 Index tmp_start = tmp.outerIndexPtr()[0];
144 bool update_trailing_pointers =
false;
148 typename SparseMatrixType::Storage newdata(
m_matrix.data().allocatedSize() - block_size + nnz);
153 internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, newdata.valuePtr() + start);
154 internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz, newdata.indexPtr() + start);
159 newdata.resize(
m_matrix.outerIndexPtr()[
m_matrix.outerSize()] - block_size + nnz);
161 matrix.data().swap(newdata);
163 update_trailing_pointers =
true;
167 if(
m_matrix.isCompressed() && nnz!=block_size)
170 matrix.data().resize(start + nnz + tail_size);
175 update_trailing_pointers =
true;
178 internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, matrix.valuePtr() + start);
179 internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz, matrix.innerIndexPtr() + start);
194 StorageIndex nnz_k = internal::convert_index<StorageIndex>(tmp.innerVector(k).nonZeros());
202 if(update_trailing_pointers)
204 StorageIndex offset = internal::convert_index<StorageIndex>(nnz - block_size);
207 matrix.outerIndexPtr()[k] += offset;
225 {
return m_matrix.innerIndexPtr(); }
227 {
return m_matrix.innerIndexPtr(); }
286template<
typename _Scalar,
int _Options,
typename _StorageIndex,
int BlockRows,
int BlockCols>
299 :
Base(xpr, startRow, startCol, blockRows, blockCols)
302 using Base::operator=;
305template<
typename _Scalar,
int _Options,
typename _StorageIndex,
int BlockRows,
int BlockCols>
318 :
Base(xpr, startRow, startCol, blockRows, blockCols)
321 using Base::operator=;
332template<
typename XprType,
int BlockRows,
int BlockCols,
bool InnerPanel>
349 m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ?
convert_index(i) : 0),
350 m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ?
convert_index(i) : 0),
351 m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
352 m_blockCols(BlockCols==1 ? 1 : xpr.cols())
361 inline Index rows()
const {
return m_blockRows.value(); }
362 inline Index cols()
const {
return m_blockCols.value(); }
366 return m_matrix.coeffRef(
row + m_startRow.value(),
col + m_startCol.value());
371 return m_matrix.coeff(
row + m_startRow.value(),
col + m_startCol.value());
376 return m_matrix.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 :
index),
377 m_startCol.value() + (RowsAtCompileTime == 1 ?
index : 0));
382 return m_matrix.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 :
index),
383 m_startCol.value() + (RowsAtCompileTime == 1 ?
index : 0));
419template<
typename ArgType,
int BlockRows,
int BlockCols,
bool InnerPanel>
421 :
public evaluator_base<Block<ArgType,BlockRows,BlockCols,InnerPanel> >
423 class InnerVectorInnerIterator;
424 class OuterVectorInnerIterator;
431 IsRowMajor = XprType::IsRowMajor,
433 OuterVector = (BlockCols==1 && ArgType::IsRowMajor)
436 (BlockRows==1 && !ArgType::IsRowMajor),
439 Flags = XprType::Flags
445 : m_argImpl(op.nestedExpression()), m_block(op)
449 const Index nnz = m_block.nonZeros();
453 const Index nested_sz = m_block.nestedExpression().size();
454 return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz;
466template<
typename ArgType,
int BlockRows,
int BlockCols,
bool InnerPanel>
473 enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
479 :
EvalIterator(aEval.m_argImpl, outer + (XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
480 m_block(aEval.m_block),
481 m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows())
483 while( (EvalIterator::operator
bool()) && (EvalIterator::index() < (XprIsRowMajor ? m_block.startCol() : m_block.startRow())) )
487 inline StorageIndex index()
const {
return EvalIterator::index() - convert_index<StorageIndex>(XprIsRowMajor ? m_block.startCol() : m_block.startRow()); }
488 inline Index outer()
const {
return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol()); }
492 inline operator bool()
const {
return EvalIterator::operator bool() && EvalIterator::index() < m_end; }
495template<
typename ArgType,
int BlockRows,
int BlockCols,
bool InnerPanel>
499 enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
502 const Index m_innerIndex;
509 m_outerPos( (XprIsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow()) ),
510 m_innerIndex(XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
511 m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows()),
512 m_it(m_eval.m_argImpl, m_outerPos)
517 while(m_it && m_it.index() < m_innerIndex) ++m_it;
518 if((!m_it) || (m_it.index()!=m_innerIndex))
522 inline StorageIndex index()
const {
return convert_index<StorageIndex>(m_outerPos - (XprIsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow())); }
533 while(++m_outerPos<m_end)
536 m_it.~EvalIterator();
537 ::new (&m_it)
EvalIterator(m_eval.m_argImpl, m_outerPos);
539 while(m_it && m_it.index() < m_innerIndex) ++m_it;
540 if(m_it && m_it.index()==m_innerIndex)
break;
545 inline operator bool()
const {
return m_outerPos < m_end; }
548template<
typename _Scalar,
int _Options,
typename _StorageIndex,
int BlockRows,
int BlockCols>
550 :
evaluator<SparseCompressedBase<Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >
557template<
typename _Scalar,
int _Options,
typename _StorageIndex,
int BlockRows,
int BlockCols>
559 :
evaluator<SparseCompressedBase<Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ColXpr col(Index i)
This is the const version of col().
Definition: BlockMethods.h:1097
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE RowXpr row(Index i)
This is the const version of row(). */.
Definition: BlockMethods.h:1118
#define eigen_internal_assert(x)
Definition: Macros.h:1053
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:1086
#define eigen_assert(x)
Definition: Macros.h:1047
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
Definition: SparseUtil.h:43
#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE)
Definition: StaticAssert.h:142
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
Definition: StaticAssert.h:127
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:105
SparseMatrix< _Scalar, _Options, _StorageIndex > SparseMatrixType
Definition: SparseBlock.h:292
BlockImpl(SparseMatrixType &xpr, Index i)
Definition: SparseBlock.h:294
_StorageIndex StorageIndex
Definition: SparseBlock.h:291
internal::sparse_matrix_block_impl< SparseMatrixType, BlockRows, BlockCols > Base
Definition: SparseBlock.h:293
BlockImpl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:298
const Scalar coeff(Index index) const
Definition: SparseBlock.h:380
internal::ref_selector< XprType >::non_const_type m_matrix
Definition: SparseBlock.h:399
Index startRow() const
Definition: SparseBlock.h:388
Index blockCols() const
Definition: SparseBlock.h:391
internal::remove_all< typenameXprType::Nested >::type _MatrixTypeNested
Definition: SparseBlock.h:343
const internal::variable_if_dynamic< Index, XprType::ColsAtCompileTime==1 ? 0 :Dynamic > m_startCol
Definition: SparseBlock.h:401
BlockImpl(XprType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Dynamic-size constructor.
Definition: SparseBlock.h:357
Index startCol() const
Definition: SparseBlock.h:389
Index cols() const
Definition: SparseBlock.h:362
const internal::variable_if_dynamic< Index, RowsAtCompileTime > m_blockRows
Definition: SparseBlock.h:402
const internal::variable_if_dynamic< Index, ColsAtCompileTime > m_blockCols
Definition: SparseBlock.h:403
const Scalar coeff(Index row, Index col) const
Definition: SparseBlock.h:369
XprType & nestedExpression()
Definition: SparseBlock.h:387
Index blockRows() const
Definition: SparseBlock.h:390
BlockImpl & operator=(const T &)
Definition: SparseBlock.h:409
const XprType & nestedExpression() const
Definition: SparseBlock.h:386
Scalar & coeffRef(Index index)
Definition: SparseBlock.h:374
Scalar & coeffRef(Index row, Index col)
Definition: SparseBlock.h:364
const internal::variable_if_dynamic< Index, XprType::RowsAtCompileTime==1 ? 0 :Dynamic > m_startRow
Definition: SparseBlock.h:400
Index rows() const
Definition: SparseBlock.h:361
XprType & nestedExpression()
Definition: SparseBlock.h:65
BlockImpl & operator=(const T &)
Definition: SparseBlock.h:81
Index m_outerStart
Definition: SparseBlock.h:74
Index startCol() const
Definition: SparseBlock.h:67
EIGEN_STRONG_INLINE Index rows() const
Definition: SparseBlock.h:39
const internal::variable_if_dynamic< Index, OuterSize > m_outerSize
Definition: SparseBlock.h:75
const Scalar coeff(Index row, Index col) const
Definition: SparseBlock.h:54
internal::ref_selector< XprType >::non_const_type m_matrix
Definition: SparseBlock.h:73
EIGEN_STRONG_INLINE Index cols() const
Definition: SparseBlock.h:40
BlockImpl(XprType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:35
Index blockCols() const
Definition: SparseBlock.h:69
const XprType & nestedExpression() const
Definition: SparseBlock.h:64
SparseMatrixBase< BlockType > Base
Definition: SparseBlock.h:26
Index blockRows() const
Definition: SparseBlock.h:68
Index nonZeros() const
Definition: SparseBlock.h:42
Index startRow() const
Definition: SparseBlock.h:66
const Scalar coeff(Index index) const
Definition: SparseBlock.h:59
internal::sparse_matrix_block_impl< SparseMatrixType, BlockRows, BlockCols > Base
Definition: SparseBlock.h:312
BlockImpl(SparseMatrixType &xpr, Index i)
Definition: SparseBlock.h:313
BlockImpl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:317
_StorageIndex StorageIndex
Definition: SparseBlock.h:310
const SparseMatrix< _Scalar, _Options, _StorageIndex > SparseMatrixType
Definition: SparseBlock.h:311
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:283
Common base class for sparse [compressed]-{row|column}-storage format.
Definition: SparseCompressedBase.h:38
Index nonZeros() const
Definition: SparseCompressedBase.h:56
Base class of any sparse matrices or sparse expressions.
Definition: SparseMatrixBase.h:28
internal::traits< Block< SparseMatrixType, BlockRows, BlockCols, true > >::StorageIndex StorageIndex
The integer type used to store indices within a SparseMatrix.
Definition: SparseMatrixBase.h:43
const Derived & derived() const
Definition: SparseMatrixBase.h:143
internal::traits< Block< XprType, BlockRows, BlockCols, true > >::Scalar Scalar
Definition: SparseMatrixBase.h:31
@ IsVectorAtCompileTime
This is set to true if either the number of rows or the number of columns is known at compile-time to...
Definition: SparseMatrixBase.h:84
static StorageIndex convert_index(const Index idx)
Definition: SparseMatrixBase.h:389
A versatible sparse matrix representation.
Definition: SparseMatrix.h:98
Definition: XprHelper.h:110
Definition: SparseBlock.h:98
Scalar & coeffRef(Index row, Index col)
Definition: SparseBlock.h:241
StorageIndex * innerNonZeroPtr()
Definition: SparseBlock.h:236
BlockType & operator=(const SparseMatrixBase< OtherDerived > &other)
Definition: SparseBlock.h:120
Scalar * valuePtr()
Definition: SparseBlock.h:221
Index blockRows() const
Definition: SparseBlock.h:273
internal::ref_selector< SparseMatrixType >::non_const_type m_matrix
Definition: SparseBlock.h:278
BlockType & operator=(const BlockType &other)
Definition: SparseBlock.h:214
const SparseMatrixType & nestedExpression() const
Definition: SparseBlock.h:269
const Scalar coeff(Index index) const
Definition: SparseBlock.h:251
@ IsRowMajor
Definition: SparseBlock.h:104
SparseMatrixType & nestedExpression()
Definition: SparseBlock.h:270
sparse_matrix_block_impl(SparseMatrixType &xpr, Index i)
Definition: SparseBlock.h:111
const Scalar * valuePtr() const
Definition: SparseBlock.h:219
const StorageIndex * outerIndexPtr() const
Definition: SparseBlock.h:229
const internal::variable_if_dynamic< Index, OuterSize > m_outerSize
Definition: SparseBlock.h:280
EIGEN_STRONG_INLINE Index cols() const
Definition: SparseBlock.h:267
@ OuterSize
Definition: SparseBlock.h:108
Base::IndexVector IndexVector
Definition: SparseBlock.h:107
StorageIndex * outerIndexPtr()
Definition: SparseBlock.h:231
Index startCol() const
Definition: SparseBlock.h:272
const Scalar & lastCoeff() const
Definition: SparseBlock.h:256
const Scalar coeff(Index row, Index col) const
Definition: SparseBlock.h:246
Index blockCols() const
Definition: SparseBlock.h:274
const StorageIndex * innerNonZeroPtr() const
Definition: SparseBlock.h:234
StorageIndex * innerIndexPtr()
Definition: SparseBlock.h:226
Index startRow() const
Definition: SparseBlock.h:271
Index m_outerStart
Definition: SparseBlock.h:279
EIGEN_STRONG_INLINE Index rows() const
Definition: SparseBlock.h:266
sparse_matrix_block_impl(SparseMatrixType &xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
Definition: SparseBlock.h:115
const StorageIndex * innerIndexPtr() const
Definition: SparseBlock.h:224
bool isCompressed() const
Definition: SparseBlock.h:239
Index outer() const
Definition: SparseBlock.h:523
Index col() const
Definition: SparseBlock.h:525
Index row() const
Definition: SparseBlock.h:524
Scalar & valueRef()
Definition: SparseBlock.h:528
OuterVectorInnerIterator & operator++()
Definition: SparseBlock.h:530
StorageIndex index() const
Definition: SparseBlock.h:522
Scalar value() const
Definition: SparseBlock.h:527
EIGEN_STRONG_INLINE OuterVectorInnerIterator(const unary_evaluator &aEval, Index outer)
Definition: SparseBlock.h:507
Index row() const
Definition: SparseBlock.h:489
Index outer() const
Definition: SparseBlock.h:488
EIGEN_STRONG_INLINE InnerVectorInnerIterator(const unary_evaluator &aEval, Index outer)
Definition: SparseBlock.h:478
StorageIndex index() const
Definition: SparseBlock.h:487
Index col() const
Definition: SparseBlock.h:490
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value()
Definition: XprHelper.h:135
type
Definition: core.h:575
EIGEN_DEVICE_FUNC IndexDest convert_index(const IndexSrc &idx)
Definition: XprHelper.h:31
EIGEN_DEVICE_FUNC void smart_copy(const T *start, const T *end, T *target)
Definition: Memory.h:515
void smart_memmove(const T *start, const T *end, T *target)
Definition: Memory.h:539
static EIGEN_DEPRECATED const end_t end
Definition: IndexedViewHelper.h:181
Namespace containing all symbols from the Eigen library.
Definition: Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time,...
Definition: Constants.h:22
Definition: Eigen_Colamd.h:50
unit_t< Units, T, NonLinearScale > & operator++(unit_t< Units, T, NonLinearScale > &u) noexcept
Definition: base.h:2346
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:39
The type used to identify a general sparse storage.
Definition: Constants.h:510
Definition: Constants.h:545
Definition: CoreEvaluators.h:111
T type
Definition: Meta.h:126
Definition: ForwardDeclarations.h:17
internal::conditional< OuterVector, OuterVectorInnerIterator, InnerVectorInnerIterator >::type InnerIterator
Definition: SparseBlock.h:442
evaluator< ArgType >::InnerIterator EvalIterator
Definition: SparseBlock.h:460
unary_evaluator(const XprType &op)
Definition: SparseBlock.h:444
evaluator< ArgType > m_argImpl
Definition: SparseBlock.h:462
const XprType & m_block
Definition: SparseBlock.h:463
Index nonZerosEstimate() const
Definition: SparseBlock.h:448
XprType::StorageIndex StorageIndex
Definition: SparseBlock.h:427
XprType::Scalar Scalar
Definition: SparseBlock.h:428
Block< ArgType, BlockRows, BlockCols, InnerPanel > XprType
Definition: SparseBlock.h:426
unary_evaluator(const XprType &xpr)
Definition: SparseBlock.h:554
evaluator< SparseCompressedBase< XprType > > Base
Definition: SparseBlock.h:553
Block< SparseMatrix< _Scalar, _Options, _StorageIndex >, BlockRows, BlockCols, true > XprType
Definition: SparseBlock.h:552
unary_evaluator(const XprType &xpr)
Definition: SparseBlock.h:563
Block< const SparseMatrix< _Scalar, _Options, _StorageIndex >, BlockRows, BlockCols, true > XprType
Definition: SparseBlock.h:561
evaluator< SparseCompressedBase< XprType > > Base
Definition: SparseBlock.h:562
Definition: CoreEvaluators.h:65