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__FWD__FUNCTIONS__GAMMA_Q_HPP
2 #define STAN__AGRAD__FWD__FUNCTIONS__GAMMA_Q_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  gamma_q(const fvar<T>& x1, const fvar<T>& x2){
16  using stan::math::gamma_q;
17  using std::log;
18  using std::exp;
19  using std::pow;
20  using std::fabs;
21  using boost::math::tgamma;
23 
24  T u = gamma_q(x1.val_, x2.val_);
25 
26  T S = 0;
27  T s = 1;
28  T l = log(x2.val_);
29  T g = tgamma(x1.val_);
30  T dig = digamma(x1.val_);
31 
32  int k = 0;
33  T delta = s / (x1.val_ * x1.val_);
34 
35  while (fabs(delta) > 1e-6) {
36  S += delta;
37  ++k;
38  s *= -x2.val_ / k;
39  delta = s / ((k + x1.val_) * (k + x1.val_));
40  }
41 
42  T der1 = (1.0 - u) * ( dig - l ) + exp( x1.val_ * l ) * S / g;
43  T der2 = -exp(-x2.val_) * pow(x2.val_, x1.val_ - 1.0) / g;
44 
45  return fvar<T>(u,x1.d_ * der1 + x2.d_ * der2);
46  }
47 
48  template <typename T>
49  inline
50  fvar<T>
51  gamma_q(const fvar<T>& x1, const double x2){
52  using stan::math::gamma_q;
53  using std::log;
54  using std::exp;
55  using std::pow;
56  using std::fabs;
57  using boost::math::tgamma;
59 
60  T u = gamma_q(x1.val_, x2);
61 
62  T S = 0;
63  double s = 1;
64  double l = log(x2);
65  T g = tgamma(x1.val_);
66  T dig = digamma(x1.val_);
67 
68  int k = 0;
69  T delta = s / (x1.val_ * x1.val_);
70 
71  while (fabs(delta) > 1e-6) {
72  S += delta;
73  ++k;
74  s *= -x2 / k;
75  delta = s / ((k + x1.val_) * (k + x1.val_));
76  }
77 
78  T der1 = (1.0 - u) * ( dig - l ) + exp( x1.val_ * l ) * S / g;
79 
80  return fvar<T>(u, x1.d_ * der1);
81  }
82 
83  template <typename T>
84  inline
85  fvar<T>
86  gamma_q(const double x1, const fvar<T>& x2){
87  using stan::math::gamma_q;
88  using std::exp;
89  using std::pow;
90 
91  T u = gamma_q(x1, x2.val_);
92 
93  double g = boost::math::tgamma(x1);
94 
95  T der2 = -exp(-x2.val_) * pow(x2.val_, x1 - 1.0) / g;
96 
97  return fvar<T>(u, x2.d_ * der2);
98  }
99  }
100 }
101 #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
double gamma_q(double x, double a)
Definition: gamma_q.hpp:53
fvar< T > gamma_q(const fvar< T > &x1, const fvar< T > &x2)
Definition: gamma_q.hpp:15
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

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