eigen/test/solverbase.h
Patrick Peltzer 15e53d5d93 PR 567: makes all dense solvers inherit SoverBase (LU,Cholesky,QR,SVD).
This changeset also includes:
 * add HouseholderSequence::conjugateIf
 * define int as the StorageIndex type for all dense solvers
 * dedicated unit tests, including assertion checking
 * _check_solve_assertion(): this method can be implemented in derived solver classes to implement custom checks
 * CompleteOrthogonalDecompositions: add applyZOnTheLeftInPlace, fix scalar type in applyZAdjointOnTheLeftInPlace(), add missing assertions
 * Cholesky: add missing assertions
 * FullPivHouseholderQR: Corrected Scalar type in _solve_impl()
 * BDCSVD: Unambiguous return type for ternary operator
 * SVDBase: Corrected Scalar type in _solve_impl()
2019-01-17 01:17:39 +01:00

37 lines
1.7 KiB
C++

#ifndef TEST_SOLVERBASE_H
#define TEST_SOLVERBASE_H
template<typename DstType, typename RhsType, typename MatrixType, typename SolverType>
void check_solverbase(const MatrixType& matrix, const SolverType& solver, Index rows, Index cols, Index cols2)
{
// solve
DstType m2 = DstType::Random(cols,cols2);
RhsType m3 = matrix*m2;
DstType solver_solution = DstType::Random(cols,cols2);
solver._solve_impl(m3, solver_solution);
VERIFY_IS_APPROX(m3, matrix*solver_solution);
solver_solution = DstType::Random(cols,cols2);
solver_solution = solver.solve(m3);
VERIFY_IS_APPROX(m3, matrix*solver_solution);
// test solve with transposed
m3 = RhsType::Random(rows,cols2);
m2 = matrix.transpose()*m3;
RhsType solver_solution2 = RhsType::Random(rows,cols2);
solver.template _solve_impl_transposed<false>(m2, solver_solution2);
VERIFY_IS_APPROX(m2, matrix.transpose()*solver_solution2);
solver_solution2 = RhsType::Random(rows,cols2);
solver_solution2 = solver.transpose().solve(m2);
VERIFY_IS_APPROX(m2, matrix.transpose()*solver_solution2);
// test solve with conjugate transposed
m3 = RhsType::Random(rows,cols2);
m2 = matrix.adjoint()*m3;
solver_solution2 = RhsType::Random(rows,cols2);
solver.template _solve_impl_transposed<true>(m2, solver_solution2);
VERIFY_IS_APPROX(m2, matrix.adjoint()*solver_solution2);
solver_solution2 = RhsType::Random(rows,cols2);
solver_solution2 = solver.adjoint().solve(m2);
VERIFY_IS_APPROX(m2, matrix.adjoint()*solver_solution2);
}
#endif // TEST_SOLVERBASE_H