diff options
Diffstat (limited to 'Eigen/src/Sparse')
-rw-r--r-- | Eigen/src/Sparse/AmbiVector.h | 38 | ||||
-rw-r--r-- | Eigen/src/Sparse/CholmodSupport.h | 4 | ||||
-rw-r--r-- | Eigen/src/Sparse/CompressedStorage.h | 24 | ||||
-rw-r--r-- | Eigen/src/Sparse/DynamicSparseMatrix.h | 21 | ||||
-rw-r--r-- | Eigen/src/Sparse/MappedSparseMatrix.h | 24 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseBlock.h | 7 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseDiagonalProduct.h | 4 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseLDLT.h | 2 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseLLT.h | 4 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseMatrix.h | 18 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseMatrixBase.h | 2 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseProduct.h | 6 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseRedux.h | 12 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseUtil.h | 33 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseVector.h | 25 | ||||
-rw-r--r-- | Eigen/src/Sparse/SuperLUSupport.h | 4 | ||||
-rw-r--r-- | Eigen/src/Sparse/TaucsSupport.h | 4 | ||||
-rw-r--r-- | Eigen/src/Sparse/TriangularSolver.h | 6 |
18 files changed, 118 insertions, 120 deletions
diff --git a/Eigen/src/Sparse/AmbiVector.h b/Eigen/src/Sparse/AmbiVector.h index 7b18f8cc2..673cb32a5 100644 --- a/Eigen/src/Sparse/AmbiVector.h +++ b/Eigen/src/Sparse/AmbiVector.h @@ -30,12 +30,14 @@ * * See BasicSparseLLT and SparseProduct for usage examples. */ -template<typename _Scalar> class AmbiVector +template<typename _Scalar, typename _Index> +class AmbiVector { public: typedef _Scalar Scalar; + typedef _Index Index; typedef typename NumTraits<Scalar>::Real RealScalar; - typedef SparseIndex Index; + AmbiVector(Index size) : m_buffer(0), m_zero(0), m_size(0), m_allocatedSize(0), m_allocatedElements(0), m_mode(-1) { @@ -130,8 +132,8 @@ template<typename _Scalar> class AmbiVector }; /** \returns the number of non zeros in the current sub vector */ -template<typename Scalar> -SparseIndex AmbiVector<Scalar>::nonZeros() const +template<typename _Scalar,typename _Index> +_Index AmbiVector<_Scalar,_Index>::nonZeros() const { if (m_mode==IsSparse) return m_llSize; @@ -139,8 +141,8 @@ SparseIndex AmbiVector<Scalar>::nonZeros() const return m_end - m_start; } -template<typename Scalar> -void AmbiVector<Scalar>::init(double estimatedDensity) +template<typename _Scalar,typename _Index> +void AmbiVector<_Scalar,_Index>::init(double estimatedDensity) { if (estimatedDensity>0.1) init(IsDense); @@ -148,8 +150,8 @@ void AmbiVector<Scalar>::init(double estimatedDensity) init(IsSparse); } -template<typename Scalar> -void AmbiVector<Scalar>::init(int mode) +template<typename _Scalar,typename _Index> +void AmbiVector<_Scalar,_Index>::init(int mode) { m_mode = mode; if (m_mode==IsSparse) @@ -164,15 +166,15 @@ void AmbiVector<Scalar>::init(int mode) * * Don't worry, this function is extremely cheap. */ -template<typename Scalar> -void AmbiVector<Scalar>::restart() +template<typename _Scalar,typename _Index> +void AmbiVector<_Scalar,_Index>::restart() { m_llCurrent = m_llStart; } /** Set all coefficients of current subvector to zero */ -template<typename Scalar> -void AmbiVector<Scalar>::setZero() +template<typename _Scalar,typename _Index> +void AmbiVector<_Scalar,_Index>::setZero() { if (m_mode==IsDense) { @@ -187,8 +189,8 @@ void AmbiVector<Scalar>::setZero() } } -template<typename Scalar> -Scalar& AmbiVector<Scalar>::coeffRef(Index i) +template<typename _Scalar,typename _Index> +_Scalar& AmbiVector<_Scalar,_Index>::coeffRef(_Index i) { if (m_mode==IsDense) return m_buffer[i]; @@ -256,8 +258,8 @@ Scalar& AmbiVector<Scalar>::coeffRef(Index i) } } -template<typename Scalar> -Scalar& AmbiVector<Scalar>::coeff(Index i) +template<typename _Scalar,typename _Index> +_Scalar& AmbiVector<_Scalar,_Index>::coeff(_Index i) { if (m_mode==IsDense) return m_buffer[i]; @@ -284,8 +286,8 @@ Scalar& AmbiVector<Scalar>::coeff(Index i) } /** Iterator over the nonzero coefficients */ -template<typename _Scalar> -class AmbiVector<_Scalar>::Iterator +template<typename _Scalar,typename _Index> +class AmbiVector<_Scalar,_Index>::Iterator { public: typedef _Scalar Scalar; diff --git a/Eigen/src/Sparse/CholmodSupport.h b/Eigen/src/Sparse/CholmodSupport.h index 1b34492aa..a8d7a8fec 100644 --- a/Eigen/src/Sparse/CholmodSupport.h +++ b/Eigen/src/Sparse/CholmodSupport.h @@ -109,8 +109,8 @@ cholmod_dense ei_cholmod_map_eigen_to_dense(MatrixBase<Derived>& mat) return res; } -template<typename Scalar, int Flags> -MappedSparseMatrix<Scalar,Flags>::MappedSparseMatrix(cholmod_sparse& cm) +template<typename Scalar, int Flags, typename _Index> +MappedSparseMatrix<Scalar,Flags,_Index>::MappedSparseMatrix(cholmod_sparse& cm) { m_innerSize = cm.nrow; m_outerSize = cm.ncol; diff --git a/Eigen/src/Sparse/CompressedStorage.h b/Eigen/src/Sparse/CompressedStorage.h index 37d337639..73488f225 100644 --- a/Eigen/src/Sparse/CompressedStorage.h +++ b/Eigen/src/Sparse/CompressedStorage.h @@ -28,12 +28,20 @@ /** Stores a sparse set of values as a list of values and a list of indices. * */ -template<typename Scalar> +template<typename _Scalar,typename _Index> class CompressedStorage { + public: + + typedef _Scalar Scalar; + typedef _Index Index; + + protected: + typedef typename NumTraits<Scalar>::Real RealScalar; - typedef SparseIndex Index; + public: + CompressedStorage() : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0) {} @@ -118,13 +126,13 @@ class CompressedStorage res.m_allocatedSize = res.m_size = size; return res; } - + /** \returns the largest \c k such that for all \c j in [0,k) index[\c j]\<\a key */ inline Index searchLowerIndex(Index key) const { return searchLowerIndex(0, m_size, key); } - + /** \returns the largest \c k in [start,end) such that for all \c j in [start,k) index[\c j]\<\a key */ inline Index searchLowerIndex(size_t start, size_t end, Index key) const { @@ -138,7 +146,7 @@ class CompressedStorage } return static_cast<Index>(start); } - + /** \returns the stored value at index \a key * If the value does not exist, then the value \a defaultValue is returned without any insertion. */ inline Scalar at(Index key, Scalar defaultValue = Scalar(0)) const @@ -152,7 +160,7 @@ class CompressedStorage const size_t id = searchLowerIndex(0,m_size-1,key); return ((id<m_size) && (m_indices[id]==key)) ? m_values[id] : defaultValue; } - + /** Like at(), but the search is performed in the range [start,end) */ inline Scalar atInRange(size_t start, size_t end, Index key, Scalar defaultValue = Scalar(0)) const { @@ -165,7 +173,7 @@ class CompressedStorage const size_t id = searchLowerIndex(start,end-1,key); return ((id<end) && (m_indices[id]==key)) ? m_values[id] : defaultValue; } - + /** \returns a reference to the value at index \a key * If the value does not exist, then the value \a defaultValue is inserted * such that the keys are sorted. */ @@ -185,7 +193,7 @@ class CompressedStorage } return m_values[id]; } - + void prune(Scalar reference, RealScalar epsilon = NumTraits<RealScalar>::dummy_precision()) { size_t k = 0; diff --git a/Eigen/src/Sparse/DynamicSparseMatrix.h b/Eigen/src/Sparse/DynamicSparseMatrix.h index defe312b3..d0ce2b248 100644 --- a/Eigen/src/Sparse/DynamicSparseMatrix.h +++ b/Eigen/src/Sparse/DynamicSparseMatrix.h @@ -42,10 +42,11 @@ * * \see SparseMatrix */ -template<typename _Scalar, int _Flags> -struct ei_traits<DynamicSparseMatrix<_Scalar, _Flags> > +template<typename _Scalar, int _Flags, typename _Index> +struct ei_traits<DynamicSparseMatrix<_Scalar, _Flags, _Index> > { typedef _Scalar Scalar; + typedef _Index Index; typedef Sparse StorageKind; typedef MatrixXpr XprKind; enum { @@ -59,12 +60,12 @@ struct ei_traits<DynamicSparseMatrix<_Scalar, _Flags> > }; }; -template<typename _Scalar, int _Flags> +template<typename _Scalar, int _Flags, typename _Index> class DynamicSparseMatrix - : public SparseMatrixBase<DynamicSparseMatrix<_Scalar, _Flags> > + : public SparseMatrixBase<DynamicSparseMatrix<_Scalar, _Flags, _Index> > { public: - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(DynamicSparseMatrix) + EIGEN_SPARSE_PUBLIC_INTERFACE(DynamicSparseMatrix) // FIXME: why are these operator already alvailable ??? // EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(DynamicSparseMatrix, +=) // EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(DynamicSparseMatrix, -=) @@ -76,7 +77,7 @@ class DynamicSparseMatrix typedef DynamicSparseMatrix<Scalar,(Flags&~RowMajorBit)|(IsRowMajor?RowMajorBit:0)> TransposedSparseMatrix; Index m_innerSize; - std::vector<CompressedStorage<Scalar> > m_data; + std::vector<CompressedStorage<Scalar,Index> > m_data; public: @@ -86,8 +87,8 @@ class DynamicSparseMatrix inline Index outerSize() const { return static_cast<Index>(m_data.size()); } inline Index innerNonZeros(Index j) const { return m_data[j].size(); } - std::vector<CompressedStorage<Scalar> >& _data() { return m_data; } - const std::vector<CompressedStorage<Scalar> >& _data() const { return m_data; } + std::vector<CompressedStorage<Scalar,Index> >& _data() { return m_data; } + const std::vector<CompressedStorage<Scalar,Index> >& _data() const { return m_data; } /** \returns the coefficient value at given position \a row, \a col * This operation involes a log(rho*outer_size) binary search. @@ -321,8 +322,8 @@ class DynamicSparseMatrix EIGEN_DEPRECATED void endFill() {} }; -template<typename Scalar, int _Flags> -class DynamicSparseMatrix<Scalar,_Flags>::InnerIterator : public SparseVector<Scalar,_Flags>::InnerIterator +template<typename Scalar, int _Flags, typename _Index> +class DynamicSparseMatrix<Scalar,_Flags,_Index>::InnerIterator : public SparseVector<Scalar,_Flags>::InnerIterator { typedef typename SparseVector<Scalar,_Flags>::InnerIterator Base; public: diff --git a/Eigen/src/Sparse/MappedSparseMatrix.h b/Eigen/src/Sparse/MappedSparseMatrix.h index 07233ac67..99aeeb106 100644 --- a/Eigen/src/Sparse/MappedSparseMatrix.h +++ b/Eigen/src/Sparse/MappedSparseMatrix.h @@ -34,25 +34,25 @@ * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. * */ -template<typename _Scalar, int _Flags> -struct ei_traits<MappedSparseMatrix<_Scalar, _Flags> > : ei_traits<SparseMatrix<_Scalar, _Flags> > +template<typename _Scalar, int _Flags, typename _Index> +struct ei_traits<MappedSparseMatrix<_Scalar, _Flags, _Index> > : ei_traits<SparseMatrix<_Scalar, _Flags, _Index> > {}; -template<typename _Scalar, int _Flags> +template<typename _Scalar, int _Flags, typename _Index> class MappedSparseMatrix - : public SparseMatrixBase<MappedSparseMatrix<_Scalar, _Flags> > + : public SparseMatrixBase<MappedSparseMatrix<_Scalar, _Flags, _Index> > { public: - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(MappedSparseMatrix) + EIGEN_SPARSE_PUBLIC_INTERFACE(MappedSparseMatrix) protected: enum { IsRowMajor = Base::IsRowMajor }; - Index m_outerSize; - Index m_innerSize; - Index m_nnz; - Index* m_outerIndex; - Index* m_innerIndices; + Index m_outerSize; + Index m_innerSize; + Index m_nnz; + Index* m_outerIndex; + Index* m_innerIndices; Scalar* m_values; public: @@ -135,8 +135,8 @@ class MappedSparseMatrix inline ~MappedSparseMatrix() {} }; -template<typename Scalar, int _Flags> -class MappedSparseMatrix<Scalar,_Flags>::InnerIterator +template<typename Scalar, int _Flags, typename _Index> +class MappedSparseMatrix<Scalar,_Flags,_Index>::InnerIterator { public: InnerIterator(const MappedSparseMatrix& mat, Index outer) diff --git a/Eigen/src/Sparse/SparseBlock.h b/Eigen/src/Sparse/SparseBlock.h index bf8b5adc7..8e530182d 100644 --- a/Eigen/src/Sparse/SparseBlock.h +++ b/Eigen/src/Sparse/SparseBlock.h @@ -29,6 +29,7 @@ template<typename MatrixType, int Size> struct ei_traits<SparseInnerVectorSet<MatrixType, Size> > { typedef typename ei_traits<MatrixType>::Scalar Scalar; + typedef typename ei_traits<MatrixType>::Index Index; typedef typename ei_traits<MatrixType>::StorageKind StorageKind; typedef MatrixXpr XprKind; enum { @@ -50,7 +51,7 @@ class SparseInnerVectorSet : ei_no_assignment_operator, enum { IsRowMajor = ei_traits<SparseInnerVectorSet>::IsRowMajor }; - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseInnerVectorSet) + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseInnerVectorSet) class InnerIterator: public MatrixType::InnerIterator { public: @@ -111,7 +112,7 @@ class SparseInnerVectorSet<DynamicSparseMatrix<_Scalar, _Options>, Size> enum { IsRowMajor = ei_traits<SparseInnerVectorSet>::IsRowMajor }; - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseInnerVectorSet) + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseInnerVectorSet) class InnerIterator: public MatrixType::InnerIterator { public: @@ -209,7 +210,7 @@ class SparseInnerVectorSet<SparseMatrix<_Scalar, _Options>, Size> enum { IsRowMajor = ei_traits<SparseInnerVectorSet>::IsRowMajor }; - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseInnerVectorSet) + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseInnerVectorSet) class InnerIterator: public MatrixType::InnerIterator { public: diff --git a/Eigen/src/Sparse/SparseDiagonalProduct.h b/Eigen/src/Sparse/SparseDiagonalProduct.h index 70b35bc23..f5da2c269 100644 --- a/Eigen/src/Sparse/SparseDiagonalProduct.h +++ b/Eigen/src/Sparse/SparseDiagonalProduct.h @@ -43,6 +43,8 @@ struct ei_traits<SparseDiagonalProduct<Lhs, Rhs> > typedef typename ei_cleantype<Lhs>::type _Lhs; typedef typename ei_cleantype<Rhs>::type _Rhs; typedef typename _Lhs::Scalar Scalar; + typedef typename ei_promote_index_type<typename ei_traits<Lhs>::Index, + typename ei_traits<Rhs>::Index>::type Index; typedef Sparse StorageKind; typedef MatrixXpr XprKind; enum { @@ -82,7 +84,7 @@ class SparseDiagonalProduct public: - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseDiagonalProduct) + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseDiagonalProduct) typedef ei_sparse_diagonal_product_inner_iterator_selector <_LhsNested,_RhsNested,SparseDiagonalProduct,LhsMode,RhsMode> InnerIterator; diff --git a/Eigen/src/Sparse/SparseLDLT.h b/Eigen/src/Sparse/SparseLDLT.h index b6a51c6a6..ae1a96b4f 100644 --- a/Eigen/src/Sparse/SparseLDLT.h +++ b/Eigen/src/Sparse/SparseLDLT.h @@ -339,7 +339,7 @@ bool SparseLDLT<MatrixType, Backend>::solveInPlace(MatrixBase<Derived> &b) const // FIXME should be .adjoint() but it fails to compile... if (m_matrix.nonZeros()>0) // otherwise L==I - m_matrix.transpose().template triangularView<UnitUpper>().solveInPlace(b); + m_matrix.adjoint().template triangularView<UnitUpper>().solveInPlace(b); return true; } diff --git a/Eigen/src/Sparse/SparseLLT.h b/Eigen/src/Sparse/SparseLLT.h index 37c6c3f9a..4ec3ee009 100644 --- a/Eigen/src/Sparse/SparseLLT.h +++ b/Eigen/src/Sparse/SparseLLT.h @@ -132,7 +132,7 @@ void SparseLLT<MatrixType,Backend>::compute(const MatrixType& a) m_matrix.resize(size, size); // allocate a temporary vector for accumulations - AmbiVector<Scalar> tempVector(size); + AmbiVector<Scalar,Index> tempVector(size); RealScalar density = a.nonZeros()/RealScalar(size*size); // TODO estimate the number of non zeros @@ -177,7 +177,7 @@ void SparseLLT<MatrixType,Backend>::compute(const MatrixType& a) RealScalar rx = ei_sqrt(ei_real(x)); m_matrix.insert(j,j) = rx; // FIXME use insertBack Scalar y = Scalar(1)/rx; - for (typename AmbiVector<Scalar>::Iterator it(tempVector, m_precision*rx); it; ++it) + for (typename AmbiVector<Scalar,Index>::Iterator it(tempVector, m_precision*rx); it; ++it) { // FIXME use insertBack m_matrix.insert(it.index(), j) = it.value() * y; diff --git a/Eigen/src/Sparse/SparseMatrix.h b/Eigen/src/Sparse/SparseMatrix.h index 22a7d149a..e8e947eea 100644 --- a/Eigen/src/Sparse/SparseMatrix.h +++ b/Eigen/src/Sparse/SparseMatrix.h @@ -37,14 +37,16 @@ * \param _Scalar the scalar type, i.e. the type of the coefficients * \param _Options Union of bit flags controlling the storage scheme. Currently the only possibility * is RowMajor. The default is 0 which means column-major. + * \param _Index the type of the indices. Default is \c int. * * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. * */ -template<typename _Scalar, int _Options> -struct ei_traits<SparseMatrix<_Scalar, _Options> > +template<typename _Scalar, int _Options, typename _Index> +struct ei_traits<SparseMatrix<_Scalar, _Options, _Index> > { typedef _Scalar Scalar; + typedef _Index Index; typedef Sparse StorageKind; typedef MatrixXpr XprKind; enum { @@ -58,12 +60,12 @@ struct ei_traits<SparseMatrix<_Scalar, _Options> > }; }; -template<typename _Scalar, int _Options> +template<typename _Scalar, int _Options, typename _Index> class SparseMatrix - : public SparseMatrixBase<SparseMatrix<_Scalar, _Options> > + : public SparseMatrixBase<SparseMatrix<_Scalar, _Options, _Index> > { public: - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseMatrix) + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseMatrix) EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseMatrix, +=) EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseMatrix, -=) // FIXME: why are these operator already alvailable ??? @@ -80,7 +82,7 @@ class SparseMatrix Index m_outerSize; Index m_innerSize; Index* m_outerIndex; - CompressedStorage<Scalar> m_data; + CompressedStorage<Scalar,Index> m_data; public: @@ -570,8 +572,8 @@ class SparseMatrix EIGEN_DEPRECATED void endFill() { finalize(); } }; -template<typename Scalar, int _Options> -class SparseMatrix<Scalar,_Options>::InnerIterator +template<typename Scalar, int _Options, typename _Index> +class SparseMatrix<Scalar,_Options,_Index>::InnerIterator { public: InnerIterator(const SparseMatrix& mat, Index outer) diff --git a/Eigen/src/Sparse/SparseMatrixBase.h b/Eigen/src/Sparse/SparseMatrixBase.h index 6f34b5c4e..a2b527e53 100644 --- a/Eigen/src/Sparse/SparseMatrixBase.h +++ b/Eigen/src/Sparse/SparseMatrixBase.h @@ -43,7 +43,7 @@ template<typename Derived> class SparseMatrixBase : public EigenBase<Derived> typedef typename ei_traits<Derived>::Scalar Scalar; typedef typename ei_packet_traits<Scalar>::type PacketScalar; typedef typename ei_traits<Derived>::StorageKind StorageKind; - typedef typename ei_index<StorageKind>::type Index; + typedef typename ei_traits<Derived>::Index Index; typedef SparseMatrixBase StorageBaseType; diff --git a/Eigen/src/Sparse/SparseProduct.h b/Eigen/src/Sparse/SparseProduct.h index 1cb676132..2f86b2b2d 100644 --- a/Eigen/src/Sparse/SparseProduct.h +++ b/Eigen/src/Sparse/SparseProduct.h @@ -57,6 +57,8 @@ struct ei_traits<SparseProduct<LhsNested, RhsNested> > typedef typename ei_cleantype<LhsNested>::type _LhsNested; typedef typename ei_cleantype<RhsNested>::type _RhsNested; typedef typename _LhsNested::Scalar Scalar; + typedef typename ei_promote_index_type<typename ei_traits<_LhsNested>::Index, + typename ei_traits<_RhsNested>::Index>::type Index; enum { LhsCoeffReadCost = _LhsNested::CoeffReadCost, @@ -236,7 +238,7 @@ static void ei_sparse_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& r ei_assert(lhs.outerSize() == rhs.innerSize()); // allocate a temporary buffer - AmbiVector<Scalar> tempVector(rows); + AmbiVector<Scalar,Index> tempVector(rows); // estimate the number of non zero entries float ratioLhs = float(lhs.nonZeros())/(float(lhs.rows())*float(lhs.cols())); @@ -264,7 +266,7 @@ static void ei_sparse_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& r } } res.startVec(j); - for (typename AmbiVector<Scalar>::Iterator it(tempVector); it; ++it) + for (typename AmbiVector<Scalar,Index>::Iterator it(tempVector); it; ++it) res.insertBackByOuterInner(j,it.index()) = it.value(); } res.finalize(); diff --git a/Eigen/src/Sparse/SparseRedux.h b/Eigen/src/Sparse/SparseRedux.h index ea2ce1870..241be6c2e 100644 --- a/Eigen/src/Sparse/SparseRedux.h +++ b/Eigen/src/Sparse/SparseRedux.h @@ -37,17 +37,17 @@ SparseMatrixBase<Derived>::sum() const return res; } -template<typename _Scalar, int _Options> -typename ei_traits<SparseMatrix<_Scalar,_Options> >::Scalar -SparseMatrix<_Scalar,_Options>::sum() const +template<typename _Scalar, int _Options, typename _Index> +typename ei_traits<SparseMatrix<_Scalar,_Options,_Index> >::Scalar +SparseMatrix<_Scalar,_Options,_Index>::sum() const { ei_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix"); return Matrix<Scalar,1,Dynamic>::Map(&m_data.value(0), m_data.size()).sum(); } -template<typename _Scalar, int _Options> -typename ei_traits<SparseVector<_Scalar,_Options> >::Scalar -SparseVector<_Scalar,_Options>::sum() const +template<typename _Scalar, int _Options, typename _Index> +typename ei_traits<SparseVector<_Scalar,_Options, _Index> >::Scalar +SparseVector<_Scalar,_Options,_Index>::sum() const { ei_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix"); return Matrix<Scalar,1,Dynamic>::Map(&m_data.value(0), m_data.size()).sum(); diff --git a/Eigen/src/Sparse/SparseUtil.h b/Eigen/src/Sparse/SparseUtil.h index d94f5ce8c..f780f4087 100644 --- a/Eigen/src/Sparse/SparseUtil.h +++ b/Eigen/src/Sparse/SparseUtil.h @@ -56,30 +56,13 @@ EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \ EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \ EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=) -#define _EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(Derived, BaseClass) \ - typedef BaseClass Base; \ - typedef typename Eigen::ei_traits<Derived>::Scalar Scalar; \ - typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \ - typedef typename Eigen::ei_nested<Derived>::type Nested; \ - typedef typename Eigen::ei_traits<Derived>::StorageKind StorageKind; \ - typedef typename Eigen::ei_index<StorageKind>::type Index; \ - enum { RowsAtCompileTime = Eigen::ei_traits<Derived>::RowsAtCompileTime, \ - ColsAtCompileTime = Eigen::ei_traits<Derived>::ColsAtCompileTime, \ - Flags = Eigen::ei_traits<Derived>::Flags, \ - CoeffReadCost = Eigen::ei_traits<Derived>::CoeffReadCost, \ - SizeAtCompileTime = Base::SizeAtCompileTime, \ - IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; - -#define EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(Derived) \ - _EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(Derived, Eigen::SparseMatrixBase<Derived>) - #define _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, BaseClass) \ typedef BaseClass Base; \ typedef typename Eigen::ei_traits<Derived>::Scalar Scalar; \ typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \ typedef typename Eigen::ei_nested<Derived>::type Nested; \ typedef typename Eigen::ei_traits<Derived>::StorageKind StorageKind; \ - typedef typename Eigen::ei_index<StorageKind>::type Index; \ + typedef typename Eigen::ei_traits<Derived>::Index Index; \ enum { RowsAtCompileTime = Eigen::ei_traits<Derived>::RowsAtCompileTime, \ ColsAtCompileTime = Eigen::ei_traits<Derived>::ColsAtCompileTime, \ Flags = Eigen::ei_traits<Derived>::Flags, \ @@ -92,12 +75,6 @@ EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=) #define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) \ _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, Eigen::SparseMatrixBase<Derived>) -template<> -struct ei_index<Sparse> -{ typedef EIGEN_DEFAULT_SPARSE_INDEX_TYPE type; }; - -typedef ei_index<Sparse>::type SparseIndex; - enum SparseBackend { DefaultBackend, Taucs, @@ -128,10 +105,10 @@ enum { }; template<typename Derived> class SparseMatrixBase; -template<typename _Scalar, int _Flags = 0> class SparseMatrix; -template<typename _Scalar, int _Flags = 0> class DynamicSparseMatrix; -template<typename _Scalar, int _Flags = 0> class SparseVector; -template<typename _Scalar, int _Flags = 0> class MappedSparseMatrix; +template<typename _Scalar, int _Flags = 0, typename _Index = int> class SparseMatrix; +template<typename _Scalar, int _Flags = 0, typename _Index = int> class DynamicSparseMatrix; +template<typename _Scalar, int _Flags = 0, typename _Index = int> class SparseVector; +template<typename _Scalar, int _Flags = 0, typename _Index = int> class MappedSparseMatrix; template<typename MatrixType, int Size> class SparseInnerVectorSet; template<typename MatrixType, int Mode> class SparseTriangularView; diff --git a/Eigen/src/Sparse/SparseVector.h b/Eigen/src/Sparse/SparseVector.h index b15ab8220..dd81b749e 100644 --- a/Eigen/src/Sparse/SparseVector.h +++ b/Eigen/src/Sparse/SparseVector.h @@ -34,10 +34,11 @@ * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. * */ -template<typename _Scalar, int _Options> -struct ei_traits<SparseVector<_Scalar, _Options> > +template<typename _Scalar, int _Options, typename _Index> +struct ei_traits<SparseVector<_Scalar, _Options, _Index> > { typedef _Scalar Scalar; + typedef _Index Index; typedef Sparse StorageKind; typedef MatrixXpr XprKind; enum { @@ -53,12 +54,12 @@ struct ei_traits<SparseVector<_Scalar, _Options> > }; }; -template<typename _Scalar, int _Options> +template<typename _Scalar, int _Options, typename _Index> class SparseVector - : public SparseMatrixBase<SparseVector<_Scalar, _Options> > + : public SparseMatrixBase<SparseVector<_Scalar, _Options, _Index> > { public: - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseVector) + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseVector) EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=) EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=) // EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, =) @@ -69,11 +70,11 @@ class SparseVector typedef SparseMatrixBase<SparseVector> SparseBase; enum { IsColVector = ei_traits<SparseVector>::IsColVector }; - CompressedStorage<Scalar> m_data; + CompressedStorage<Scalar,Index> m_data; Index m_size; - CompressedStorage<Scalar>& _data() { return m_data; } - CompressedStorage<Scalar>& _data() const { return m_data; } + CompressedStorage<Scalar,Index>& _data() { return m_data; } + CompressedStorage<Scalar,Index>& _data() const { return m_data; } public: @@ -370,8 +371,8 @@ class SparseVector EIGEN_DEPRECATED void endFill() {} }; -template<typename Scalar, int _Options> -class SparseVector<Scalar,_Options>::InnerIterator +template<typename Scalar, int _Options, typename _Index> +class SparseVector<Scalar,_Options,_Index>::InnerIterator { public: InnerIterator(const SparseVector& vec, Index outer=0) @@ -380,7 +381,7 @@ class SparseVector<Scalar,_Options>::InnerIterator ei_assert(outer==0); } - InnerIterator(const CompressedStorage<Scalar>& data) + InnerIterator(const CompressedStorage<Scalar,Index>& data) : m_data(data), m_id(0), m_end(static_cast<Index>(m_data.size())) {} @@ -401,7 +402,7 @@ class SparseVector<Scalar,_Options>::InnerIterator inline operator bool() const { return (m_id < m_end); } protected: - const CompressedStorage<Scalar>& m_data; + const CompressedStorage<Scalar,Index>& m_data; Index m_id; const Index m_end; }; diff --git a/Eigen/src/Sparse/SuperLUSupport.h b/Eigen/src/Sparse/SuperLUSupport.h index 18a967539..d93f69df8 100644 --- a/Eigen/src/Sparse/SuperLUSupport.h +++ b/Eigen/src/Sparse/SuperLUSupport.h @@ -267,8 +267,8 @@ SluMatrix SparseMatrixBase<Derived>::asSluMatrix() } /** View a Super LU matrix as an Eigen expression */ -template<typename Scalar, int Flags> -MappedSparseMatrix<Scalar,Flags>::MappedSparseMatrix(SluMatrix& sluMat) +template<typename Scalar, int Flags, typename _Index> +MappedSparseMatrix<Scalar,Flags,_Index>::MappedSparseMatrix(SluMatrix& sluMat) { if ((Flags&RowMajorBit)==RowMajorBit) { diff --git a/Eigen/src/Sparse/TaucsSupport.h b/Eigen/src/Sparse/TaucsSupport.h index 2a1963f5b..c189e0127 100644 --- a/Eigen/src/Sparse/TaucsSupport.h +++ b/Eigen/src/Sparse/TaucsSupport.h @@ -63,8 +63,8 @@ taucs_ccs_matrix SparseMatrixBase<Derived>::asTaucsMatrix() return res; } -template<typename Scalar, int Flags> -MappedSparseMatrix<Scalar,Flags>::MappedSparseMatrix(taucs_ccs_matrix& taucsMat) +template<typename Scalar, int Flags, typename _Index> +MappedSparseMatrix<Scalar,Flags,_Index>::MappedSparseMatrix(taucs_ccs_matrix& taucsMat) { m_innerSize = taucsMat.m; m_outerSize = taucsMat.n; diff --git a/Eigen/src/Sparse/TriangularSolver.h b/Eigen/src/Sparse/TriangularSolver.h index 039424bf0..7528ba534 100644 --- a/Eigen/src/Sparse/TriangularSolver.h +++ b/Eigen/src/Sparse/TriangularSolver.h @@ -207,10 +207,12 @@ template<typename Lhs, typename Rhs, int Mode, int UpLo> struct ei_sparse_solve_triangular_sparse_selector<Lhs,Rhs,Mode,UpLo,ColMajor> { typedef typename Rhs::Scalar Scalar; + typedef typename ei_promote_index_type<typename ei_traits<Lhs>::Index, + typename ei_traits<Rhs>::Index>::type Index; static void run(const Lhs& lhs, Rhs& other) { const bool IsLower = (UpLo==Lower); - AmbiVector<Scalar> tempVector(other.rows()*2); + AmbiVector<Scalar,Index> tempVector(other.rows()*2); tempVector.setBounds(0,other.rows()); Rhs res(other.rows(), other.cols()); @@ -266,7 +268,7 @@ struct ei_sparse_solve_triangular_sparse_selector<Lhs,Rhs,Mode,UpLo,ColMajor> int count = 0; // FIXME compute a reference value to filter zeros - for (typename AmbiVector<Scalar>::Iterator it(tempVector/*,1e-12*/); it; ++it) + for (typename AmbiVector<Scalar,Index>::Iterator it(tempVector/*,1e-12*/); it; ++it) { ++ count; // std::cerr << "fill " << it.index() << ", " << col << "\n"; |