12 #ifndef QMCPLUSPLUS_CHECKMATRIX_HPP 13 #define QMCPLUSPLUS_CHECKMATRIX_HPP 19 #include <type_traits> 25 template<
typename T, IsComplex<T> = true>
29 return val_a == ComplexApprox(val_b).epsilon(eps.value());
31 return val_a == ComplexApprox(val_b);
34 template<
typename T, IsReal<T> = true>
38 return val_a == Approx(val_b).epsilon(eps.value());
40 return val_a == Approx(val_b);
62 template<
class M1,
class M2>
65 const bool check_all =
false,
66 std::optional<const double> eps = std::nullopt)
69 if (a_mat.rows() > b_mat.rows() || a_mat.cols() > b_mat.cols())
70 return {
false,
"b_mat is too small for a_mat to be a checkable block"};
71 std::stringstream error_msg;
72 auto matrixElementError = [&error_msg](
int i,
int j,
auto& a_mat,
auto& b_mat) {
73 error_msg <<
"checkMatrix found bad element at " << i <<
":" << j <<
" " << a_mat(i, j) <<
" != " << b_mat(i, j)
76 bool all_elements_match =
true;
77 for (
int i = 0; i < a_mat.rows(); i++)
78 for (
int j = 0; j < a_mat.cols(); j++)
80 bool approx_equality = approxEquality<typename M1::value_type>(a_mat(i, j), b_mat(i, j), eps);
83 matrixElementError(i, j, a_mat, b_mat);
84 all_elements_match =
false;
86 return {
false, error_msg.str()};
89 return {all_elements_match, error_msg.str()};
93 extern template bool approxEquality<std::complex<float>>(std::complex<float> val_a,
94 std::complex<float> val_b,
95 std::optional<double> eps);
97 extern template bool approxEquality<std::complex<double>>(std::complex<double> val_a,
98 std::complex<double> val_b,
99 std::optional<double> eps);
helper functions for EinsplineSetBuilder
template bool approxEquality< double >(double val_a, double val_b, std::optional< double > eps)
std::string result_message
bool approxEquality(T val_a, T val_b, std::optional< double > eps)
CheckMatrixResult checkMatrix(M1 &a_mat, M2 &b_mat, const bool check_all=false, std::optional< const double > eps=std::nullopt)
This function checks equality a_mat and b_mat elements M1, M2 need to have their element type declare...
template bool approxEquality< float >(float val_a, float val_b, std::optional< double > eps)