xref: /aosp_15_r20/external/eigen/test/solverbase.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li #ifndef TEST_SOLVERBASE_H
2*bf2c3715SXin Li #define TEST_SOLVERBASE_H
3*bf2c3715SXin Li 
4*bf2c3715SXin Li template<typename DstType, typename RhsType, typename MatrixType, typename SolverType>
check_solverbase(const MatrixType & matrix,const SolverType & solver,Index rows,Index cols,Index cols2)5*bf2c3715SXin Li void check_solverbase(const MatrixType& matrix, const SolverType& solver, Index rows, Index cols, Index cols2)
6*bf2c3715SXin Li {
7*bf2c3715SXin Li   // solve
8*bf2c3715SXin Li   DstType m2               = DstType::Random(cols,cols2);
9*bf2c3715SXin Li   RhsType m3               = matrix*m2;
10*bf2c3715SXin Li   DstType solver_solution  = DstType::Random(cols,cols2);
11*bf2c3715SXin Li   solver._solve_impl(m3, solver_solution);
12*bf2c3715SXin Li   VERIFY_IS_APPROX(m3, matrix*solver_solution);
13*bf2c3715SXin Li   solver_solution          = DstType::Random(cols,cols2);
14*bf2c3715SXin Li   solver_solution          = solver.solve(m3);
15*bf2c3715SXin Li   VERIFY_IS_APPROX(m3, matrix*solver_solution);
16*bf2c3715SXin Li   // test solve with transposed
17*bf2c3715SXin Li   m3                       = RhsType::Random(rows,cols2);
18*bf2c3715SXin Li   m2                       = matrix.transpose()*m3;
19*bf2c3715SXin Li   RhsType solver_solution2 = RhsType::Random(rows,cols2);
20*bf2c3715SXin Li   solver.template _solve_impl_transposed<false>(m2, solver_solution2);
21*bf2c3715SXin Li   VERIFY_IS_APPROX(m2, matrix.transpose()*solver_solution2);
22*bf2c3715SXin Li   solver_solution2         = RhsType::Random(rows,cols2);
23*bf2c3715SXin Li   solver_solution2         = solver.transpose().solve(m2);
24*bf2c3715SXin Li   VERIFY_IS_APPROX(m2, matrix.transpose()*solver_solution2);
25*bf2c3715SXin Li   // test solve with conjugate transposed
26*bf2c3715SXin Li   m3                       = RhsType::Random(rows,cols2);
27*bf2c3715SXin Li   m2                       = matrix.adjoint()*m3;
28*bf2c3715SXin Li   solver_solution2         = RhsType::Random(rows,cols2);
29*bf2c3715SXin Li   solver.template _solve_impl_transposed<true>(m2, solver_solution2);
30*bf2c3715SXin Li   VERIFY_IS_APPROX(m2, matrix.adjoint()*solver_solution2);
31*bf2c3715SXin Li   solver_solution2         = RhsType::Random(rows,cols2);
32*bf2c3715SXin Li   solver_solution2         = solver.adjoint().solve(m2);
33*bf2c3715SXin Li   VERIFY_IS_APPROX(m2, matrix.adjoint()*solver_solution2);
34*bf2c3715SXin Li }
35*bf2c3715SXin Li 
36*bf2c3715SXin Li #endif // TEST_SOLVERBASE_H
37