Automatic Differentiation
 
Loading...
Searching...
No Matches
laplace_base_rng.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_MIX_FUNCTOR_LAPLACE_BASE_RNG_HPP
2#define STAN_MATH_MIX_FUNCTOR_LAPLACE_BASE_RNG_HPP
3
9
10namespace stan {
11namespace math {
12
43template <bool ReturnMeanAndCovCholesky = false, typename LLFunc,
44 typename LLArgs, typename CovarFun, typename CovarArgs,
45 bool InitTheta, typename RNG,
46 require_t<is_all_arithmetic_scalar<CovarArgs, LLArgs>>* = nullptr>
47inline auto laplace_base_rng(LLFunc&& ll_fun, LLArgs&& ll_args,
48 CovarFun&& covariance_function,
49 CovarArgs&& covar_args,
50 const laplace_options<InitTheta>& options,
51 RNG& rng, std::ostream* msgs) {
52 Eigen::MatrixXd covariance_train = stan::math::apply(
53 [msgs, &covariance_function](auto&&... args) {
54 return covariance_function(std::forward<decltype(args)>(args)..., msgs);
55 },
56 std::forward<CovarArgs>(covar_args));
58 ll_fun, std::forward<LLArgs>(ll_args), covariance_train, options, msgs);
59 Eigen::VectorXd mean_train = covariance_train * md_est.theta_grad;
60 if (options.solver == 1 || options.solver == 2) {
61 Eigen::MatrixXd V_dec
62 = md_est.L.template triangularView<Eigen::Lower>().solve(
63 md_est.W_r * covariance_train);
64 Eigen::MatrixXd Sigma = covariance_train - V_dec.transpose() * V_dec;
65 if constexpr (ReturnMeanAndCovCholesky) {
66 Eigen::MatrixXd Sigma_chol = cholesky_decompose(Sigma);
67 return std::make_tuple(std::move(mean_train), std::move(Sigma_chol));
68 } else {
69 return multi_normal_rng(std::move(mean_train), std::move(Sigma), rng);
70 }
71 } else {
72 Eigen::MatrixXd Sigma
73 = covariance_train
74 - covariance_train
75 * (md_est.W_r
76 - md_est.W_r
77 * md_est.LU.solve(covariance_train * md_est.W_r))
78 * covariance_train;
79 if constexpr (ReturnMeanAndCovCholesky) {
80 Eigen::MatrixXd Sigma_chol = cholesky_decompose(Sigma);
81 return std::make_tuple(std::move(mean_train), std::move(Sigma_chol));
82 } else {
83 return multi_normal_rng(std::move(mean_train), std::move(Sigma), rng);
84 }
85 }
86}
87
88} // namespace math
89} // namespace stan
90
91#endif
StdVectorBuilder< true, Eigen::VectorXd, T_loc >::type multi_normal_rng(const T_loc &mu, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > &S, RNG &rng)
Return a multivariate normal random variate with the given location and covariance using the specifie...
Reference for calculations of marginal and its gradients: Margossian et al (2020),...
auto laplace_marginal_density_est(LLFun &&ll_fun, LLTupleArgs &&ll_args, CovarMat &&covariance, const laplace_options< InitTheta > &options, std::ostream *msgs)
For a latent Gaussian model with hyperparameters phi and latent variables theta, and observations y,...
auto laplace_base_rng(LLFunc &&ll_fun, LLArgs &&ll_args, CovarFun &&covariance_function, CovarArgs &&covar_args, const laplace_options< InitTheta > &options, RNG &rng, std::ostream *msgs)
In a latent gaussian model,.
matrix_cl< double > cholesky_decompose(const matrix_cl< double > &A)
Returns the lower-triangular Cholesky factor (i.e., matrix square root) of the specified square,...
constexpr decltype(auto) apply(F &&f, Tuple &&t, PreArgs &&... pre_args)
Definition apply.hpp:51
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...