Skip to content

Commit 0061d8f

Browse files
authored
Merge pull request #2997 from stan-dev/fix/test-ad-names
appends name of ad types used to ad test to failure output
2 parents 895f3e9 + 5fc064d commit 0061d8f

File tree

2 files changed

+82
-56
lines changed

2 files changed

+82
-56
lines changed

test/unit/math/expect_near_rel.hpp

+60-43
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,38 @@ namespace internal {
2727
*/
2828
template <typename T1, typename T2, require_all_stan_scalar_t<T1, T2>...>
2929
void expect_near_rel_finite(const std::string& msg, const T1& x1, const T2& x2,
30-
const relative_tolerance tol
31-
= relative_tolerance()) {
30+
const relative_tolerance tol = relative_tolerance(),
31+
const char* x1_name = "x1",
32+
const char* x2_name = "x2") {
3233
double tol_val = tol.inexact(x1, x2);
3334
EXPECT_NEAR(x1, x2, tol_val)
34-
<< "expect_near_rel_finite in: " << msg << std::endl;
35+
<< "expect_near_rel_finite in: " << msg << " for " << x1_name << " vs "
36+
<< x2_name << std::endl;
3537
}
3638

3739
template <typename EigMat1, typename EigMat2,
3840
require_all_eigen_t<EigMat1, EigMat2>...>
3941
void expect_near_rel_finite(const std::string& msg, const EigMat1& x1,
40-
const EigMat2& x2) {
42+
const EigMat2& x2, const char* x1_name = "x1",
43+
const char* x2_name = "x2") {
4144
EXPECT_EQ(x1.rows(), x2.rows());
4245
EXPECT_EQ(x1.cols(), x2.cols());
4346
auto x1_eval = x1.eval();
4447
auto x2_eval = x2.eval();
45-
for (int i = 0; i < x1.size(); ++i)
46-
expect_near_rel_finite(msg, x1_eval(i), x2_eval(i));
48+
for (int i = 0; i < x1.size(); ++i) {
49+
expect_near_rel_finite(msg, x1_eval(i), x2_eval(i), x1_name, x2_name);
50+
}
4751
}
4852

4953
template <typename T1, typename T2>
5054
void expect_near_rel_finite(const std::string& msg, const std::vector<T1>& x1,
51-
const std::vector<T2>& x2) {
55+
const std::vector<T2>& x2,
56+
const char* x1_name = "x1",
57+
const char* x2_name = "x2") {
5258
EXPECT_EQ(x1.size(), x2.size());
53-
for (size_t i = 0; i < x1.size(); ++i)
54-
expect_near_rel_finite(x1[i], x2[i]);
59+
for (size_t i = 0; i < x1.size(); ++i) {
60+
expect_near_rel_finite(x1[i], x2[i], x1_name, x2_name);
61+
}
5562
}
5663

5764
} // namespace internal
@@ -72,17 +79,20 @@ void expect_near_rel_finite(const std::string& msg, const std::vector<T1>& x1,
7279
*/
7380
template <typename T1, typename T2, require_all_stan_scalar_t<T1, T2>...>
7481
void expect_near_rel(const std::string& msg, const T1& x1, const T2& x2,
75-
relative_tolerance tol = relative_tolerance()) {
76-
if (stan::math::is_nan(x1) || stan::math::is_nan(x2))
82+
relative_tolerance tol = relative_tolerance(),
83+
const char* x1_name = "x1", const char* x2_name = "x2") {
84+
if (stan::math::is_nan(x1) || stan::math::is_nan(x2)) {
7785
EXPECT_TRUE(stan::math::is_nan(x1) && stan::math::is_nan(x2))
7886
<< "expect_near_rel(" << x1 << ", " << x2 << ")" << std::endl
79-
<< msg << std::endl;
80-
else if (stan::math::is_inf(x1) || stan::math::is_inf(x2))
87+
<< msg << " for " << x1_name << " vs " << x2_name << std::endl;
88+
} else if (stan::math::is_inf(x1) || stan::math::is_inf(x2)) {
8189
EXPECT_EQ(x1, x2) << "expect_near_rel(" << x1 << ", " << x2 << ")"
8290
<< std::endl
83-
<< msg << std::endl;
84-
else
85-
internal::expect_near_rel_finite(msg, x1, x2, tol);
91+
<< msg << " for " << x1_name << " vs " << x2_name
92+
<< std::endl;
93+
} else {
94+
internal::expect_near_rel_finite(msg, x1, x2, tol, x1_name, x2_name);
95+
}
8696
}
8797

8898
/**
@@ -103,17 +113,18 @@ void expect_near_rel(const std::string& msg, const T1& x1, const T2& x2,
103113
template <typename EigMat1, typename EigMat2,
104114
require_all_eigen_t<EigMat1, EigMat2>...>
105115
void expect_near_rel(const std::string& msg, EigMat1&& x1, EigMat2&& x2,
106-
relative_tolerance tol = relative_tolerance()) {
107-
EXPECT_EQ(x1.rows(), x2.rows()) << "expect_near_rel (Eigen::Matrix)"
108-
<< " rows must be same size."
109-
<< " x1.rows() = " << x1.rows()
110-
<< "; x2.rows() = " << x2.rows() << std::endl
111-
<< msg << std::endl;
116+
relative_tolerance tol = relative_tolerance(),
117+
const char* x1_name = "x1", const char* x2_name = "x2") {
118+
EXPECT_EQ(x1.rows(), x2.rows())
119+
<< "expect_near_rel (Eigen::Matrix)"
120+
<< " rows must be same size." << x1_name << ".rows() = " << x1.rows()
121+
<< "; " << x2_name << ".rows() = " << x2.rows() << std::endl
122+
<< msg << std::endl;
123+
112124
EXPECT_EQ(x1.cols(), x2.cols())
113125
<< "expect_near_rel:"
114-
<< "cols must be same size."
115-
<< "x1.cols() = " << x1.cols() << "x2.cols() = " << x2.cols() << ")"
116-
<< std::endl
126+
<< "cols must be same size." << x1_name << ".cols() = " << x1.cols()
127+
<< "; " << x2_name << ".cols() = " << x2.cols() << std::endl
117128
<< msg << std::endl;
118129
auto x1_eval = x1.eval();
119130
auto x2_eval = x2.eval();
@@ -128,7 +139,8 @@ void expect_near_rel(const std::string& msg, EigMat1&& x1, EigMat2&& x2,
128139
msg2 += std::to_string(i) + ", " + std::to_string(j) + ") = x2("
129140
+ std::to_string(i) + ", " + std::to_string(j) + "): " + msg;
130141
}
131-
expect_near_rel(msg2, x1_eval(sentinal_val), x2_eval(sentinal_val), tol);
142+
expect_near_rel(msg2, x1_eval(sentinal_val), x2_eval(sentinal_val), tol,
143+
x1_name, x2_name);
132144
sentinal_val++;
133145
}
134146
}
@@ -156,15 +168,17 @@ void expect_near_rel(const std::string& msg, EigMat1&& x1, EigMat2&& x2,
156168
template <typename T1, typename T2>
157169
void expect_near_rel(const std::string& msg, const std::vector<T1>& x1,
158170
const std::vector<T2>& x2,
159-
relative_tolerance tol = relative_tolerance()) {
160-
EXPECT_EQ(x1.size(), x2.size()) << "expect_near_rel (std::vector):"
161-
<< " vectors must be same size."
162-
<< " x1.size() = " << x1.size()
163-
<< "; x2.size() = " << x2.size() << std::endl
164-
<< msg << std::endl;
165-
std::string msg2 = "expect_near_rel; requite items x1[i] = x2[i]: " + msg;
171+
relative_tolerance tol = relative_tolerance(),
172+
const char* x1_name = "x1", const char* x2_name = "x2") {
173+
EXPECT_EQ(x1.size(), x2.size())
174+
<< "expect_near_rel (std::vector):"
175+
<< " vectors must be same size. " << x1_name << ".size() = " << x1.size()
176+
<< "; " << x2_name << ".size() = " << x2.size() << std::endl
177+
<< msg << std::endl;
178+
std::string msg2 = std::string("expect_near_rel; require items ") + "x1[i] = "
179+
+ "x2[i]: " + msg + " for " + x1_name + " vs " + x2_name;
166180
for (size_t i = 0; i < x1.size(); ++i)
167-
expect_near_rel(msg2, x1[i], x2[i], tol);
181+
expect_near_rel(msg2, x1[i], x2[i], tol, x1_name, x2_name);
168182
}
169183

170184
/**
@@ -182,9 +196,10 @@ void expect_near_rel(const std::string& msg, const std::vector<T1>& x1,
182196
template <typename T1, typename T2>
183197
void expect_near_rel(const std::string& msg, const std::complex<T1>& z1,
184198
const std::complex<T2>& z2,
185-
relative_tolerance tol = relative_tolerance()) {
186-
expect_near_rel(msg, z1.real(), z2.real(), tol);
187-
expect_near_rel(msg, z1.imag(), z2.imag(), tol);
199+
relative_tolerance tol = relative_tolerance(),
200+
const char* x1_name = "x1", const char* x2_name = "x2") {
201+
expect_near_rel(msg, z1.real(), z2.real(), tol, x1_name, x2_name);
202+
expect_near_rel(msg, z1.imag(), z2.imag(), tol, x1_name, x2_name);
188203
}
189204

190205
/**
@@ -203,9 +218,10 @@ void expect_near_rel(const std::string& msg, const std::complex<T1>& z1,
203218
template <typename T1, typename T2>
204219
void expect_near_rel(const std::string& msg, const T1& x1,
205220
const std::complex<T2>& z2,
206-
relative_tolerance tol = relative_tolerance()) {
207-
expect_near_rel(msg, x1, z2.real(), tol);
208-
expect_near_rel(msg, 0, z2.imag(), tol);
221+
relative_tolerance tol = relative_tolerance(),
222+
const char* x1_name = "x1", const char* x2_name = "x2") {
223+
expect_near_rel(msg, x1, z2.real(), tol, x1_name, x2_name);
224+
expect_near_rel(msg, 0, z2.imag(), tol, x1_name, x2_name);
209225
}
210226

211227
/**
@@ -224,9 +240,10 @@ void expect_near_rel(const std::string& msg, const T1& x1,
224240
template <typename T1, typename T2>
225241
void expect_near_rel(const std::string& msg, const std::complex<T1>& z1,
226242
const T2& x2,
227-
relative_tolerance tol = relative_tolerance()) {
228-
expect_near_rel(msg, z1.real(), x2, tol);
229-
expect_near_rel(msg, z1.imag(), 0, tol);
243+
relative_tolerance tol = relative_tolerance(),
244+
const char* x1_name = "x1", const char* x2_name = "x2") {
245+
expect_near_rel(msg, z1.real(), x2, tol, x1_name, x2_name);
246+
expect_near_rel(msg, z1.imag(), 0, tol, x1_name, x2_name);
230247
}
231248

232249
} // namespace test

test/unit/math/test_ad.hpp

+22-13
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,15 @@ void test_gradient(const ad_tolerances& tols, const F& f,
128128
Eigen::VectorXd grad_ad;
129129
double fx_ad = fx;
130130
stan::math::gradient<F>(f, x, fx_ad, grad_ad);
131-
expect_near_rel("gradient() val", fx, fx_ad, tols.gradient_val_);
131+
expect_near_rel("gradient() val", fx, fx_ad, tols.gradient_val_, "double",
132+
"var");
132133
if (!test_derivs || !is_finite(x) || !is_finite(fx))
133134
return;
134135
Eigen::VectorXd grad_fd;
135136
double fx_fd;
136137
stan::math::finite_diff_gradient_auto(f, x, fx_fd, grad_fd);
137138
expect_near_rel("gradient() grad for finite diff vs auto diff", grad_fd,
138-
grad_ad, tols.gradient_grad_);
139+
grad_ad, tols.gradient_grad_, "finite_diff", "var");
139140
}
140141

141142
#ifndef STAN_MATH_TESTS_REV_ONLY
@@ -169,14 +170,15 @@ void test_gradient_fvar(const ad_tolerances& tols, const F& f,
169170
Eigen::VectorXd grad_ad;
170171
double fx_ad = fx;
171172
stan::math::gradient<double, F>(f, x, fx_ad, grad_ad);
172-
expect_near_rel("gradient_fvar() val", fx, fx_ad, tols.gradient_fvar_val_);
173+
expect_near_rel("gradient_fvar() val", fx, fx_ad, tols.gradient_fvar_val_,
174+
"double", "fvar<double>");
173175
if (!test_derivs || !is_finite(x) || !is_finite(fx))
174176
return;
175177
Eigen::VectorXd grad_fd;
176178
double fx_fd;
177179
stan::math::finite_diff_gradient_auto(f, x, fx_fd, grad_fd);
178180
expect_near_rel("gradient_fvar() grad", grad_fd, grad_ad,
179-
tols.gradient_fvar_grad_);
181+
tols.gradient_fvar_grad_, "finite_diff", "fvar<double>");
180182
}
181183

182184
/**
@@ -210,17 +212,19 @@ void test_hessian_fvar(const ad_tolerances& tols, const F& f,
210212
Eigen::VectorXd grad_ad;
211213
Eigen::MatrixXd H_ad;
212214
stan::math::hessian<double, F>(f, x, fx_ad, grad_ad, H_ad);
213-
expect_near_rel("hessian_fvar() val", fx, fx_ad, tols.hessian_fvar_val_);
215+
expect_near_rel("hessian_fvar() val", fx, fx_ad, tols.hessian_fvar_val_,
216+
"double", "fvar<fvar<double>>");
214217
if (!test_derivs || !is_finite(x) || !is_finite(fx))
215218
return;
216219
double fx_fd;
217220
Eigen::VectorXd grad_fd;
218221
Eigen::MatrixXd H_fd;
219222
stan::math::internal::finite_diff_hessian_auto(f, x, fx_fd, grad_fd, H_fd);
220223
expect_near_rel("hessian_fvar() grad", grad_fd, grad_ad,
221-
tols.hessian_fvar_grad_);
224+
tols.hessian_fvar_grad_, "finite_diff", "fvar<fvar<double>>");
222225
expect_near_rel("hessian_fvar() Hessian", H_fd, H_ad,
223-
tols.hessian_fvar_hessian_);
226+
tols.hessian_fvar_hessian_, "finite_diff",
227+
"fvar<fvar<double>>");
224228
}
225229

226230
/**
@@ -254,15 +258,18 @@ void test_hessian(const ad_tolerances& tols, const F& f,
254258
Eigen::VectorXd grad_ad;
255259
Eigen::MatrixXd H_ad;
256260
stan::math::hessian<F>(f, x, fx_ad, grad_ad, H_ad);
257-
expect_near_rel("hessian val", fx, fx_ad, tols.hessian_val_);
261+
expect_near_rel("hessian val", fx, fx_ad, tols.hessian_val_, "double",
262+
"fvar<var>");
258263
if (!test_derivs || !is_finite(x) || !is_finite(fx))
259264
return;
260265
double fx_fd;
261266
Eigen::VectorXd grad_fd;
262267
Eigen::MatrixXd H_fd;
263268
stan::math::internal::finite_diff_hessian_auto(f, x, fx_fd, grad_fd, H_fd);
264-
expect_near_rel("hessian() grad", grad_fd, grad_ad, tols.hessian_grad_);
265-
expect_near_rel("hessian() Hessian", H_fd, H_ad, tols.hessian_hessian_);
269+
expect_near_rel("hessian() grad", grad_fd, grad_ad, tols.hessian_grad_,
270+
"finite_diff", "fvar<var>");
271+
expect_near_rel("hessian() Hessian", H_fd, H_ad, tols.hessian_hessian_,
272+
"finite_diff", "fvar<var>");
266273
}
267274

268275
/**
@@ -296,19 +303,21 @@ void test_grad_hessian(const ad_tolerances& tols, const F& f,
296303
Eigen::MatrixXd H_ad;
297304
std::vector<Eigen::MatrixXd> grad_H_ad;
298305
stan::math::grad_hessian(f, x, fx_ad, H_ad, grad_H_ad);
299-
expect_near_rel("grad_hessian() val", fx, fx_ad, tols.grad_hessian_val_);
306+
expect_near_rel("grad_hessian() val", fx, fx_ad, tols.grad_hessian_val_,
307+
"double", "fvar<fvar<var>>");
300308
if (!test_derivs || !is_finite(x) || !is_finite(fx))
301309
return;
302310
double fx_fd;
303311
Eigen::MatrixXd H_fd;
304312
std::vector<Eigen::MatrixXd> grad_H_fd;
305313
stan::math::finite_diff_grad_hessian_auto(f, x, fx_fd, H_fd, grad_H_fd);
306314
expect_near_rel("grad_hessian() Hessian", H_fd, H_ad,
307-
tols.grad_hessian_hessian_);
315+
tols.grad_hessian_hessian_, "finite_diff", "fvar<fvar<var>>");
308316
EXPECT_EQ(x.size(), grad_H_fd.size());
309317
for (size_t i = 0; i < grad_H_fd.size(); ++i)
310318
expect_near_rel("grad_hessian() grad Hessian", grad_H_fd[i], grad_H_ad[i],
311-
tols.grad_hessian_grad_hessian_);
319+
tols.grad_hessian_grad_hessian_, "finite_diff",
320+
"fvar<fvar<var>>");
312321
}
313322
#endif
314323

0 commit comments

Comments
 (0)