1 #ifndef STAN__AGRAD__REV__FUNCTIONS__POW_HPP
2 #define STAN__AGRAD__REV__FUNCTIONS__POW_HPP
11 #include <boost/math/special_functions/fpclassify.hpp>
17 class pow_vv_vari :
public op_vv_vari {
19 pow_vv_vari(vari* avi, vari* bvi) :
20 op_vv_vari(std::
pow(avi->val_,bvi->val_),avi,bvi) {
25 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
26 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
28 if (avi_->val_ == 0.0)
return;
29 avi_->adj_ += adj_ * bvi_->val_ * val_ / avi_->val_;
30 bvi_->adj_ += adj_ *
std::log(avi_->val_) * val_;
35 class pow_vd_vari :
public op_vd_vari {
37 pow_vd_vari(vari* avi,
double b) :
38 op_vd_vari(std::
pow(avi->val_,b),avi,b) {
43 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
45 if (avi_->val_ == 0.0)
return;
46 avi_->adj_ += adj_ * bd_ * val_ / avi_->val_;
51 class pow_dv_vari :
public op_dv_vari {
53 pow_dv_vari(
double a, vari* bvi) :
54 op_dv_vari(std::
pow(a,bvi->val_),a,bvi) {
59 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
61 if (ad_ == 0.0)
return;
62 bvi_->adj_ += adj_ *
std::log(ad_) * val_;
107 return var(
new pow_vv_vari(base.
vi_,exponent.
vi_));
122 inline var pow(
const var& base,
const double exponent) {
129 return var(
new pow_vd_vari(base.vi_,exponent));
144 inline var pow(
const double base,
const var& exponent) {
145 return var(
new pow_dv_vari(base,exponent.
vi_));
bool isnan(const stan::agrad::var &v)
Checks if the given number is NaN.
fvar< T > pow(const fvar< T > &x1, const fvar< T > &x2)
vari * vi_
Pointer to the implementation of this variable.
fvar< T > sqrt(const fvar< T > &x)
Independent (input) and dependent (output) variables for gradients.
fvar< T > log(const fvar< T > &x)