Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
gamma_p.hpp
Go to the documentation of this file.
1 #ifndef STAN__AGRAD__FWD__FUNCTIONS__GAMMA_P_HPP
2 #define STAN__AGRAD__FWD__FUNCTIONS__GAMMA_P_HPP
3 
5 #include <stan/meta/traits.hpp>
8 
9 namespace stan{
10 
11  namespace agrad{
12 
13  template <typename T>
14  inline
15  fvar<T>
16  gamma_p(const fvar<T>& x1, const fvar<T>& x2){
17  using stan::math::gamma_p;
18  using std::log;
19  using std::exp;
20  using std::pow;
21  using std::fabs;
22  using boost::math::tgamma;
24 
25  T u = gamma_p(x1.val_, x2.val_);
26 
27  T S = 0;
28  T s = 1;
29  T l = log(x2.val_);
30  T g = tgamma(x1.val_);
31  T dig = digamma(x1.val_);
32 
33  int k = 0;
34  T delta = s / (x1.val_ * x1.val_);
35 
36  while (fabs(delta) > 1e-6) {
37  S += delta;
38  ++k;
39  s *= -x2.val_ / k;
40  delta = s / ((k + x1.val_) * (k + x1.val_));
41  }
42 
43  T der1 = (u) * ( dig - l ) + exp( x1.val_ * l ) * S / g;
44  T der2 = exp(-x2.val_) * pow(x2.val_, x1.val_ - 1.0) / g;
45 
46  return fvar<T>(u,x1.d_ * -der1 + x2.d_ * der2);
47  }
48 
49  template <typename T>
50  inline
51  fvar<T>
52  gamma_p(const fvar<T>& x1, const double x2){
53  using stan::math::gamma_p;
54  using std::log;
55  using std::exp;
56  using std::pow;
57  using std::fabs;
58  using boost::math::tgamma;
60 
61  T u = gamma_p(x1.val_, x2);
62 
63  T S = 0.0;
64  double s = 1.0;
65  double l = log(x2);
66  T g = tgamma(x1.val_);
67  T dig = digamma(x1.val_);
68 
69  int k = 0;
70  T delta = s / (x1.val_ * x1.val_);
71 
72  while (fabs(delta) > 1e-6) {
73  S += delta;
74  ++k;
75  s *= -x2 / k;
76  delta = s / ((k + x1.val_) * (k + x1.val_));
77  }
78 
79  T der1 = (u) * ( dig - l ) + exp( x1.val_ * l ) * S / g;
80 
81  return fvar<T>(u, x1.d_ * -der1);
82  }
83 
84  template <typename T>
85  inline
86  fvar<T>
87  gamma_p(const double x1, const fvar<T>& x2){
88  using stan::math::gamma_p;
89  using std::exp;
90  using std::pow;
91 
92  T u = gamma_p(x1, x2.val_);
93 
94  double g = boost::math::tgamma(x1);
95 
96  T der2 = exp(-x2.val_) * pow(x2.val_, x1 - 1.0) / g;
97 
98  return fvar<T>(u, x2.d_ * der2);
99  }
100  }
101 }
102 #endif
fvar< T > fabs(const fvar< T > &x)
Definition: fabs.hpp:18
fvar< T > tgamma(const fvar< T > &x)
Definition: tgamma.hpp:15
fvar< T > pow(const fvar< T > &x1, const fvar< T > &x2)
Definition: pow.hpp:17
fvar< T > gamma_p(const fvar< T > &x1, const fvar< T > &x2)
Definition: gamma_p.hpp:16
double e()
Return the base of the natural logarithm.
Definition: constants.hpp:86
fvar< T > digamma(const fvar< T > &x)
Definition: digamma.hpp:16
fvar< T > log(const fvar< T > &x)
Definition: log.hpp:15
fvar< T > exp(const fvar< T > &x)
Definition: exp.hpp:16
double gamma_p(double x, double a)
Definition: gamma_p.hpp:53

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