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