bug #897: fix UmfPack usage with mapped sparse matrices

This commit is contained in:
Gael Guennebaud 2014-12-02 13:57:13 +01:00
parent 4974d1d2b4
commit 1a8dc85142

View File

@ -196,7 +196,8 @@ class UmfPackLU : public SparseSolverBase<UmfPackLU<_MatrixType> >
* Note that the matrix should be column-major, and in compressed format for best performance. * Note that the matrix should be column-major, and in compressed format for best performance.
* \sa SparseMatrix::makeCompressed(). * \sa SparseMatrix::makeCompressed().
*/ */
void compute(const MatrixType& matrix) template<typename InputMatrixType>
void compute(const InputMatrixType& matrix)
{ {
analyzePattern(matrix); analyzePattern(matrix);
factorize(matrix); factorize(matrix);
@ -208,7 +209,8 @@ class UmfPackLU : public SparseSolverBase<UmfPackLU<_MatrixType> >
* *
* \sa factorize(), compute() * \sa factorize(), compute()
*/ */
void analyzePattern(const MatrixType& matrix) template<typename InputMatrixType>
void analyzePattern(const InputMatrixType& matrix)
{ {
if(m_symbolic) if(m_symbolic)
umfpack_free_symbolic(&m_symbolic,Scalar()); umfpack_free_symbolic(&m_symbolic,Scalar());
@ -234,7 +236,8 @@ class UmfPackLU : public SparseSolverBase<UmfPackLU<_MatrixType> >
* *
* \sa analyzePattern(), compute() * \sa analyzePattern(), compute()
*/ */
void factorize(const MatrixType& matrix) template<typename InputMatrixType>
void factorize(const InputMatrixType& matrix)
{ {
eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()"); eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
if(m_numeric) if(m_numeric)
@ -276,7 +279,8 @@ class UmfPackLU : public SparseSolverBase<UmfPackLU<_MatrixType> >
m_extractedDataAreDirty = true; m_extractedDataAreDirty = true;
} }
void grapInput(const MatrixType& mat) template<typename InputMatrixType>
void grapInput(const InputMatrixType& mat)
{ {
m_copyMatrix.resize(mat.rows(), mat.cols()); m_copyMatrix.resize(mat.rows(), mat.cols());
if( ((MatrixType::Flags&RowMajorBit)==RowMajorBit) || sizeof(typename MatrixType::Index)!=sizeof(int) || !mat.isCompressed() ) if( ((MatrixType::Flags&RowMajorBit)==RowMajorBit) || sizeof(typename MatrixType::Index)!=sizeof(int) || !mat.isCompressed() )