mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Fix SparseLU::absDeterminant and add respective unit test
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,9 @@ template<typename T> void test_sparselu_T()
|
||||
check_sparse_square_solving(sparselu_colamd);
|
||||
check_sparse_square_solving(sparselu_amd);
|
||||
check_sparse_square_solving(sparselu_natural);
|
||||
|
||||
check_sparse_square_abs_determinant(sparselu_colamd);
|
||||
check_sparse_square_abs_determinant(sparselu_amd);
|
||||
}
|
||||
|
||||
void test_sparselu()
|
||||
|
||||
Reference in New Issue
Block a user