Skip to content

Error when compiling laplace_marginal_tol() in single-thread and multi-thread Stan models #1343

Description

@gaoyingnan-academic

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.

Metadata

Metadata

Assignees

Labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions