1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud (at) inria.fr> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #ifndef EIGEN_SPARSEUTIL_H 11 #define EIGEN_SPARSEUTIL_H 12 13 namespace Eigen { 14 15 #ifdef NDEBUG 16 #define EIGEN_DBG_SPARSE(X) 17 #else 18 #define EIGEN_DBG_SPARSE(X) X 19 #endif 20 21 #define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \ 22 template<typename OtherDerived> \ 23 EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SparseMatrixBase<OtherDerived>& other) \ 24 { \ 25 return Base::operator Op(other.derived()); \ 26 } \ 27 EIGEN_STRONG_INLINE Derived& operator Op(const Derived& other) \ 28 { \ 29 return Base::operator Op(other); \ 30 } 31 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 { \ 36 return Base::operator Op(scalar); \ 37 } 38 39 #define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATORS(Derived) \ 40 EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \ 41 EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \ 42 EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \ 43 EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \ 44 EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=) 45 46 #define _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, BaseClass) \ 47 typedef BaseClass Base; \ 48 typedef typename Eigen::internal::traits<Derived >::Scalar Scalar; \ 49 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \ 50 typedef typename Eigen::internal::nested<Derived >::type Nested; \ 51 typedef typename Eigen::internal::traits<Derived >::StorageKind StorageKind; \ 52 typedef typename Eigen::internal::traits<Derived >::Index Index; \ 53 enum { RowsAtCompileTime = Eigen::internal::traits<Derived >::RowsAtCompileTime, \ 54 ColsAtCompileTime = Eigen::internal::traits<Derived >::ColsAtCompileTime, \ 55 Flags = Eigen::internal::traits<Derived >::Flags, \ 56 CoeffReadCost = Eigen::internal::traits<Derived >::CoeffReadCost, \ 57 SizeAtCompileTime = Base::SizeAtCompileTime, \ 58 IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; \ 59 using Base::derived; \ 60 using Base::const_cast_derived; 61 62 #define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) \ 63 _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, Eigen::SparseMatrixBase<Derived >) 64 65 const int CoherentAccessPattern = 0x1; 66 const int InnerRandomAccessPattern = 0x2 | CoherentAccessPattern; 67 const int OuterRandomAccessPattern = 0x4 | CoherentAccessPattern; 68 const int RandomAccessPattern = 0x8 | OuterRandomAccessPattern | InnerRandomAccessPattern; 69 70 template<typename Derived> class SparseMatrixBase; 71 template<typename _Scalar, int _Flags = 0, typename _Index = int> class SparseMatrix; 72 template<typename _Scalar, int _Flags = 0, typename _Index = int> class DynamicSparseMatrix; 73 template<typename _Scalar, int _Flags = 0, typename _Index = int> class SparseVector; 74 template<typename _Scalar, int _Flags = 0, typename _Index = int> class MappedSparseMatrix; 75 76 template<typename MatrixType, int Mode> class SparseTriangularView; 77 template<typename MatrixType, unsigned int UpLo> class SparseSelfAdjointView; 78 template<typename Lhs, typename Rhs> class SparseDiagonalProduct; 79 template<typename MatrixType> class SparseView; 80 81 template<typename Lhs, typename Rhs> class SparseSparseProduct; 82 template<typename Lhs, typename Rhs> class SparseTimeDenseProduct; 83 template<typename Lhs, typename Rhs> class DenseTimeSparseProduct; 84 template<typename Lhs, typename Rhs, bool Transpose> class SparseDenseOuterProduct; 85 86 template<typename Lhs, typename Rhs> struct SparseSparseProductReturnType; 87 template<typename Lhs, typename Rhs, 88 int InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(internal::traits<Lhs>::ColsAtCompileTime,internal::traits<Rhs>::RowsAtCompileTime)> struct DenseSparseProductReturnType; 89 template<typename Lhs, typename Rhs, 90 int InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(internal::traits<Lhs>::ColsAtCompileTime,internal::traits<Rhs>::RowsAtCompileTime)> struct SparseDenseProductReturnType; 91 template<typename MatrixType,int UpLo> class SparseSymmetricPermutationProduct; 92 93 namespace internal { 94 95 template<typename T,int Rows,int Cols> struct sparse_eval; 96 97 template<typename T> struct eval<T,Sparse> 98 : public sparse_eval<T, traits<T>::RowsAtCompileTime,traits<T>::ColsAtCompileTime> 99 {}; 100 101 template<typename T,int Cols> struct sparse_eval<T,1,Cols> { 102 typedef typename traits<T>::Scalar _Scalar; 103 typedef typename traits<T>::Index _Index; 104 public: 105 typedef SparseVector<_Scalar, RowMajor, _Index> type; 106 }; 107 108 template<typename T,int Rows> struct sparse_eval<T,Rows,1> { 109 typedef typename traits<T>::Scalar _Scalar; 110 typedef typename traits<T>::Index _Index; 111 public: 112 typedef SparseVector<_Scalar, ColMajor, _Index> type; 113 }; 114 115 template<typename T,int Rows,int Cols> struct sparse_eval { 116 typedef typename traits<T>::Scalar _Scalar; 117 typedef typename traits<T>::Index _Index; 118 enum { _Options = ((traits<T>::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor }; 119 public: 120 typedef SparseMatrix<_Scalar, _Options, _Index> type; 121 }; 122 123 template<typename T> struct sparse_eval<T,1,1> { 124 typedef typename traits<T>::Scalar _Scalar; 125 public: 126 typedef Matrix<_Scalar, 1, 1> type; 127 }; 128 129 template<typename T> struct plain_matrix_type<T,Sparse> 130 { 131 typedef typename traits<T>::Scalar _Scalar; 132 typedef typename traits<T>::Index _Index; 133 enum { _Options = ((traits<T>::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor }; 134 public: 135 typedef SparseMatrix<_Scalar, _Options, _Index> type; 136 }; 137 138 } // end namespace internal 139 140 /** \ingroup SparseCore_Module 141 * 142 * \class Triplet 143 * 144 * \brief A small structure to hold a non zero as a triplet (i,j,value). 145 * 146 * \sa SparseMatrix::setFromTriplets() 147 */ 148 template<typename Scalar, typename Index=typename SparseMatrix<Scalar>::Index > 149 class Triplet 150 { 151 public: 152 Triplet() : m_row(0), m_col(0), m_value(0) {} 153 154 Triplet(const Index& i, const Index& j, const Scalar& v = Scalar(0)) 155 : m_row(i), m_col(j), m_value(v) 156 {} 157 158 /** \returns the row index of the element */ 159 const Index& row() const { return m_row; } 160 161 /** \returns the column index of the element */ 162 const Index& col() const { return m_col; } 163 164 /** \returns the value of the element */ 165 const Scalar& value() const { return m_value; } 166 protected: 167 Index m_row, m_col; 168 Scalar m_value; 169 }; 170 171 } // end namespace Eigen 172 173 #endif // EIGEN_SPARSEUTIL_H 174