Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
gamma_q.hpp
Go to the documentation of this file.
1 #ifndef STAN__AGRAD__REV__FUNCTIONS__GAMMA_Q_HPP
2 #define STAN__AGRAD__REV__FUNCTIONS__GAMMA_Q_HPP
3 
4 #include <valarray>
5 #include <stan/agrad/rev/var.hpp>
11 #include <boost/math/special_functions/gamma.hpp>
12 #include <boost/math/special_functions/digamma.hpp>
13 
14 namespace stan {
15  namespace agrad {
16 
17  namespace {
18  class gamma_q_vv_vari : public op_vv_vari {
19  public:
20  gamma_q_vv_vari(vari* avi, vari* bvi) :
21  op_vv_vari(stan::math::gamma_q(avi->val_,bvi->val_),
22  avi,bvi) {
23  }
24  void chain() {
25  avi_->adj_ += adj_
26  * stan::math::gradRegIncGamma(avi_->val_, bvi_->val_,
27  boost::math::tgamma(avi_->val_),
28  boost::math::digamma(avi_->val_));
29  bvi_->adj_ -= adj_
30  * boost::math::gamma_p_derivative(avi_->val_, bvi_->val_);
31  }
32  };
33 
34  class gamma_q_vd_vari : public op_vd_vari {
35  public:
36  gamma_q_vd_vari(vari* avi, double b) :
37  op_vd_vari(stan::math::gamma_q(avi->val_,b),
38  avi,b) {
39  }
40  void chain() {
41  avi_->adj_ += adj_
42  * stan::math::gradRegIncGamma(avi_->val_, bd_,
43  boost::math::tgamma(avi_->val_),
44  boost::math::digamma(avi_->val_));
45  }
46  };
47 
48  class gamma_q_dv_vari : public op_dv_vari {
49  public:
50  gamma_q_dv_vari(double a, vari* bvi) :
51  op_dv_vari(stan::math::gamma_q(a,bvi->val_),
52  a,bvi) {
53  }
54  void chain() {
55  bvi_->adj_ -= adj_
56  * boost::math::gamma_p_derivative(ad_, bvi_->val_);
57  }
58  };
59  }
60 
61  inline var gamma_q(const stan::agrad::var& a,
62  const stan::agrad::var& b) {
63  return var(new gamma_q_vv_vari(a.vi_,b.vi_));
64  }
65 
66  inline var gamma_q(const stan::agrad::var& a,
67  const double& b) {
68  return var(new gamma_q_vd_vari(a.vi_,b));
69  }
70 
71  inline var gamma_q(const double& a,
72  const stan::agrad::var& b) {
73  return var(new gamma_q_dv_vari(a,b.vi_));
74  }
75 
76  }
77 }
78 #endif
fvar< T > tgamma(const fvar< T > &x)
Definition: tgamma.hpp:15
vari * vi_
Pointer to the implementation of this variable.
Definition: var.hpp:40
fvar< T > gamma_q(const fvar< T > &x1, const fvar< T > &x2)
Definition: gamma_q.hpp:15
double gradRegIncGamma(double a, double z, double g, double dig, double precision=1e-6)
Independent (input) and dependent (output) variables for gradients.
Definition: var.hpp:27
fvar< T > digamma(const fvar< T > &x)
Definition: digamma.hpp:16

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