1 #ifndef STAN_MATH_PRIM_MAT_PROB_DIRICHLET_RNG_HPP
2 #define STAN_MATH_PRIM_MAT_PROB_DIRICHLET_RNG_HPP
4 #include <boost/math/special_functions/gamma.hpp>
5 #include <boost/random/gamma_distribution.hpp>
6 #include <boost/random/uniform_real_distribution.hpp>
7 #include <boost/random/variate_generator.hpp>
44 inline Eigen::VectorXd
47 using boost::variate_generator;
48 using boost::gamma_distribution;
49 using boost::random::uniform_real_distribution;
50 using Eigen::VectorXd;
55 if (alpha.minCoeff() < 1) {
56 variate_generator<RNG&, uniform_real_distribution<> >
57 uniform_rng(rng, uniform_real_distribution<>(0.0, 1.0));
58 VectorXd log_y(alpha.size());
59 for (
int i = 0; i < alpha.size(); ++i) {
60 variate_generator<RNG&, gamma_distribution<> >
61 gamma_rng(rng, gamma_distribution<>(alpha(i) + 1, 1));
66 VectorXd theta(alpha.size());
67 for (
int i = 0; i < alpha.size(); ++i)
68 theta(i) =
exp(log_y(i) - log_sum_y);
73 Eigen::VectorXd y(alpha.rows());
74 for (
int i = 0; i < alpha.rows(); i++) {
75 variate_generator<RNG&, gamma_distribution<> >
76 gamma_rng(rng, gamma_distribution<>(alpha(i, 0), 1
e-7));
double gamma_rng(const double alpha, const double beta, RNG &rng)
fvar< T > log(const fvar< T > &x)
fvar< T > log_sum_exp(const std::vector< fvar< T > > &v)
Eigen::VectorXd dirichlet_rng(const Eigen::Matrix< double, Eigen::Dynamic, 1 > &alpha, RNG &rng)
Return a draw from a Dirichlet distribution with specified parameters and pseudo-random number genera...
fvar< T > exp(const fvar< T > &x)
double uniform_rng(const double alpha, const double beta, RNG &rng)
double e()
Return the base of the natural logarithm.