Stan  1.3
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
fma.hpp
Go to the documentation of this file.
1 #ifndef __STAN__AGRAD__REV__FMA_HPP__
2 #define __STAN__AGRAD__REV__FMA_HPP__
3 
4 #include <valarray>
5 #include <stan/agrad/rev/var.hpp>
11 #include <stan/math/constants.hpp>
12 
13 namespace stan {
14  namespace agrad {
15 
16  namespace {
17  class fma_vvv_vari : public op_vvv_vari {
18  public:
19  fma_vvv_vari(vari* avi, vari* bvi, vari* cvi) :
20  op_vvv_vari(avi->val_ * bvi->val_ + cvi->val_,
21  avi,bvi,cvi) {
22  }
23  void chain() {
24  avi_->adj_ += adj_ * bvi_->val_;
25  bvi_->adj_ += adj_ * avi_->val_;
26  cvi_->adj_ += adj_;
27  }
28  };
29 
30  class fma_vvd_vari : public op_vv_vari {
31  public:
32  fma_vvd_vari(vari* avi, vari* bvi, double c) :
33  op_vv_vari(avi->val_ * bvi->val_ + c,
34  avi,bvi) {
35  }
36  void chain() {
37  avi_->adj_ += adj_ * bvi_->val_;
38  bvi_->adj_ += adj_ * avi_->val_;
39  }
40  };
41 
42  class fma_vdv_vari : public op_vdv_vari {
43  public:
44  fma_vdv_vari(vari* avi, double b, vari* cvi) :
45  op_vdv_vari(avi->val_ * b + cvi->val_,
46  avi,b,cvi) {
47  }
48  void chain() {
49  avi_->adj_ += adj_ * bd_;
50  cvi_->adj_ += adj_;
51  }
52  };
53 
54  class fma_vdd_vari : public op_vd_vari {
55  public:
56  fma_vdd_vari(vari* avi, double b, double c) :
57  op_vd_vari(avi->val_ * b + c,
58  avi,b) {
59  }
60  void chain() {
61  avi_->adj_ += adj_ * bd_;
62  }
63  };
64 
65  class fma_ddv_vari : public op_v_vari {
66  public:
67  fma_ddv_vari(double a, double b, vari* cvi) :
68  op_v_vari(a * b + cvi->val_,
69  cvi) {
70  }
71  void chain() {
72  // avi_ is cvi from constructor
73  avi_->adj_ += adj_;
74  }
75  };
76  }
77 
98  inline var fma(const stan::agrad::var& a,
99  const stan::agrad::var& b,
100  const stan::agrad::var& c) {
101  return var(new fma_vvv_vari(a.vi_,b.vi_,c.vi_));
102  }
103 
122  inline var fma(const stan::agrad::var& a,
123  const stan::agrad::var& b,
124  const double& c) {
125  return var(new fma_vvd_vari(a.vi_,b.vi_,c));
126  }
127 
146  inline var fma(const stan::agrad::var& a,
147  const double& b,
148  const stan::agrad::var& c) {
149  return var(new fma_vdv_vari(a.vi_,b,c.vi_));
150  }
151 
168  inline var fma(const stan::agrad::var& a,
169  const double& b,
170  const double& c) {
171  return var(new fma_vdd_vari(a.vi_,b,c));
172  }
173 
190  inline var fma(const double& a,
191  const stan::agrad::var& b,
192  const double& c) {
193  return var(new fma_vdd_vari(b.vi_,a,c));
194  }
195 
212  inline var fma(const double& a,
213  const double& b,
214  const stan::agrad::var& c) {
215  return var(new fma_ddv_vari(a,b,c.vi_));
216  }
217 
236  inline var fma(const double& a,
237  const stan::agrad::var& b,
238  const stan::agrad::var& c) {
239  return var(new fma_vdv_vari(b.vi_,a,c.vi_)); // a-b symmetry
240  }
241 
242  }
243 }
244 #endif

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