1 #ifndef STAN_MATH_REV_MAT_FUN_LOG_SUM_EXP_HPP 2 #define STAN_MATH_REV_MAT_FUN_LOG_SUM_EXP_HPP 18 template <
int R,
int C>
19 double log_sum_exp_as_double(
const Eigen::Matrix<var, R, C>& x) {
20 using std::numeric_limits;
23 double max = -numeric_limits<double>::infinity();
24 for (
int i = 0; i < x.size(); ++i)
28 for (
int i = 0; i < x.size(); ++i)
29 if (x(i) != -numeric_limits<double>::infinity())
30 sum +=
exp(x(i).val() -
max);
31 return max +
log(sum);
34 class log_sum_exp_matrix_vari :
public op_matrix_vari {
36 template <
int R,
int C>
37 explicit log_sum_exp_matrix_vari(
const Eigen::Matrix<var, R, C>& x) :
38 op_matrix_vari(log_sum_exp_as_double(x), x) {
41 for (
size_t i = 0; i <
size_; ++i) {
53 template <
int R,
int C>
55 return var(
new log_sum_exp_matrix_vari(x));
fvar< T > sum(const std::vector< fvar< T > > &m)
Return the sum of the entries of the specified standard vector.
fvar< T > log(const fvar< T > &x)
Independent (input) and dependent (output) variables for gradients.
fvar< T > log_sum_exp(const std::vector< fvar< T > > &v)
fvar< T > exp(const fvar< T > &x)
int max(const std::vector< int > &x)
Returns the maximum coefficient in the specified column vector.
double calculate_chain(double x, double val)