10#ifndef EIGEN_SPARSE_COMPRESSED_BASE_H
11#define EIGEN_SPARSE_COMPRESSED_BASE_H
15template<
typename Derived>
class SparseCompressedBase;
19template<
typename Derived>
25template<
typename Derived>
32 using Base::operator=;
33 using Base::IsRowMajor;
49 return derived().nonZeros();
55 return innerNonZeros().sum();
61 inline const Scalar*
valuePtr()
const {
return derived().valuePtr(); }
65 inline Scalar*
valuePtr() {
return derived().valuePtr(); }
70 inline const StorageIndex*
innerIndexPtr()
const {
return derived().innerIndexPtr(); }
74 inline StorageIndex*
innerIndexPtr() {
return derived().innerIndexPtr(); }
80 inline const StorageIndex*
outerIndexPtr()
const {
return derived().outerIndexPtr(); }
85 inline StorageIndex*
outerIndexPtr() {
return derived().outerIndexPtr(); }
90 inline const StorageIndex*
innerNonZeroPtr()
const {
return derived().innerNonZeroPtr(); }
106template<
typename Derived>
111 : m_values(
mat.valuePtr()), m_indices(
mat.innerIndexPtr()), m_outer(outer)
113 if(Derived::IsVectorAtCompileTime &&
mat.outerIndexPtr()==0)
116 m_end =
mat.nonZeros();
120 m_id =
mat.outerIndexPtr()[outer];
121 if(
mat.isCompressed())
122 m_end =
mat.outerIndexPtr()[outer+1];
124 m_end = m_id +
mat.innerNonZeroPtr()[outer];
129 : m_values(
mat.valuePtr()), m_indices(
mat.innerIndexPtr()), m_outer(0), m_id(0), m_end(
mat.nonZeros())
131 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
135 : m_values(&data.value(0)), m_indices(&data.index(0)), m_outer(0), m_id(0), m_end(data.size())
137 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
142 inline const Scalar& value()
const {
return m_values[m_id]; }
143 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_values[m_id]); }
145 inline StorageIndex index()
const {
return m_indices[m_id]; }
146 inline Index outer()
const {
return m_outer.value(); }
147 inline Index row()
const {
return IsRowMajor ? m_outer.value() : index(); }
148 inline Index col()
const {
return IsRowMajor ? index() : m_outer.value(); }
150 inline operator bool()
const {
return (m_id < m_end); }
153 const Scalar* m_values;
154 const StorageIndex* m_indices;
165template<
typename Derived>
170 : m_values(
mat.valuePtr()), m_indices(
mat.innerIndexPtr()), m_outer(outer)
172 if(Derived::IsVectorAtCompileTime &&
mat.outerIndexPtr()==0)
175 m_id =
mat.nonZeros();
179 m_start.value() =
mat.outerIndexPtr()[outer];
180 if(
mat.isCompressed())
181 m_id =
mat.outerIndexPtr()[outer+1];
183 m_id = m_start.value() +
mat.innerNonZeroPtr()[outer];
188 : m_values(
mat.valuePtr()), m_indices(
mat.innerIndexPtr()), m_outer(0), m_start(0), m_id(
mat.nonZeros())
190 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
194 : m_values(&data.value(0)), m_indices(&data.index(0)), m_outer(0), m_start(0), m_id(data.size())
196 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
201 inline const Scalar& value()
const {
return m_values[m_id-1]; }
202 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_values[m_id-1]); }
204 inline StorageIndex index()
const {
return m_indices[m_id-1]; }
205 inline Index outer()
const {
return m_outer.value(); }
206 inline Index row()
const {
return IsRowMajor ? m_outer.value() : index(); }
207 inline Index col()
const {
return IsRowMajor ? index() : m_outer.value(); }
209 inline operator bool()
const {
return (m_id > m_start.value()); }
212 const Scalar* m_values;
213 const StorageIndex* m_indices;
221template<
typename Derived>
225 typedef typename Derived::Scalar Scalar;
226 typedef typename Derived::InnerIterator InnerIterator;
227 typedef typename Derived::ReverseInnerIterator ReverseInnerIterator;
231 Flags = Derived::Flags
236 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
240 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
243 inline Index nonZerosEstimate()
const {
244 return m_matrix->nonZeros();
247 operator Derived&() {
return m_matrix->const_cast_derived(); }
248 operator const Derived&()
const {
return *m_matrix; }
251 Scalar coeff(Index row, Index col)
const
252 {
return m_matrix->coeff(row,col); }
254 Scalar& coeffRef(Index row, Index col)
258 const Index outer = Derived::IsRowMajor ? row : col;
259 const Index inner = Derived::IsRowMajor ? col : row;
261 Index start = m_matrix->outerIndexPtr()[outer];
262 Index end = m_matrix->isCompressed() ? m_matrix->outerIndexPtr()[outer+1] : m_matrix->outerIndexPtr()[outer] + m_matrix->innerNonZeroPtr()[outer];
263 eigen_assert(end>start &&
"you are using a non finalized sparse matrix or written coefficient does not exist");
264 const Index p = std::lower_bound(m_matrix->innerIndexPtr()+start, m_matrix->innerIndexPtr()+end,inner)
265 - m_matrix->innerIndexPtr();
266 eigen_assert((p<end) && (m_matrix->innerIndexPtr()[p]==inner) &&
"written coefficient does not exist");
267 return m_matrix->const_cast_derived().valuePtr()[p];
270 const Derived *m_matrix;
Definition ForwardDeclarations.h:54
Pseudo expression representing a solving operation.
Definition Solve.h:63
Definition SparseCompressedBase.h:108
Definition SparseCompressedBase.h:167
Definition SparseCompressedBase.h:28
StorageIndex * innerNonZeroPtr()
Definition SparseCompressedBase.h:94
Index nonZeros() const
Definition SparseCompressedBase.h:46
const StorageIndex * innerIndexPtr() const
Definition SparseCompressedBase.h:70
StorageIndex * innerIndexPtr()
Definition SparseCompressedBase.h:74
const Scalar * valuePtr() const
Definition SparseCompressedBase.h:61
bool isCompressed() const
Definition SparseCompressedBase.h:97
const StorageIndex * outerIndexPtr() const
Definition SparseCompressedBase.h:80
Scalar * valuePtr()
Definition SparseCompressedBase.h:65
const StorageIndex * innerNonZeroPtr() const
Definition SparseCompressedBase.h:90
StorageIndex * outerIndexPtr()
Definition SparseCompressedBase.h:85
SparseCompressedBase()
Default constructor.
Definition SparseCompressedBase.h:101
Base class of any sparse matrices or sparse expressions.
Definition SparseMatrixBase.h:34
Index outerSize() const
Definition SparseMatrixBase.h:176
Definition CompressedStorage.h:23
Definition XprHelper.h:67
Holds information about the various numeric (i.e.
Definition NumTraits.h:108
Definition CoreEvaluators.h:101
Definition CoreEvaluators.h:82
Definition ForwardDeclarations.h:17