Stan  1.3
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
operator_division.hpp
Go to the documentation of this file.
1 #ifndef __STAN__AGRAD__REV__OPERATOR_DIVISION_HPP__
2 #define __STAN__AGRAD__REV__OPERATOR_DIVISION_HPP__
3 
4 #include <stan/agrad/rev/var.hpp>
8 
9 namespace stan {
10  namespace agrad {
11 
12  namespace {
13  // (a/b)' = a' * (1 / b) - b' * (a / [b * b])
14  class divide_vv_vari : public op_vv_vari {
15  public:
16  divide_vv_vari(vari* avi, vari* bvi) :
17  op_vv_vari(avi->val_ / bvi->val_, avi, bvi) {
18  }
19  void chain() {
20  avi_->adj_ += adj_ / bvi_->val_;
21  bvi_->adj_ -= adj_ * avi_->val_ / (bvi_->val_ * bvi_->val_);
22  }
23  };
24 
25  class divide_vd_vari : public op_vd_vari {
26  public:
27  divide_vd_vari(vari* avi, double b) :
28  op_vd_vari(avi->val_ / b, avi, b) {
29  }
30  void chain() {
31  avi_->adj_ += adj_ / bd_;
32  }
33  };
34 
35  class divide_dv_vari : public op_dv_vari {
36  public:
37  divide_dv_vari(double a, vari* bvi) :
38  op_dv_vari(a / bvi->val_, a, bvi) {
39  }
40  void chain() {
41  bvi_->adj_ -= adj_ * ad_ / (bvi_->val_ * bvi_->val_);
42  }
43  };
44  }
45 
60  inline var operator/(const var& a, const var& b) {
61  return var(new divide_vv_vari(a.vi_,b.vi_));
62  }
63 
75  inline var operator/(const var& a, const double b) {
76  if (b == 1.0)
77  return a;
78  return var(new divide_vd_vari(a.vi_,b));
79  }
80 
92  inline var operator/(const double a, const var& b) {
93  return var(new divide_dv_vari(a,b.vi_));
94  }
95 
96  }
97 }
98 #endif

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