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__REV__FUNCTIONS__GAMMA_P_HPP
2 #define STAN__AGRAD__REV__FUNCTIONS__GAMMA_P_HPP
3 
4 #include <valarray>
5 #include <stan/agrad/rev/var.hpp>
10 #include <boost/math/special_functions/gamma.hpp>
11 #include <boost/math/special_functions/digamma.hpp>
12 
13 namespace stan {
14  namespace agrad {
15 
16  namespace {
17  class gamma_p_vv_vari : public op_vv_vari {
18  public:
19  gamma_p_vv_vari(vari* avi, vari* bvi) :
20  op_vv_vari(stan::math::gamma_p(avi->val_,bvi->val_),
21  avi,bvi) {
22  }
23  void chain() {
24 
25  double u = stan::math::gamma_p(avi_->val_, bvi_->val_);
26 
27  double S = 0.0;
28  double s = 1.0;
29  double l = std::log(bvi_->val_);
30  double g = boost::math::tgamma(avi_->val_);
31  double dig = boost::math::digamma(avi_->val_);
32 
33  int k = 0;
34  double delta = s / (avi_->val_ * avi_->val_);
35 
36  while (std::fabs(delta) > 1e-6) {
37  S += delta;
38  ++k;
39  s *= -bvi_->val_ / k;
40  delta = s / ((k + avi_->val_) * (k + avi_->val_));
41  }
42 
43 
44  avi_->adj_ -= adj_ * ((u) * ( dig - l ) + std::exp( avi_->val_ * l ) * S / g);
45  bvi_->adj_ += adj_ * (std::exp(-bvi_->val_) * std::pow(bvi_->val_, avi_->val_ - 1.0) / g);
46  }
47  };
48 
49  class gamma_p_vd_vari : public op_vd_vari {
50  public:
51  gamma_p_vd_vari(vari* avi, double b) :
52  op_vd_vari(stan::math::gamma_p(avi->val_,b),
53  avi,b) {
54  }
55  void chain() {
56 
57  double u = stan::math::gamma_p(avi_->val_, bd_);
58 
59  double S = 0.0;
60  double s = 1.0;
61  double l = std::log(bd_);
62  double g = boost::math::tgamma(avi_->val_);
63  double dig = boost::math::digamma(avi_->val_);
64 
65  int k = 0;
66  double delta = s / (avi_->val_ * avi_->val_);
67 
68  while (std::fabs(delta) > 1e-6) {
69  S += delta;
70  ++k;
71  s *= -bd_ / k;
72  delta = s / ((k + avi_->val_) * (k + avi_->val_));
73  }
74 
75  avi_->adj_ -= adj_ * ((u) * ( dig - l ) + std::exp( avi_->val_ * l ) * S / g);
76  }
77  };
78 
79  class gamma_p_dv_vari : public op_dv_vari {
80  public:
81  gamma_p_dv_vari(double a, vari* bvi) :
82  op_dv_vari(stan::math::gamma_p(a,bvi->val_),
83  a,bvi) {
84  }
85  void chain() {
86  bvi_->adj_ += adj_ * (std::exp(-bvi_->val_) * std::pow(bvi_->val_, ad_ - 1.0) / boost::math::tgamma(ad_));
87  }
88  };
89  }
90 
91  inline var gamma_p(const stan::agrad::var& a,
92  const stan::agrad::var& b) {
93  return var(new gamma_p_vv_vari(a.vi_,b.vi_));
94  }
95 
96  inline var gamma_p(const stan::agrad::var& a,
97  const double& b) {
98  return var(new gamma_p_vd_vari(a.vi_,b));
99  }
100 
101  inline var gamma_p(const double& a,
102  const stan::agrad::var& b) {
103  return var(new gamma_p_dv_vari(a,b.vi_));
104  }
105 
106  }
107 }
108 #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
vari * vi_
Pointer to the implementation of this variable.
Definition: var.hpp:40
fvar< T > gamma_p(const fvar< T > &x1, const fvar< T > &x2)
Definition: gamma_p.hpp:16
Independent (input) and dependent (output) variables for gradients.
Definition: var.hpp:27
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.