11#ifndef EIGEN_SPARSEUTIL_H
12#define EIGEN_SPARSEUTIL_H
15#include "./InternalHeaderCheck.h"
20#define EIGEN_DBG_SPARSE(X)
22#define EIGEN_DBG_SPARSE(X) X
25#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \
26 template <typename OtherDerived> \
27 EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SparseMatrixBase<OtherDerived>& other) { \
28 return Base::operator Op(other.derived()); \
30 EIGEN_STRONG_INLINE Derived& operator Op(const Derived & other) { return Base::operator Op(other); }
32#define EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \
33 template <typename Other> \
34 EIGEN_STRONG_INLINE Derived& operator Op(const Other & scalar) { \
35 return Base::operator Op(scalar); \
38#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATORS(Derived) EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =)
40#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)
42const int CoherentAccessPattern = 0x1;
43const int InnerRandomAccessPattern = 0x2 | CoherentAccessPattern;
44const int OuterRandomAccessPattern = 0x4 | CoherentAccessPattern;
45const int RandomAccessPattern = 0x8 | OuterRandomAccessPattern | InnerRandomAccessPattern;
47template <
typename Scalar_,
int Flags_ = 0,
typename StorageIndex_ =
int>
49template <
typename Scalar_,
int Flags_ = 0,
typename StorageIndex_ =
int>
52template <
typename MatrixType,
unsigned int UpLo>
54template <
typename MatrixType>
57template <
typename MatrixType,
int UpLo>
58class SparseSymmetricPermutationProduct;
69template <
typename Derived>
70struct has_compressed_access : bool_constant<(int(traits<Derived>::Flags) & CompressedAccessBit) != 0> {};
72template <
typename T,
int Rows,
int Cols,
int Flags>
76struct eval<T, Sparse> : sparse_eval<T, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime, traits<T>::Flags> {
79template <
typename T,
int Cols,
int Flags>
80struct sparse_eval<T, 1, Cols, Flags> {
81 using Scalar_ =
typename traits<T>::Scalar;
82 using StorageIndex_ =
typename traits<T>::StorageIndex;
85 using type = SparseVector<Scalar_, RowMajor, StorageIndex_>;
88template <
typename T,
int Rows,
int Flags>
89struct sparse_eval<T, Rows, 1, Flags> {
90 using Scalar_ =
typename traits<T>::Scalar;
91 using StorageIndex_ =
typename traits<T>::StorageIndex;
94 using type = SparseVector<Scalar_, ColMajor, StorageIndex_>;
98template <
typename T,
int Rows,
int Cols,
int Flags>
100 using Scalar_ =
typename traits<T>::Scalar;
101 using StorageIndex_ =
typename traits<T>::StorageIndex;
105 using type = SparseMatrix<Scalar_, Options_, StorageIndex_>;
108template <
typename T,
int Flags>
109struct sparse_eval<T, 1, 1, Flags> {
110 using Scalar_ =
typename traits<T>::Scalar;
113 using type = Matrix<Scalar_, 1, 1>;
117struct plain_matrix_type<T, Sparse> {
118 using Scalar_ =
typename traits<T>::Scalar;
119 using StorageIndex_ =
typename traits<T>::StorageIndex;
123 using type = SparseMatrix<Scalar_, Options_, StorageIndex_>;
127struct plain_object_eval<T, Sparse>
128 : sparse_eval<T, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime, evaluator<T>::Flags> {};
130template <
typename Decomposition,
typename RhsType>
131struct solve_traits<Decomposition, RhsType, Sparse> {
132 using PlainObject =
typename sparse_eval<RhsType, RhsType::RowsAtCompileTime, RhsType::ColsAtCompileTime,
133 traits<RhsType>::Flags>::type;
136template <
typename Derived>
137struct generic_xpr_base<Derived, MatrixXpr, Sparse> {
138 using type = SparseMatrixBase<Derived>;
141struct SparseTriangularShape {
142 static std::string debugName() {
return "SparseTriangularShape"; }
144struct SparseSelfAdjointShape {
145 static std::string debugName() {
return "SparseSelfAdjointShape"; }
149struct glue_shapes<SparseShape, SelfAdjointShape> {
150 using type = SparseSelfAdjointShape;
153struct glue_shapes<SparseShape, TriangularShape> {
154 using type = SparseTriangularShape;
158struct LowerBoundIndex {
159 LowerBoundIndex() =
default;
160 LowerBoundIndex(Index val,
bool ok) : value(val), found(ok) {}
175template <typename Scalar, typename StorageIndex = typename SparseMatrix<Scalar>::StorageIndex>
180 Triplet(
const StorageIndex& i,
const StorageIndex& j,
const Scalar& v = Scalar(0)) : m_row(i), m_col(j), m_value(v) {}
183 const StorageIndex&
row()
const {
return m_row; }
186 const StorageIndex&
col()
const {
return m_col; }
189 const Scalar&
value()
const {
return m_value; }
192 StorageIndex m_row = 0;
193 StorageIndex m_col = 0;
194 Scalar m_value = Scalar(0);
A versatile sparse matrix representation.
Definition SparseMatrix.h:122
Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
Definition SparseSelfAdjointView.h:53
a sparse vector class
Definition SparseVector.h:63
Expression of a dense or sparse matrix with zero or too small values removed.
Definition SparseView.h:46
const StorageIndex & col() const
Definition SparseUtil.h:186
const Scalar & value() const
Definition SparseUtil.h:189
const StorageIndex & row() const
Definition SparseUtil.h:183
@ ColMajor
Definition Constants.h:319
@ RowMajor
Definition Constants.h:321
constexpr unsigned int RowMajorBit
Definition Constants.h:71