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 };
27 using Base::convert_index;
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>
135 Index block_size = end - start;
139 ?
Index(
matrix.data().allocatedSize()) + block_size
148 typename SparseMatrixType::Storage
newdata(
m_matrix.data().allocatedSize() - block_size + nnz);
167 if(
m_matrix.isCompressed() && nnz!=block_size)
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>
338 using Base::convert_index;
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())
358 : m_matrix(xpr), m_startRow(convert_index(startRow)), m_startCol(convert_index(startCol)), m_blockRows(convert_index(blockRows)), m_blockCols(convert_index(blockCols))
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)
439 Flags = XprType::Flags
445 : m_argImpl(op.nestedExpression()), m_block(op)
449 const Index nnz = m_block.nonZeros();
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 };
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())) )
484 EvalIterator::operator++();
488 inline Index outer()
const {
return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol()); }
489 inline Index row()
const {
return EvalIterator::row() - m_block.startRow(); }
490 inline Index col()
const {
return EvalIterator::col() - 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))
524 inline Index row()
const {
return XprIsRowMajor ? 0 : index(); }
525 inline Index col()
const {
return XprIsRowMajor ? index() : 0; }
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> > >
int i
Definition BiCGSTAB_step_by_step.cpp:9
#define eigen_internal_assert(x)
Definition Macros.h:1043
#define EIGEN_UNUSED_VARIABLE(var)
Definition Macros.h:1076
#define eigen_assert(x)
Definition Macros.h:1037
#define EIGEN_STRONG_INLINE
Definition Macros.h:917
#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
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:46
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
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)
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
Expression of a fixed-size or dynamic-size block.
Definition Block.h:105
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< Derived >::StorageIndex StorageIndex
Definition SparseMatrixBase.h:43
const Derived & derived() const
Definition SparseMatrixBase.h:143
@ IsVectorAtCompileTime
Definition SparseMatrixBase.h:84
internal::traits< Block< XprType, BlockRows, BlockCols, true > >::Scalar Scalar
Definition SparseMatrixBase.h:31
static StorageIndex convert_index(const Index idx)
Definition SparseMatrixBase.h:389
A versatible sparse matrix representation.
Definition SparseMatrix.h:98
Definition TensorRef.h:81
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
@ OuterSize
Definition SparseBlock.h:108
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
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
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition common.h:110
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics set mxtics default set mytics default set mx2tics default set my2tics default set xtics border mirror norotate autofreq set ytics border mirror norotate autofreq set ztics border nomirror norotate autofreq set nox2tics set noy2tics set timestamp bottom norotate offset
Definition gnuplot_common_settings.hh:64
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
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
const int Dynamic
Definition Constants.h:22
Definition BandTriangularSolver.h:13
CwiseBinaryOp< internal::scalar_sum_op< double, double >, const CpyMatrixXd, const CpyMatrixXd > XprType
Definition nestbyvalue.cpp:15
Eigen::Index Index
The interface type of indices.
Definition EigenBase.h:39
Definition Constants.h:510
Definition Constants.h:545
Definition CoreEvaluators.h:111
Definition CoreEvaluators.h:91
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
std::ptrdiff_t j
Definition tut_arithmetic_redux_minmax.cpp:2