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()
		
			
				
	
	
		
			37 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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
 |