diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-10-17 16:52:56 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-10-17 16:52:56 +0200 |
commit | a370b1f2e20804f0b99bcda1c3940f00300e4f90 (patch) | |
tree | f4e65ba43e37bb64fd192452e6e3fe34a12cf387 /test/sparse_solver.h | |
parent | a13bc2220457224152e8e301c928f28013691d15 (diff) |
Fix SparseLU::absDeterminant and add respective unit test
Diffstat (limited to 'test/sparse_solver.h')
-rw-r--r-- | test/sparse_solver.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/test/sparse_solver.h b/test/sparse_solver.h index 8c8d7f939..b10eaebcc 100644 --- a/test/sparse_solver.h +++ b/test/sparse_solver.h @@ -133,7 +133,23 @@ void check_sparse_determinant(Solver& solver, const typename Solver::MatrixType& Scalar refDet = dA.determinant(); VERIFY_IS_APPROX(refDet,solver.determinant()); } +template<typename Solver, typename DenseMat> +void check_sparse_abs_determinant(Solver& solver, const typename Solver::MatrixType& A, const DenseMat& dA) +{ + using std::abs; + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + + solver.compute(A); + if (solver.info() != Success) + { + std::cerr << "sparse solver testing: factorization failed (check_sparse_abs_determinant)\n"; + return; + } + Scalar refDet = abs(dA.determinant()); + VERIFY_IS_APPROX(refDet,solver.absDeterminant()); +} template<typename Solver, typename DenseMat> int generate_sparse_spd_problem(Solver& , typename Solver::MatrixType& A, typename Solver::MatrixType& halfA, DenseMat& dA, int maxSize = 300) @@ -333,3 +349,20 @@ template<typename Solver> void check_sparse_square_determinant(Solver& solver) check_sparse_determinant(solver, A, dA); } } + +template<typename Solver> void check_sparse_square_abs_determinant(Solver& solver) +{ + typedef typename Solver::MatrixType Mat; + typedef typename Mat::Scalar Scalar; + typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix; + + // generate the problem + Mat A; + DenseMatrix dA; + generate_sparse_square_problem(solver, A, dA, 30); + A.makeCompressed(); + for (int i = 0; i < g_repeat; i++) { + check_sparse_abs_determinant(solver, A, dA); + } +} + |