Skip to content

Commit 98c8dcf

Browse files
authored
Merge pull request #3281 from stan-dev/fix/clang-7-wolfe-warning
2 parents 3ba26b8 + deec14c commit 98c8dcf

8 files changed

Lines changed: 97 additions & 47 deletions

stan/math/mix/functor/laplace_marginal_density_estimator.hpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <stan/math/prim/functor/iter_tuple_nested.hpp>
1414
#include <unsupported/Eigen/MatrixFunctions>
1515
#include <cmath>
16+
#include <mutex>
1617

1718
/**
1819
* @file
@@ -1018,7 +1019,9 @@ inline void log_solver_fallback(const bool allow_fallthrough,
10181019
<< " " << std::left << std::setw(12) << "failed:" << failed_solver << "\n"
10191020
<< " " << std::left << std::setw(12) << "reason:" << e.what() << "\n"
10201021
<< " " << std::left << std::setw(12) << "action:"
1021-
<< "trying " << next_solver << "\n";
1022+
<< "trying " << next_solver << "\n"
1023+
<< "note: this warning message will only be displayed once."
1024+
<< "\n";
10221025
if (allow_fallthrough && msgs) {
10231026
(*msgs) << os.str();
10241027
} else {
@@ -1086,6 +1089,7 @@ inline auto create_update_fun(ObjFun&& obj_fun, ThetaGradFun&& theta_grad_f,
10861089
};
10871090
}
10881091

1092+
static STAN_THREADS_DEF std::once_flag fallback_warning;
10891093
/**
10901094
* For a latent Gaussian model with hyperparameters phi and
10911095
* latent variables theta, and observations y, this function computes
@@ -1175,12 +1179,16 @@ inline auto laplace_marginal_density_est(
11751179
}
11761180
}
11771181
} catch (const std::exception& e) {
1178-
std::string solver_type
1182+
const std::string solver_type
11791183
= (options.hessian_block_size == 1) ? "Diagonal" : "Block";
11801184
std::string failed = "solver 1 (" + solver_type + " Hessian-root Cholesky)";
1181-
log_solver_fallback(options.allow_fallthrough, msgs,
1182-
"laplace_marginal_density", step_iter, failed,
1183-
"solver 2 (Covariance-root Cholesky)", e);
1185+
std::call_once(
1186+
fallback_warning,
1187+
[](auto&&... args) {
1188+
log_solver_fallback(std::forward<decltype(args)>(args)...);
1189+
},
1190+
options.allow_fallthrough, msgs, "laplace_marginal_density", step_iter,
1191+
std::move(failed), "solver 2 (Covariance-root Cholesky)", e);
11841192
}
11851193
try {
11861194
if (options.solver == 2 || options.allow_fallthrough) {
@@ -1189,10 +1197,14 @@ inline auto laplace_marginal_density_est(
11891197
covariance, update_fun, msgs);
11901198
}
11911199
} catch (const std::exception& e) {
1192-
log_solver_fallback(options.allow_fallthrough, msgs,
1193-
"laplace_marginal_density", step_iter,
1194-
"solver 2 (Covariance-root Cholesky)",
1195-
"solver 3 (General LU solver)", e);
1200+
std::call_once(
1201+
fallback_warning,
1202+
[](auto&&... args) {
1203+
log_solver_fallback(std::forward<decltype(args)>(args)...);
1204+
},
1205+
options.allow_fallthrough, msgs, "laplace_marginal_density", step_iter,
1206+
"solver 2 (Covariance-root Cholesky)", "solver 3 (General LU solver)",
1207+
e);
11961208
}
11971209
if (options.solver == 3 || options.allow_fallthrough) {
11981210
LUSolver solver;

test/unit/math/laplace/laplace_marginal_bernoulli_logit_lpmf_test.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ TEST_P(laplace_marginal_bernoulli_logit_lpmf, phi_dim500) {
2222
using stan::math::var;
2323
using stan::math::test::flag_test;
2424
constexpr int dim_theta = 500;
25-
const auto [solver_num, hessian_block_size, max_steps_line_search]
26-
= GetParam();
25+
const auto test_params = GetParam();
26+
const auto solver_num = std::get<0>(test_params);
27+
const auto hessian_block_size = std::get<1>(test_params);
28+
const auto max_steps_line_search = std::get<2>(test_params);
2729
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
2830
// LAPLACE_SKIP_ZERO_STEPS(max_steps_line_search);
2931

test/unit/math/laplace/laplace_marginal_lpdf_moto_test.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,10 @@ TEST_P(laplace_motorcyle_gp_test, gp_motorcycle_val) {
140140
using stan::math::laplace_marginal_tol;
141141
constexpr double tolerance = 1e-12;
142142
constexpr int max_num_steps = 1000;
143-
const auto [solver_num, hessian_block_size, max_steps_line_search]
144-
= GetParam();
143+
const auto test_params = GetParam();
144+
const auto solver_num = std::get<0>(test_params);
145+
const auto hessian_block_size = std::get<1>(test_params);
146+
const auto max_steps_line_search = std::get<2>(test_params);
145147
constexpr int dim_theta = 2 * n_obs;
146148
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
147149

@@ -168,8 +170,10 @@ TEST_P(laplace_motorcyle_gp_test, gp_motorcycle_ad) {
168170
auto phi_1 = phi_dbl(1);
169171
Eigen::VectorXd phi_rest = phi_dbl.tail(2);
170172
Eigen::VectorXd phi_01{{phi_0, phi_1}};
171-
const auto [solver_num, hessian_block_size, max_steps_line_search]
172-
= GetParam();
173+
const auto test_params = GetParam();
174+
const auto solver_num = std::get<0>(test_params);
175+
const auto hessian_block_size = std::get<1>(test_params);
176+
const auto max_steps_line_search = std::get<2>(test_params);
173177
constexpr int dim_theta = 2 * n_obs;
174178
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
175179
constexpr stan::test::ad_tolerances tols{
@@ -244,8 +248,10 @@ TEST_P(laplace_motorcyle_gp_test, gp_motorcycle2_val) {
244248
Eigen::VectorXd sigma_vec = phi_dbl.tail(2);
245249
constexpr double tolerance = 1e-12;
246250
constexpr int max_num_steps = 300;
247-
const auto [solver_num, hessian_block_size, max_steps_line_search]
248-
= GetParam();
251+
const auto test_params = GetParam();
252+
const auto solver_num = std::get<0>(test_params);
253+
const auto hessian_block_size = std::get<1>(test_params);
254+
const auto max_steps_line_search = std::get<2>(test_params);
249255
constexpr int dim_theta = 2 * n_obs;
250256
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
251257
laplace_marginal_tol<false>(
@@ -271,8 +277,10 @@ TEST_P(laplace_motorcyle_gp_test, gp_motorcycle2_ad) {
271277
constexpr int max_num_steps = 1000;
272278
Eigen::VectorXd length_scale_vec = phi_dbl.head(2);
273279
Eigen::VectorXd sigma_vec = phi_dbl.tail(2);
274-
const auto [solver_num, hessian_block_size, max_steps_line_search]
275-
= GetParam();
280+
const auto test_params = GetParam();
281+
const auto solver_num = std::get<0>(test_params);
282+
const auto hessian_block_size = std::get<1>(test_params);
283+
const auto max_steps_line_search = std::get<2>(test_params);
276284
constexpr int dim_theta = 2 * n_obs;
277285
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
278286
constexpr stan::test::ad_tolerances tols{

test/unit/math/laplace/laplace_marginal_lpdf_test.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ TEST_P(laplace_marginal_lpdf, poisson_log_phi_dim_2) {
4747

4848
std::vector<int> n_samples = {1, 1};
4949
std::vector<int> sums = {1, 0};
50-
const auto [solver_num, hessian_block_size, max_steps_line_search]
51-
= GetParam();
50+
const auto test_params = GetParam();
51+
const auto solver_num = std::get<0>(test_params);
52+
const auto hessian_block_size = std::get<1>(test_params);
53+
const auto max_steps_line_search = std::get<2>(test_params);
5254
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
5355

5456
double target = laplace_marginal<false>(
@@ -123,8 +125,10 @@ TEST_P(laplace_disease_map_test, laplace_marginal) {
123125
using stan::math::laplace_marginal_tol;
124126
using stan::math::value_of;
125127
using stan::math::var;
126-
const auto [solver_num, hessian_block_size, max_steps_line_search]
127-
= GetParam();
128+
const auto test_params = GetParam();
129+
const auto solver_num = std::get<0>(test_params);
130+
const auto hessian_block_size = std::get<1>(test_params);
131+
const auto max_steps_line_search = std::get<2>(test_params);
128132
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
129133

130134
{
@@ -192,8 +196,10 @@ TEST_P(laplace_marginal_lpdf, bernoulli_logit_phi_dim500) {
192196
Eigen::VectorXd delta_L;
193197
std::vector<double> delta;
194198
Eigen::Matrix<double, Eigen::Dynamic, 1> phi_dbl{{1.6, 1}};
195-
const auto [solver_num, hessian_block_size, max_steps_line_search]
196-
= GetParam();
199+
const auto test_params = GetParam();
200+
const auto solver_num = std::get<0>(test_params);
201+
const auto hessian_block_size = std::get<1>(test_params);
202+
const auto max_steps_line_search = std::get<2>(test_params);
197203
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
198204
double target = laplace_marginal<false>(
199205
bernoulli_logit_likelihood{}, std::forward_as_tuple(y),

test/unit/math/laplace/laplace_marginal_neg_binomial_log_lpmf_test.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ TEST_P(laplace_marginal_neg_binomial_log_lpmf, phi_dim_2) {
3333
std::vector<int> y{1, 0};
3434
std::vector<int> y_index{1, 2};
3535
constexpr double eta_dbl = 100;
36-
const auto [solver_num, hessian_block_size, max_steps_line_search]
37-
= GetParam();
36+
const auto test_params = GetParam();
37+
const auto solver_num = std::get<0>(test_params);
38+
const auto hessian_block_size = std::get<1>(test_params);
39+
const auto max_steps_line_search = std::get<2>(test_params);
3840
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
3941

4042
constexpr double tolerance = 1e-12;
@@ -72,8 +74,10 @@ TEST_P(laplace_disease_map_test, laplace_marginal_neg_binomial_2_log_lpmf) {
7274
using stan::math::to_vector;
7375
using stan::math::value_of;
7476
using stan::math::var;
75-
const auto [solver_num, hessian_block_size, max_steps_line_search]
76-
= GetParam();
77+
const auto test_params = GetParam();
78+
const auto solver_num = std::get<0>(test_params);
79+
const auto hessian_block_size = std::get<1>(test_params);
80+
const auto max_steps_line_search = std::get<2>(test_params);
7781
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
7882
constexpr double eta = 1;
7983

test/unit/math/laplace/laplace_marginal_neg_binomial_log_summary_lpmf_test.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ TEST_P(laplace_marginal_neg_binomial_log_summary_lpmf, phi_dim_2) {
4040
n_per_group[y_index[i] - 1]++;
4141
counts_per_group[y_index[i] - 1] += y[i];
4242
}
43-
const auto [solver_num, hessian_block_size, max_steps_line_search]
44-
= GetParam();
43+
const auto test_params = GetParam();
44+
const auto solver_num = std::get<0>(test_params);
45+
const auto hessian_block_size = std::get<1>(test_params);
46+
const auto max_steps_line_search = std::get<2>(test_params);
4547
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
4648
constexpr double tolerance = 1e-12;
4749
constexpr int max_num_steps = 1000;
@@ -81,8 +83,10 @@ TEST_P(laplace_disease_map_test,
8183
using stan::math::to_vector;
8284
using stan::math::value_of;
8385
using stan::math::var;
84-
const auto [solver_num, hessian_block_size, max_steps_line_search]
85-
= GetParam();
86+
const auto test_params = GetParam();
87+
const auto solver_num = std::get<0>(test_params);
88+
const auto hessian_block_size = std::get<1>(test_params);
89+
const auto max_steps_line_search = std::get<2>(test_params);
8690
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
8791
constexpr double eta = 1;
8892
std::vector<int> n_per_group(theta_0.size(), 0);

test/unit/math/laplace/laplace_marginal_poisson_log_lpmf_test.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ class laplace_marginal_poisson_log_lpmf : public LaplaceAdTest {};
1515

1616
TEST_P(laplace_marginal_poisson_log_lpmf, phi_dim_2) {
1717
constexpr int dim_theta = 2;
18-
const auto [solver_num, hessian_block_size, max_steps_line_search]
19-
= GetParam();
18+
const auto test_params = GetParam();
19+
const auto solver_num = std::get<0>(test_params);
20+
const auto hessian_block_size = std::get<1>(test_params);
21+
const auto max_steps_line_search = std::get<2>(test_params);
2022
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
2123

2224
using stan::math::laplace_marginal_poisson_log_lpmf;
@@ -76,8 +78,10 @@ TEST_P(laplace_marginal_poisson_log_lpmf, phi_dim_2) {
7678

7779
TEST_P(laplace_marginal_poisson_log_lpmf, log_phi_dim_2) {
7880
constexpr int dim_theta = 2;
79-
const auto [solver_num, hessian_block_size, max_steps_line_search]
80-
= GetParam();
81+
const auto test_params = GetParam();
82+
const auto solver_num = std::get<0>(test_params);
83+
const auto hessian_block_size = std::get<1>(test_params);
84+
const auto max_steps_line_search = std::get<2>(test_params);
8185
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
8286
using stan::math::laplace_marginal_poisson_log_lpmf;
8387
using stan::math::laplace_marginal_tol_poisson_log_lpmf;
@@ -148,8 +152,10 @@ struct diag_covariance {
148152

149153
TEST_P(laplace_marginal_poisson_log_lpmf, mean_argument) {
150154
constexpr int dim_theta = 1;
151-
const auto [solver_num, hessian_block_size, max_steps_line_search]
152-
= GetParam();
155+
const auto test_params = GetParam();
156+
const auto solver_num = std::get<0>(test_params);
157+
const auto hessian_block_size = std::get<1>(test_params);
158+
const auto max_steps_line_search = std::get<2>(test_params);
153159
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
154160

155161
// working example from
@@ -179,8 +185,10 @@ TEST_P(laplace_marginal_poisson_log_lpmf, mean_argument) {
179185
LAPLACE_INSTANTIATE_TEST_SUITE_P(laplace_marginal_poisson_log_lpmf);
180186

181187
TEST_P(laplace_disease_map_test, laplace_marginal_poisson_log_lpmf) {
182-
const auto [solver_num, hessian_block_size, max_steps_line_search]
183-
= GetParam();
188+
const auto test_params = GetParam();
189+
const auto solver_num = std::get<0>(test_params);
190+
const auto hessian_block_size = std::get<1>(test_params);
191+
const auto max_steps_line_search = std::get<2>(test_params);
184192
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
185193

186194
using stan::math::laplace_marginal_poisson_log_lpmf;

test/unit/math/laplace/laplace_types_test.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,10 @@ TEST_P(laplace_types, poisson_log_phi_dim_2_tuple_extended) {
135135

136136
std::vector<int> n_samples = {1, 1};
137137
std::vector<int> sums = {1, 0};
138-
const auto [solver_num, hessian_block_size, max_steps_line_search]
139-
= GetParam();
138+
const auto test_params = GetParam();
139+
const auto solver_num = std::get<0>(test_params);
140+
const auto hessian_block_size = std::get<1>(test_params);
141+
const auto max_steps_line_search = std::get<2>(test_params);
140142
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
141143

142144
constexpr double tolerance = 1e-12;
@@ -201,8 +203,10 @@ TEST_P(laplace_types, poisson_log_phi_dim_2_tuple) {
201203

202204
std::vector<int> n_samples = {1, 1};
203205
std::vector<int> sums = {1, 0};
204-
const auto [solver_num, hessian_block_size, max_steps_line_search]
205-
= GetParam();
206+
const auto test_params = GetParam();
207+
const auto solver_num = std::get<0>(test_params);
208+
const auto hessian_block_size = std::get<1>(test_params);
209+
const auto max_steps_line_search = std::get<2>(test_params);
206210
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
207211

208212
constexpr double tolerance = 1e-12;
@@ -296,8 +300,10 @@ TEST_P(laplace_types, poisson_log_phi_dim_2_array_tuple) {
296300

297301
std::vector<int> n_samples = {1, 1};
298302
std::vector<int> sums = {1, 0};
299-
const auto [solver_num, hessian_block_size, max_steps_line_search]
300-
= GetParam();
303+
const auto test_params = GetParam();
304+
const auto solver_num = std::get<0>(test_params);
305+
const auto hessian_block_size = std::get<1>(test_params);
306+
const auto max_steps_line_search = std::get<2>(test_params);
301307
LAPLACE_SKIP_IF_INVALID_TEST_COMBO(hessian_block_size, dim_theta);
302308

303309
constexpr double tolerance = 1e-12;

0 commit comments

Comments
 (0)