1 #ifndef STAN__AGRAD__REV__FUNCTIONS__LOG_SUM_EXP_HPP
2 #define STAN__AGRAD__REV__FUNCTIONS__LOG_SUM_EXP_HPP
18 double log_sum_exp_as_double(
const std::vector<var>& x) {
19 using std::numeric_limits;
22 double max = -numeric_limits<double>::infinity();
23 for (
size_t i = 0; i < x.size(); ++i)
27 for (
size_t i = 0; i < x.size(); ++i)
28 if (x[i] != -numeric_limits<double>::infinity())
29 sum +=
exp(x[i].val() -
max);
30 return max +
log(sum);
33 class log_sum_exp_vv_vari :
public op_vv_vari {
35 log_sum_exp_vv_vari(vari* avi, vari* bvi) :
36 op_vv_vari(stan::math::
log_sum_exp(avi->val_, bvi->val_),
44 class log_sum_exp_vd_vari :
public op_vd_vari {
46 log_sum_exp_vd_vari(vari* avi,
double b) :
54 class log_sum_exp_dv_vari :
public op_dv_vari {
56 log_sum_exp_dv_vari(
double a, vari* bvi) :
65 class log_sum_exp_vector_vari :
public op_vector_vari {
67 log_sum_exp_vector_vari(
const std::vector<var>& x) :
68 op_vector_vari(log_sum_exp_as_double(x), x) {
71 for (
size_t i = 0; i <
size_; ++i) {
83 return var(
new log_sum_exp_vv_vari(a.
vi_, b.
vi_));
90 return var(
new log_sum_exp_vd_vari(a.
vi_, b));
97 return var(
new log_sum_exp_dv_vari(a, b.
vi_));
103 return var(
new log_sum_exp_vector_vari(x));
fvar< T > log_sum_exp(const fvar< T > &x1, const fvar< T > &x2)
double max(const double a, const double b)
fvar< T > sum(const Eigen::Matrix< fvar< T >, R, C > &m)
vari * vi_
Pointer to the implementation of this variable.
double calculate_chain(const double &x, const double &val)
Independent (input) and dependent (output) variables for gradients.
fvar< T > log(const fvar< T > &x)
fvar< T > exp(const fvar< T > &x)