1 #ifndef STAN_MATH_REV_SCAL_FUN_MULTIPLY_LOG_HPP 2 #define STAN_MATH_REV_SCAL_FUN_MULTIPLY_LOG_HPP 13 class multiply_log_vv_vari :
public op_vv_vari {
15 multiply_log_vv_vari(vari* avi, vari* bvi) :
16 op_vv_vari(
multiply_log(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 avi_->adj_ += adj_ *
log(bvi_->val_);
26 if (bvi_->val_ == 0.0 && avi_->val_ == 0)
27 bvi_->adj_ += adj_ * std::numeric_limits<double>::infinity();
29 bvi_->adj_ += adj_ * avi_->val_ / bvi_->val_;
33 class multiply_log_vd_vari :
public op_vd_vari {
35 multiply_log_vd_vari(vari* avi,
double b) :
42 avi_->adj_ = std::numeric_limits<double>::quiet_NaN();
44 avi_->adj_ += adj_ *
log(bd_);
47 class multiply_log_dv_vari :
public op_dv_vari {
49 multiply_log_dv_vari(
double a, vari* bvi) :
53 if (bvi_->val_ == 0.0 && ad_ == 0.0)
54 bvi_->adj_ += adj_ * std::numeric_limits<double>::infinity();
56 bvi_->adj_ += adj_ * ad_ / bvi_->val_;
74 return var(
new multiply_log_vv_vari(a.
vi_, b.
vi_));
87 return var(
new multiply_log_vd_vari(a.
vi_, b));
103 return var(
new multiply_log_dv_vari(a, b.
vi_));
fvar< T > log(const fvar< T > &x)
Independent (input) and dependent (output) variables for gradients.
vari * vi_
Pointer to the implementation of this variable.
fvar< T > multiply_log(const fvar< T > &x1, const fvar< T > &x2)
int is_nan(const fvar< T > &x)
Returns 1 if the input's value is NaN and 0 otherwise.