Stan  1.3
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
pow.hpp
Go to the documentation of this file.
1 #ifndef __STAN__AGRAD__REV__POW_HPP__
2 #define __STAN__AGRAD__REV__POW_HPP__
3 
4 #include <cmath>
5 #include <stan/agrad/rev/var.hpp>
11 
12 namespace stan {
13  namespace agrad {
14 
15  namespace {
16  class pow_vv_vari : public op_vv_vari {
17  public:
18  pow_vv_vari(vari* avi, vari* bvi) :
19  op_vv_vari(std::pow(avi->val_,bvi->val_),avi,bvi) {
20  }
21  void chain() {
22  if (avi_->val_ == 0.0) return; // partials zero, avoids 0 & log(0)
23  avi_->adj_ += adj_ * bvi_->val_ * val_ / avi_->val_;
24  bvi_->adj_ += adj_ * std::log(avi_->val_) * val_;
25  }
26  };
27 
28  class pow_vd_vari : public op_vd_vari {
29  public:
30  pow_vd_vari(vari* avi, double b) :
31  op_vd_vari(std::pow(avi->val_,b),avi,b) {
32  }
33  void chain() {
34  if (avi_->val_ == 0.0) return; // partials zero, avoids 0 & log(0)
35  avi_->adj_ += adj_ * bd_ * val_ / avi_->val_;
36  }
37  };
38 
39  class pow_dv_vari : public op_dv_vari {
40  public:
41  pow_dv_vari(double a, vari* bvi) :
42  op_dv_vari(std::pow(a,bvi->val_),a,bvi) {
43  }
44  void chain() {
45  if (ad_ == 0.0) return; // partials zero, avoids 0 & log(0)
46  bvi_->adj_ += adj_ * std::log(ad_) * val_;
47  }
48  };
49  }
50 
64  inline var pow(const var& base, const var& exponent) {
65  return var(new pow_vv_vari(base.vi_,exponent.vi_));
66  }
67 
80  inline var pow(const var& base, const double exponent) {
81  if (exponent == 0.5)
82  return sqrt(base);
83  if (exponent == 1.0)
84  return base;
85  if (exponent == 2.0)
86  return base * base; // FIXME: square() functionality from special_functions
87  return var(new pow_vd_vari(base.vi_,exponent));
88  }
89 
102  inline var pow(const double base, const var& exponent) {
103  return var(new pow_dv_vari(base,exponent.vi_));
104  }
105 
106  }
107 }
108 #endif

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