Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
log_sum_exp.hpp
Go to the documentation of this file.
1 #ifndef STAN__AGRAD__FWD__FUNCTIONS__LOG_SUM_EXP_HPP
2 #define STAN__AGRAD__FWD__FUNCTIONS__LOG_SUM_EXP_HPP
3 
5 #include <stan/meta/traits.hpp>
7 
8 namespace stan {
9 
10  namespace agrad {
11 
12  template <typename T>
13  inline
14  fvar<T>
15  log_sum_exp(const fvar<T>& x1, const fvar<T>& x2) {
17  using std::exp;
18  return fvar<T>(log_sum_exp(x1.val_, x2.val_),
19  x1.d_ / (1 + exp(x2.val_ - x1.val_))
20  + x2.d_ / (exp(x1.val_ - x2.val_) + 1));
21  }
22 
23  template <typename T>
24  inline
25  fvar<T>
26  log_sum_exp(const double x1, const fvar<T>& x2) {
28  using std::exp;
29  return fvar<T>(log_sum_exp(x1, x2.val_),
30  x2.d_ / (exp(x1 - x2.val_) + 1));
31  }
32 
33  template <typename T>
34  inline
35  fvar<T>
36  log_sum_exp(const fvar<T>& x1, const double x2) {
38  using std::exp;
39  return fvar<T>(log_sum_exp(x1.val_, x2),
40  x1.d_ / (1 + exp(x2 - x1.val_)));
41  }
42 
43  template <typename T>
44  fvar<T>
45  log_sum_exp(const std::vector<fvar<T> >& v) {
47  using std::exp;
48  std::vector<T> vals(v.size());
49  for (size_t i = 0; i < v.size(); ++i)
50  vals[i] = v[i].val_;
51  T deriv(0.0);
52  T denominator(0.0);
53  for (size_t i = 0; i < v.size(); ++i) {
54  T exp_vi = exp(vals[i]);
55  denominator += exp_vi;
56  deriv += v[i].d_ * exp_vi;
57  }
58  return fvar<T>(log_sum_exp(vals), deriv / denominator);
59  }
60 
61  }
62 }
63 #endif
fvar< T > log_sum_exp(const fvar< T > &x1, const fvar< T > &x2)
Definition: log_sum_exp.hpp:15
boost::math::tools::promote_args< T1, T2 >::type log_sum_exp(const T2 &a, const T1 &b)
Calculates the log sum of exponetials without overflow.
Definition: log_sum_exp.hpp:49
fvar< T > exp(const fvar< T > &x)
Definition: exp.hpp:16

     [ Stan Home Page ] © 2011–2014, Stan Development Team.