1 #ifndef STAN__AGRAD__REV__FUNCTIONS__FMA_HPP
2 #define STAN__AGRAD__REV__FUNCTIONS__FMA_HPP
13 #include <boost/math/special_functions/fpclassify.hpp>
20 class fma_vvv_vari :
public op_vvv_vari {
22 fma_vvv_vari(vari* avi, vari* bvi, vari* cvi) :
23 op_vvv_vari(::
fma(avi->val_, bvi->val_, cvi->val_),
30 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
31 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
32 cvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
34 avi_->adj_ += adj_ * bvi_->val_;
35 bvi_->adj_ += adj_ * avi_->val_;
41 class fma_vvd_vari :
public op_vvd_vari {
43 fma_vvd_vari(vari* avi, vari* bvi,
double c) :
44 op_vvd_vari(::
fma(avi->val_, bvi->val_, c),
51 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
52 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
54 avi_->adj_ += adj_ * bvi_->val_;
55 bvi_->adj_ += adj_ * avi_->val_;
60 class fma_vdv_vari :
public op_vdv_vari {
62 fma_vdv_vari(vari* avi,
double b, vari* cvi) :
63 op_vdv_vari(::
fma(avi->val_ , b, cvi->val_),
70 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
71 cvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
73 avi_->adj_ += adj_ * bd_;
79 class fma_vdd_vari :
public op_vdd_vari {
81 fma_vdd_vari(vari* avi,
double b,
double c) :
82 op_vdd_vari(::
fma(avi->val_ , b, c),
89 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
91 avi_->adj_ += adj_ * bd_;
95 class fma_ddv_vari :
public op_ddv_vari {
97 fma_ddv_vari(
double a,
double b, vari* cvi) :
98 op_ddv_vari(::
fma(a, b, cvi->val_),
106 cvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
162 return var(
new fma_vvd_vari(a.
vi_,b.
vi_,c));
187 return var(
new fma_vdv_vari(a.
vi_,b,c.
vi_));
210 return var(
new fma_vdd_vari(a.
vi_,b,c));
233 return var(
new fma_vdd_vari(b.
vi_,a,c));
256 return var(
new fma_ddv_vari(a,b,c.
vi_));
281 return var(
new fma_vdv_vari(b.
vi_,a,c.
vi_));
fvar< typename stan::return_type< T1, T2, T3 >::type > fma(const fvar< T1 > &x1, const fvar< T2 > &x2, const fvar< T3 > &x3)
The fused multiply-add operation (C99).
bool isnan(const stan::agrad::var &v)
Checks if the given number is NaN.
vari * vi_
Pointer to the implementation of this variable.
Independent (input) and dependent (output) variables for gradients.