From a2782964c1fdbf3d7abb950b731b1fc16a0f3024 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Sat, 27 Dec 2008 19:51:54 +0000 Subject: [PATCH] Sparse module, add an assertion and make the use of CHOLMOD's solve method the default. --- Eigen/src/Core/util/StaticAssert.h | 3 ++- Eigen/src/Sparse/CholmodSupport.h | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Eigen/src/Core/util/StaticAssert.h b/Eigen/src/Core/util/StaticAssert.h index 0ba66749d..c8d944520 100644 --- a/Eigen/src/Core/util/StaticAssert.h +++ b/Eigen/src/Core/util/StaticAssert.h @@ -70,7 +70,8 @@ INVALID_MATRIX_PRODUCT, INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS, INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION, - YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY + YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY, + THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES }; }; diff --git a/Eigen/src/Sparse/CholmodSupport.h b/Eigen/src/Sparse/CholmodSupport.h index f77edba42..1be55a2d5 100644 --- a/Eigen/src/Sparse/CholmodSupport.h +++ b/Eigen/src/Sparse/CholmodSupport.h @@ -91,6 +91,7 @@ cholmod_sparse SparseMatrix::asCholmodMatrix() template cholmod_dense ei_cholmod_map_eigen_to_dense(MatrixBase& mat) { + EIGEN_STATIC_ASSERT((ei_traits::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); typedef typename Derived::Scalar Scalar; cholmod_dense res; @@ -225,15 +226,15 @@ void SparseLLT::solveInPlace(MatrixBase &b) const ei_assert(size==b.rows()); // this uses Eigen's triangular sparse solver - if (m_status & MatrixLIsDirty) - matrixL(); - Base::solveInPlace(b); +// if (m_status & MatrixLIsDirty) +// matrixL(); +// Base::solveInPlace(b); // as long as our own triangular sparse solver is not fully optimal, // let's use CHOLMOD's one: -// cholmod_dense cdb = ei_cholmod_map_eigen_to_dense(b); -// cholmod_dense* x = cholmod_solve(CHOLMOD_LDLt, m_cholmodFactor, &cdb, &m_cholmod); -// b = Matrix::Map(reinterpret_cast(x->x),b.rows()); -// cholmod_free_dense(&x, &m_cholmod); + cholmod_dense cdb = ei_cholmod_map_eigen_to_dense(b); + cholmod_dense* x = cholmod_solve(CHOLMOD_LDLt, m_cholmodFactor, &cdb, &m_cholmod); + b = Matrix::Map(reinterpret_cast(x->x),b.rows()); + cholmod_free_dense(&x, &m_cholmod); } #endif // EIGEN_CHOLMODSUPPORT_H