Repository navigation
Description
This issue has been communicated in a thread in the Stan forum, but I think it is also worth posting an issue here.
Since the release of CmdStan 2.39, I have been using the newly added embedded Laplace approximation for my logistic-normal-multinomial model. When trying to fit large empirical data, I encountered warnings saying that the maximum iteration in Laplace approximation was reached in laplace_marginal(). So I switched to laplace_marginal_tol() to pass the custom options with larger iteration limits.
I then encountered issues when compiling my Stan model whose error can be replicated by following code:
Expand the code
functions{
// likelihood of latent residual + observation given parameters:
real ll_function(
vector u, // latent ILR residuals
int M, // number of taxa for convenience
array[] int y, // observed counts
vector beta, // ILR mean
matrix Helmert // canonical Helmert matrix constant
) {
real lp = 0;
vector[M] mu = Helmert*(beta+u);
lp += multinomial_logit_lpmf(
y | mu
);
return lp;
}
// distribution of latent residuals
matrix cov_function(
matrix L,
int M
){
return L*L';
}
// canonical Helmert matrix
matrix canonical_Helmert(int M){
matrix[M,M-1] H = rep_matrix(0,M,M-1);
for(m in 1:(M-1)){
H[1:m,m] = rep_vector(-1/sqrt(m*(m+1)),m);
H[m+1,m] = m/sqrt(m*(m+1));
}
return H;
}
real partial_sum_2_lpmf(
// Parallel
array[] int idx_y,
int start,
int end,
// General
array[,] int y, //Sliced, M dimensions
// Variance-Covariance
matrix L, // ILR, M-1 dimensions
// Fixed effects
vector beta, // ILR-transformed, M-1 dimensions
int M,
// Helmert matrix
matrix Helmert,
// Laplace approximation options
data tuple(vector, real, int, int, int, int) laplace_ops
){
int N = end-start+1; // Number of observations subsetted to this chunk
// target log-probability
real target_lp = 0;
for(n in 1:N){
target_lp += laplace_marginal_tol(
ll_function, //custom log-likelihood function with latent residuals
(M,to_array_1d(y[idx_y[n],]),beta,Helmert), //parameters without latent residuals
M-1, // Hessian block size
cov_function, //covariance function for latent residuals
(L,M), // cov_function just converts L to VCoV
laplace_ops // options for laplace approximation
);
}
return target_lp;
}
}
data{
// A minimal set of data and parameters for simplicity
int<lower=1> N;
int<lower=1> M;
array[N, M] int<lower=0> y;
}
transformed data{
// Internal constants
matrix[M,M-1] Helmert = canonical_Helmert(M);
// Laplace approximation
tuple(vector[M-1], real, int, int, int, int) laplace_ops = generate_laplace_options(M-1);
laplace_ops.3 = 1000; // increase from the default 500
// For CPU parallelisation
array[N] int array_N;
for(n in 1:N) array_N[n] = n;
}
parameters{
// ILR means, not constrained
vector[M-1] beta; // Only M-1 degree of freedom
// ILR log-standard deviations, not constrained
vector[M-1] alpha;
// ILR Cholesky factors for correlation matrices
cholesky_factor_corr[M-1] L; // Cholesky factor for correlation matrices
}
transformed parameters{
// Cholesky factor of VCoV
cholesky_factor_cov[M-1] Lv = diag_pre_multiply(exp(alpha),L);
}
model{
// Fit main distribution
for(n in 1:N){
target += reduce_sum(
partial_sum_2_lupmf,
array_N,
1,
// General
y,
// Variance-Covariance
Lv,
// Fixed effects
beta,
M,
// Helmert matrix
Helmert,
// Laplace approximation options
laplace_ops
);
}
// Priors variability
alpha ~ std_normal();
// Priors abundance
beta ~ std_normal();
// (Hyper-)priors for the correlation matrices
L ~ lkj_corr_cholesky(2.0);
}
Specifically, the Stan model above will prompt an error when compiling with the default cmdstanr options:
library(cmdstanr)
# prompts error that can be addressed by manual changes to Stan Math library
single_thread_model = = cmdstan_model(stan_file = "laplace_approximation_compiling_error_example.stan")with error messages:
Expand error message
Compiling Stan program...
In file included from /var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:3:
In file included from stan/lib/stan_math/stan/math/mix.hpp:10:
In file included from stan/lib/stan_math/stan/math/mix/functor.hpp:11:
In file included from stan/lib/stan_math/stan/math/mix/functor/laplace_base_rng.hpp:5:
In file included from stan/lib/stan_math/stan/math/mix/functor/laplace_marginal_density.hpp:5:
stan/lib/stan_math/stan/math/mix/functor/laplace_marginal_density_estimator.hpp:157:30: error: no matching function for call to 'forward'
157 | value_of(std::get<0>(std::forward<Ops>(ops))),
| ^~~~~~~~~~~~~~~~~
stan/lib/stan_math/stan/math/mix/prob/laplace_marginal.hpp:38:19: note: in instantiation of function template specialization 'stan::math::internal::tuple_to_laplace_options<const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
38 | = internal::tuple_to_laplace_options(std::forward<OpsTuple>(ops));
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1401:23: note: in instantiation of function template specialization 'stan::math::laplace_marginal_tol<false, glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::ll_function_functor__, std::tuple<const int &, std::vector<int> &&, const int &, const Eigen::Matrix<double, -1, -1> &, Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, 1, true> &&, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &>, glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::cov_function_functor__, std::tuple<const Eigen::Matrix<double, -1, -1> &, const int &>, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
1401 | stan::math::laplace_marginal_tol(ll_function_functor__(),
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/Rtmp
mH8MbS/model-5fad2d23e8fa.hpp:531:12: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf<false, std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<double, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<double, -1, -1>>, int, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
531 | return partial_sum_2_lpmf<propto__>(idx_y, (start + 1), (end + 1),
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:216:10: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf_rsfunctor__<false>::operator()<std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<double, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<double, -1, -1>>, int, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
216 | return ReduceFunction()(std::forward<Vec>(vmapped), 0, vmapped.size() - 1,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:2676:12: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob_impl<false, false, Eigen::Matrix<double, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
2676 | return log_prob_impl<propto__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp:93:50: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob<false, false, double>' requested here
93 | return static_cast<const M*>(this)->template log_prob<false, false, double>(
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1467:3: note: in instantiation of member function 'stan::model::model_base_crtp<gl
m_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model>::log_prob' requested here
1467 | ~glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model()
| ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__utility/forward.h:25:1: note: candidate function template not viable: 1st argument ('const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>') would lose const qualifier
25 | forward(_LIBCPP_LIFETIMEBOUND __libcpp_remove_reference_t<_Tp>& __t) _NOEXCEPT {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__utility/forward.h:31:1: note: candidate function template not viable: 1st argument ('const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>') would lose const qualifier
31 | forward(_LIBCPP_LIFETIMEBOUND __libcpp_remove_reference_t<_Tp>&& __t) _NOEXCEPT {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:3:
In file included from stan/lib/stan_math/stan/math/mix.hpp:33:
In file included from stan/lib/stan_math/stan/math/mix/prob.hpp:8:
stan/lib/stan_math/stan/math/mix/prob/laplace_marginal.hpp:38:9: error: no matching function for call to 'tuple_to_laplace_options'
38 | = internal::tuple_to_laplace_options(std::forward<OpsTuple>(ops));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1401:23: note: in instantiation of function template specialization 'stan::math::laplace_marginal_tol<false, glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::ll_function_functor__, std::tuple<const int &, std::vector<int> &&, const int &, const Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Block<Eigen::Matrix<stan::math::var_value<double>, -1, -1>, -1, 1, true> &&, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &>, glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::cov_function_functor__, std::tuple<const Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, const int &>, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
1401 | stan::math::laplace_marginal_tol(ll_function_functor__(),
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:531:12: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf<false, std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, in
t, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
531 | return partial_sum_2_lpmf<propto__>(idx_y, (start + 1), (end + 1),
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:216:10: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf_rsfunctor__<false>::operator()<std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, int, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
216 | return ReduceFunction()(std::forward<Vec>(vmapped), 0, vmapped.size() - 1,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:2676:12: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob_impl<false, false, Eigen::Matrix<stan::math::var_value<double>, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
2676 | return log_prob_impl<propto__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp:98:50: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob<false, false, stan::math::var_value<doubl
e>>' requested here
98 | return static_cast<const M*>(this)->template log_prob<false, false>(theta,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1467:3: note: in instantiation of member function 'stan::model::model_base_crtp<glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model>::log_prob' requested here
1467 | ~glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model()
| ^
stan/lib/stan_math/stan/math/mix/functor/laplace_marginal_density_estimator.hpp:110:23: note: candidate template ignored: substitution failure [with Options = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
110 | inline constexpr auto tuple_to_laplace_options(Options&& ops) {
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1401:11: error: no matching function for call to 'laplace_marginal_tol'
1401 | stan::math::laplace_marginal_tol(ll_function_functor__(),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:531:12: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf<true, std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<double, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<double, -1, -1>>, int, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
531 | return partial_sum_2_lpmf<propto__>(idx_y, (start + 1), (end + 1),
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:216:10: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf_rsfunctor__<true>::operator()<std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<double, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<double, -1, -1>>, int, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
216 | return ReduceFunction()(std::forward<Vec>(vmapped), 0, vmapped.size() - 1,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:2676:12: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_app
roximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob_impl<true, false, Eigen::Matrix<double, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
2676 | return log_prob_impl<propto__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp:115:50: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob<true, false, double>' requested here
115 | return static_cast<const M*>(this)->template log_prob<true, false>(theta,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1467:3: note: in instantiation of member function 'stan::model::model_base_crtp<glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model>::log_prob_propto' requested here
1467 | ~glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model()
| ^
stan/lib/stan_math/stan/math/mix/prob/laplace_marginal.hpp:32:13:
note: candidate template ignored: substitution failure [with propto = false, LFun = ll_function_functor__, LArgs = tuple<const int &, vector<int, allocator<int>> &&, const int &, const Matrix<double, -1, -1, 0, -1, -1> &, Block<Matrix<double, -1, -1, 0, -1, -1>, -1, 1, true> &&, const Map<Matrix<double, -1, -1, 0, -1, -1>, 0, Stride<0, 0>> &>, CovarFun = cov_function_functor__, CovarArgs = tuple<const Matrix<double, -1, -1, 0, -1, -1> &, const int &>, OpsTuple = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
32 | inline auto laplace_marginal_tol(LFun&& L_f, LArgs&& l_args,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1401:11: error: no matching function for call to 'laplace_marginal_tol'
1401 | stan::math::laplace_marginal_tol(ll_function_functor__(),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:531:12: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf<true, std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, int, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
531 | return partial_sum_2_lpmf<propto__>(idx_y, (start + 1), (end + 1),
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:216:10: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::partial_sum_2_lpmf_rsfunctor__<true>::operator()<std::vector<int>, int, unsigned long, int, std::vector<std::vector<int>>, std::vector<int>, std::vector<std::vector<double>>, std::vector<Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, Eigen::Transpose<const Eigen::Matrix<stan::math::var_value<double>, -1, -1>>, int, Eigen::Map<Eigen::Matrix<double, -1, -1>>, std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>, nullptr>' requested here
216 | return ReduceFunction()(std::forward<Vec>(vmapped), 0, vmapped.size() - 1,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:2676:12: note: in instantiation of fu
nction template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob_impl<true, false, Eigen::Matrix<stan::math::var_value<double>, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
2676 | return log_prob_impl<propto__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp:120:50: note: in instantiation of function template specialization 'glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model::log_prob<true, false, stan::math::var_value<double>>' requested here
120 | return
static_cast<const M*>(this)->template log_prob<true, false>(theta,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.hpp:1467:3: note: in instantiation of member function 'stan::model::model_base_crtp<glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model_namespace::glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model>::log_prob_propto' requested here
1467 | ~glm_logistic_normal_multinomial_isometric_single_laplace_approximation_model()
| ^
stan/lib/stan_math/stan/math/mix/prob/laplace_marginal.hpp:32:13: note: candidate template ignored: substitution failure [with propto = false, LFun = ll_function_functor__, LArgs = tuple<const int &, vector<int, allocator<int>> &&, const int &, const Matrix<var_value<double, void>, -1, -1, 0, -1, -1> &, Block<Matrix<var_value<double, void>, -1, -1, 0, -1, -1>, -1, 1, true> &&, const Map<Matrix<double, -1, -1, 0, -1, -1>, 0, Stride<0, 0>> &>, CovarFun = cov_function_functor__, CovarArgs = tuple<const Matrix<var_value<double, void>, -1, -1, 0, -1, -1> &, const int &>, OpsTuple = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
32 | inline auto laplace_marginal_tol(LFun&& L_f, LArgs&& l_args,
| ^
4 errors generated.
make: *** [/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpmH8MbS/model-5fad2d23e8fa.o] Error 1
As discussed in the Stan forum thread referenced above, this error can be addressed by manually editing the Stan Math library, and the compilation can finish without error and the compiled program runs OK.
However, even with the manual patch, the same code will prompt errors when trying to compile a multi-thread version for CPU-acceleration:
# prompt a similar but different error
multi_thread_model = cmdstan_model(
stan_file = "laplace_approximation_compiling_error_example.stan",
cpp_options=list(stan_threads=TRUE))with error messages:
Expand error message
Compiling Stan program...
In file included from /var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_header.hpp:6:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math.hpp:19:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev.hpp:15:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor.hpp:30:
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:36:31: error: no matching function for call to 'deep_copy_vars'
36 | = std::tuple<decltype(deep_copy_vars(std::declval<Args>()))...>;
| ^~~~~~~~~~~~~~
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:58:23: note: in instantiation of member class 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<false>, void, stan::math::var_value<double>, const std::vector<int> &, const std::vector<std::vector<int>> &, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>::scoped_args_tuple' requested here
58 | scoped_args_tuple local_args_tuple_scope_;
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:247:23: note: in instantiation of member class 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<false>, void, stan::math::var_value<double>, const std::vector<int> &, const std::vector<std::vector<int>> &, Eigen::Matrix<stan:
:math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>::recursive_reducer' requested here
247 | recursive_reducer worker(num_vars_per_term, num_vars_shared_terms, partials,
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:207:10: note: in instantiation of member function 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<false>, void, stan::math::var_value<double>, const std::vector<int> &, const std::vector<std::vector<int>> &, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>::operator()' requested here
207 | return internal::reduce_sum_impl<ReduceFunction, void, return_type, Vec,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1042:12: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob_impl<false, false, Eigen::Matrix<stan::math::var_value<double>, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
1042 | return log_prob_impl<prop
to__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp:98:50: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob<false, false, stan::math::var_value<double>>' requested here
98 | return static_cast<const M*>(this)->template log_prob<false, false>(theta,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:432:3: note: in instantiation of member function 'stan::model::model_base_crtp<laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model>::log_prob' requested here
432 | ~laplace_approximation_compiling_error_example_model() {}
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:33:13: note: candidate function not viable: no known conversion from 'const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>' to 'const var' (aka 'const var_value<double>') for 1st argument
33 | inline auto deep_copy_vars(const var& arg) {
| ^ ~~~~~~~~~~~~~~
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:23:14: note: candidate template ignored: requirement 'is_arithmetic<std::tuple<Eigen::Matrix<double, -1, 1, 0, -1, 1>, double, int, int, int, int>>::value' was not satisfied [with Arith = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
23 | inline Arith deep_copy_vars(Arith&& arg) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:45:13: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with VarVec
= const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
45 | inline auto deep_copy_vars(VarVec&& arg) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:63:13: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with VecContainer = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
63 | inline auto deep_copy_vars(VecContainer&& arg) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:79:13: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with EigT = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
79 | inline auto deep_copy_vars(EigT&& arg) {
| ^
In file included from /var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_header.hpp:4:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base.hpp:8:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core.hpp:13:
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/count_vars.hpp:129:10: error: call to function 'count_vars_impl' that is neither visible in the template definition nor found by argument-dependent lookup
129 | return count_vars_impl(count, std::forward<Pargs>(args)...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/count_vars.hpp:129:10: note: in instantiation of function template specialization 'stan::math::internal::count_vars_impl<const Eigen::Map<Eigen::Matrix<double, -1, -1>>, nullptr, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/count_vars.hpp:93:10: note: in instantiation of function template specialization 'stan::math::internal::count_vars_impl<const int, nullptr, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
93 | return count_vars_impl(count + x.size(), std::forward<Pargs>(args)...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/count_vars.hpp:93:10: note: in instantiation of function template specialization 'stan::math::internal::count_vars_impl<Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, nullptr, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
/Users
/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/count_vars.hpp:129:10: note: in instantiation of function template specialization 'stan::math::internal::count_vars_impl<Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, nullptr, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
129 | return count_vars_impl(count, std::forward<Pargs>(args)...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/count_vars.hpp:162:20: note: in instantiation of function template specialization 'stan::math::internal::count_vars_impl<const std::vector<std::vector<int>>, nullptr, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
162 | return internal::count_vars_impl(0, std::forward<Pargs>(args)...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:233:47: note: in instantiation of function template specialization 'stan::math::count_vars<const std::vector<std::vector<int>> &, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
233 | const std::size_t num_vars_shared_terms = count_vars(args...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:207:10: note: in instantiation of member function 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<false>, void, stan::math::var_value<double>, const std::vector<int> &, const std::vector<std::vector<int>> &, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>
, double, int, int, int, int> &>::operator()' requested here
207 | return internal::reduce_sum_impl<ReduceFunction, void, return_type, Vec,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1042:12: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob_impl<false, false, Eigen::Matrix<stan::math::var_value<double>, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
1042 | return log_prob_impl<propto__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp:98:50: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob<false, false, stan::math::var_value<double>>' requested here
98 | return static_cast<const M*>(this)->template log_prob<false, false>(theta,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:432:3: note: in instantiation of member function 'stan::model::model_base_crtp<laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model>::log_prob' requested here
432 | ~laplace_approximation_compiling_error_example_model() {}
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/count_vars.hpp:141:15: note: 'count_vars_impl' should be declared prior to the call site or in namespace 'Eigen'
141 | inline size_t count_vars_impl(std::size_t count,
| ^
In file included from /var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_header.hpp:4:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base.hpp:8:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core.hpp:79:
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:136:10: error: no matching function for call to 'save_varis'
136 | return save_varis(dest, std::forward<Pargs>(args)...);
| ^~~~~~~~~~
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:136:10: note: in instantiation of function template specialization 'stan::math::save_varis<const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, nullptr, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:118:10: note: in instantiation of function template specialization 'stan::math::save_varis<const int &, nullptr, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
118 | return save_varis(d
est + x.size(), std::forward<Pargs>(args)...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:118:10: note: in instantiation of function template specialization 'stan::math::save_varis<Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, nullptr, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:136:10: note: in instantiation of function template specialization 'stan::math::save_varis<Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, nullptr, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
136 | return save_varis(dest, std::forward<Pargs>(args)...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:241:5: note: in instantiation of function template specialization 'stan::math::save_varis<const std::vector<std::vector<int>> &, nullptr, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>' requested here
241 | save_varis(varis + num_vars_sliced_terms, args...);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:207:10: note: in instantiation of member function 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<false>, void, stan::math::var_value<double>, const std::vector<int>
&, const std::vector<std::vector<int>> &, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>::operator()' requested here
207 | return internal::reduce_sum_impl<ReduceFunction, void, return_type, Vec,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1042:12: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob_impl<false, false, Eigen::Matrix<stan::math::var_value<double>, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
1042 | return log_prob_impl<propto__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp:98:50: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob<false, false, stan::math::var_value<double>>' requested here
98 | return static_cast<const M*>(this)->template log_prob<false, false>(theta,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:432:3: note: in instantiation of member function 'stan::model::model_base_crtp<laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model>::log_prob' requested here
432 | ~laplace_approximation_compiling_error_example_model() {}
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:51:15: note: candidate function template not viable: no known conversion fr
om 'const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>' to 'const var' (aka 'const var_value<double>') for 2nd argument
51 | inline vari** save_varis(vari** dest, const var& x, Pargs&&... args) {
| ^ ~~~~~~~~~~~~
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:71:15: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with VarVec = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
71 | inline vari** save_varis(vari** dest, VarVec&& x, Pargs&&... args) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:93:15: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with VecContainer = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
93 | inline vari** save_varis(vari** dest, VecContainer&& x, Pargs&&... args) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:114:15: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with EigT = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
114 | inline vari** save_varis(vari** dest, EigT&& x, Pargs&&... args) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_varis.hpp:135:15: note: candidate template ignored: requirement 'is_arithmetic<std::tuple<double, double, int, int, int, int>>::value' was not satisfied [with Arith = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
135 | inline vari** save_varis(vari** dest, Arith&& x, Pargs&&... args) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/save_vari
s.hpp:36:15: note: candidate function not viable: requires single argument 'dest', but 2 arguments were provided
36 | inline vari** save_varis(vari** dest);
| ^ ~~~~~~~~~~~
In file included from /var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_header.hpp:6:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math.hpp:19:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev.hpp:15:
In file included from /Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor.hpp:30:
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:36:31: error: no matching function for call to 'deep_copy_vars'
36 | = std::tuple<decltype(deep_copy_vars(std::declval<Args>()))...>;
| ^~~~~~~~~~~~~~
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:58:23: note: in instantiation of member class 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<true>, void, stan::math::var_value<double>, const std::vector<int> &, const std::vector<std::vector<int>> &, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>::scoped_args_tuple' requested here
58 | scoped_args_tuple local_args_tuple_scope_;
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/functor/reduce_sum.hpp:247:23: note: in instantiation of member class 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<true>, void, stan::math::var_value<double>, const std::vector<int> &, const std::vector<std::vector<int>> &, Eigen::Matrix<stan::m
ath::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>::recursive_reducer' requested here
247 | recursive_reducer worker(num_vars_per_term, num_vars_shared_terms, partials,
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/prim/functor/reduce_sum.hpp:207:10: note: in instantiation of member function 'stan::math::internal::reduce_sum_impl<laplace_approximation_compiling_error_example_model_namespace::partial_sum_2_lpmf_rsfunctor__<true>, void, stan::math::var_value<double>, const std::vector<int> &, const std::vector<std::vector<int>> &, Eigen::Matrix<stan::math::var_value<double>, -1, -1> &, Eigen::Map<const Eigen::Matrix<stan::math::var_value<double>, -1, 1>> &, const int &, const Eigen::Map<Eigen::Matrix<double, -1, -1>> &, const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &>::operator()' requested here
207 | return internal::reduce_sum_impl<ReduceFunction, void, return_type, Vec,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:1042:12: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob_impl<true, false, Eigen::Matrix<stan::math::var_value<double>, -1, 1>, Eigen::Matrix<int, -1, 1>, nullptr, nullptr, nullptr>' requested here
1042 | return log_prob_impl<propto__, jacobian__>(params_r, params_i, pstream);
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/src/stan/model/model_base_crtp.hpp
:120:50: note: in instantiation of function template specialization 'laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model::log_prob<true, false, stan::math::var_value<double>>' requested here
120 | return static_cast<const M*>(this)->template log_prob<true, false>(theta,
| ^
/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.hpp:432:3: note: in instantiation of member function 'stan::model::model_base_crtp<laplace_approximation_compiling_error_example_model_namespace::laplace_approximation_compiling_error_example_model>::log_prob_propto' requested here
432 | ~laplace_approximation_compiling_error_example_model() {}
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:33:13: note: candidate function not viable: no known conversion from 'const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int>' to 'const var' (aka 'const var_value<double>') for 1st argument
33 | inline auto deep_copy_vars(const var& arg) {
| ^ ~~~~~~~~~~~~~~
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:23:14: note: candidate template ignored: requirement 'is_arithmetic<std::tuple<Eigen::Matrix<double, -1, 1, 0, -1, 1>, double, int, int, int, int>>::value' was not satisfied [with Arith = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
23 | inline Arith deep_copy_vars(Arith&& arg) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:45:13: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with VarVec = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
45 | inline auto deep_copy_vars(VarVec&& arg) {
|
^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:63:13: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with VecContainer = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
63 | inline auto deep_copy_vars(VecContainer&& arg) {
| ^
/Users/myusername/.cmdstan/cmdstan-2.39.0/stan/lib/stan_math/stan/math/rev/core/deep_copy_vars.hpp:79:13: note: candidate template ignored: requirement 'integral_constant<bool, false>::value' was not satisfied [with EigT = const std::tuple<Eigen::Matrix<double, -1, 1>, double, int, int, int, int> &]
79 | inline auto deep_copy_vars(EigT&& arg) {
| ^
4 errors generated.
make: *** [/var/folders/11/bb8zxz8j0fx1lv3_s0mbhkr00000gp/T/RtmpMv3O97/model-67d3359827bf.o] Error 1
Multi-threading will be critical for fitting empirical data in a reasonable time, so I would like to report this issue here and I hope this can be addressed in a future release of CmdStan.
Activity
gaoyingnan-academic commentedon Jul 14, 2026
I just realised that the PR math#3330 regarding the first single-thread issue has already been merged. (Sorry that I did not check after June 7th.) So only the multi-thread issue remains.
I have very limited knowledge on C++, so I again fed the error message to ChatGPT and the feedback suggests that the tuple overloads needs to be added to the 3 functions:
deep_copy_vars,count_vars, andsave_varissoreduce_sumcan handle Laplace options passed as a tuple properly.I hope this piece of information will help, and thanks again for fixing the issues!
bob-carpenter commentedon Jul 14, 2026
Thanks for not just dumping all the ChatGPT output!
I'm pretty sure this is going to need to be moved to the
mathorstanlibrary, but I'll let @SteveBronder do that as he's the best equipped to deal with the C++ issues.[-]Error when compiling laplace_marginal_tol() in single-thread and multi-thread Stan models[/-][+]Error when compiling laplace_marginal_tol() in multi-thread Stan models[/+]WardBrian commentedon Aug 17, 2026
Based on the error blaming
deep_copy_varsI suspect this could be a duplicate of #3041@SteveBronder didn't you think you had a solution to that one at some point? Would be nice to revisit before the release next month