1 #ifndef STAN_MATH_REV_SCAL_FUN_POW_HPP
2 #define STAN_MATH_REV_SCAL_FUN_POW_HPP
6 #include <boost/math/special_functions/fpclassify.hpp>
14 class pow_vv_vari :
public op_vv_vari {
16 pow_vv_vari(vari* avi, vari* bvi) :
17 op_vv_vari(std::
pow(avi->val_, bvi->val_), avi, bvi) {
22 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
23 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
25 if (avi_->val_ == 0.0)
return;
26 avi_->adj_ += adj_ * bvi_->val_ * val_ / avi_->val_;
27 bvi_->adj_ += adj_ *
std::log(avi_->val_) * val_;
32 class pow_vd_vari :
public op_vd_vari {
34 pow_vd_vari(vari* avi,
double b) :
35 op_vd_vari(std::
pow(avi->val_, b), avi, b) {
40 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
42 if (avi_->val_ == 0.0)
return;
43 avi_->adj_ += adj_ * bd_ * val_ / avi_->val_;
48 class pow_dv_vari :
public op_dv_vari {
50 pow_dv_vari(
double a, vari* bvi) :
51 op_dv_vari(std::
pow(a, bvi->val_), a, bvi) {
56 bvi_->adj_ = std::numeric_limits<double>::quiet_NaN();
58 if (ad_ == 0.0)
return;
59 bvi_->adj_ += adj_ *
std::log(ad_) * val_;
104 return var(
new pow_vv_vari(base.
vi_, exponent.
vi_));
119 inline var pow(
const var& base,
const double exponent) {
126 return var(
new pow_vd_vari(base.vi_, exponent));
141 inline var pow(
const double base,
const var& exponent) {
142 return var(
new pow_dv_vari(base, exponent.
vi_));
fvar< T > sqrt(const fvar< T > &x)
fvar< T > log(const fvar< T > &x)
Independent (input) and dependent (output) variables for gradients.
bool isnan(const stan::math::var &v)
Checks if the given number is NaN.
vari * vi_
Pointer to the implementation of this variable.
fvar< T > pow(const fvar< T > &x1, const fvar< T > &x2)