Extend unit test to check sparse solvers with a SparseVector as the rhs and result.

This commit is contained in:
Gael Guennebaud 2016-11-06 20:29:57 +01:00
parent 436a111792
commit 73985ead27

View File

@ -272,6 +272,7 @@ template<typename Solver> void check_sparse_spd_solving(Solver& solver, int maxS
typedef typename Mat::Scalar Scalar; typedef typename Mat::Scalar Scalar;
typedef typename Mat::StorageIndex StorageIndex; typedef typename Mat::StorageIndex StorageIndex;
typedef SparseMatrix<Scalar,ColMajor, StorageIndex> SpMat; typedef SparseMatrix<Scalar,ColMajor, StorageIndex> SpMat;
typedef SparseVector<Scalar, 0, StorageIndex> SpVec;
typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix; typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;
typedef Matrix<Scalar,Dynamic,1> DenseVector; typedef Matrix<Scalar,Dynamic,1> DenseVector;
@ -288,6 +289,8 @@ template<typename Solver> void check_sparse_spd_solving(Solver& solver, int maxS
DenseVector b = DenseVector::Random(size); DenseVector b = DenseVector::Random(size);
DenseMatrix dB(size,rhsCols); DenseMatrix dB(size,rhsCols);
initSparse<Scalar>(density, dB, B, ForceNonZeroDiag); initSparse<Scalar>(density, dB, B, ForceNonZeroDiag);
SpVec c = B.col(0);
DenseVector dc = dB.col(0);
CALL_SUBTEST( check_sparse_solving(solver, A, b, dA, b) ); CALL_SUBTEST( check_sparse_solving(solver, A, b, dA, b) );
CALL_SUBTEST( check_sparse_solving(solver, halfA, b, dA, b) ); CALL_SUBTEST( check_sparse_solving(solver, halfA, b, dA, b) );
@ -295,6 +298,8 @@ template<typename Solver> void check_sparse_spd_solving(Solver& solver, int maxS
CALL_SUBTEST( check_sparse_solving(solver, halfA, dB, dA, dB) ); CALL_SUBTEST( check_sparse_solving(solver, halfA, dB, dA, dB) );
CALL_SUBTEST( check_sparse_solving(solver, A, B, dA, dB) ); CALL_SUBTEST( check_sparse_solving(solver, A, B, dA, dB) );
CALL_SUBTEST( check_sparse_solving(solver, halfA, B, dA, dB) ); CALL_SUBTEST( check_sparse_solving(solver, halfA, B, dA, dB) );
CALL_SUBTEST( check_sparse_solving(solver, A, c, dA, dc) );
CALL_SUBTEST( check_sparse_solving(solver, halfA, c, dA, dc) );
// check only once // check only once
if(i==0) if(i==0)
@ -396,6 +401,7 @@ template<typename Solver> void check_sparse_square_solving(Solver& solver, int m
typedef typename Solver::MatrixType Mat; typedef typename Solver::MatrixType Mat;
typedef typename Mat::Scalar Scalar; typedef typename Mat::Scalar Scalar;
typedef SparseMatrix<Scalar,ColMajor, typename Mat::StorageIndex> SpMat; typedef SparseMatrix<Scalar,ColMajor, typename Mat::StorageIndex> SpMat;
typedef SparseVector<Scalar, 0, typename Mat::StorageIndex> SpVec;
typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix; typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;
typedef Matrix<Scalar,Dynamic,1> DenseVector; typedef Matrix<Scalar,Dynamic,1> DenseVector;
@ -413,9 +419,12 @@ template<typename Solver> void check_sparse_square_solving(Solver& solver, int m
double density = (std::max)(8./(size*rhsCols), 0.1); double density = (std::max)(8./(size*rhsCols), 0.1);
initSparse<Scalar>(density, dB, B, ForceNonZeroDiag); initSparse<Scalar>(density, dB, B, ForceNonZeroDiag);
B.makeCompressed(); B.makeCompressed();
SpVec c = B.col(0);
DenseVector dc = dB.col(0);
CALL_SUBTEST(check_sparse_solving(solver, A, b, dA, b)); CALL_SUBTEST(check_sparse_solving(solver, A, b, dA, b));
CALL_SUBTEST(check_sparse_solving(solver, A, dB, dA, dB)); CALL_SUBTEST(check_sparse_solving(solver, A, dB, dA, dB));
CALL_SUBTEST(check_sparse_solving(solver, A, B, dA, dB)); CALL_SUBTEST(check_sparse_solving(solver, A, B, dA, dB));
CALL_SUBTEST(check_sparse_solving(solver, A, c, dA, dc));
// check only once // check only once
if(i==0) if(i==0)