1 #ifndef STAN_MATH_REV_CORE_GEVV_VVV_VARI_HPP
2 #define STAN_MATH_REV_CORE_GEVV_VVV_VARI_HPP
19 const var* v1,
int stride1,
20 const var* v2,
int stride2,
21 size_t length,
double *dotprod) {
23 for (
size_t i = 0; i <
length; i++)
24 result += v1[i*stride1].vi_->
val_ * v2[i*stride2].
vi_->
val_;
26 return alpha->vi_->
val_ * result;
31 const var* v1,
int stride1,
32 const var* v2,
int stride2,
size_t length) :
33 vari(
eval_gevv(alpha, v1, stride1, v2, stride2, length, &dotval_)),
37 v1_ =
reinterpret_cast<vari**
>
41 for (
size_t i = 0; i <
length_; i++)
42 v1_[i] = v1[i*stride1].vi_;
43 for (
size_t i = 0; i <
length_; i++)
44 v2_[i] = v2[i*stride2].vi_;
48 const double adj_alpha =
adj_ * alpha_->
val_;
49 for (
size_t i = 0; i <
length_; i++) {
50 v1_[i]->
adj_ += adj_alpha * v2_[i]->
val_;
51 v2_[i]->
adj_ += adj_alpha * v1_[i]->
val_;
gevv_vvv_vari(const var *alpha, const var *v1, int stride1, const var *v2, int stride2, size_t length)
static stack_alloc memalloc_
The variable implementation base class.
size_t length(const std::vector< T > &x)
Independent (input) and dependent (output) variables for gradients.
const double val_
The value of this variable.
static double eval_gevv(const var *alpha, const var *v1, int stride1, const var *v2, int stride2, size_t length, double *dotprod)
vari * vi_
Pointer to the implementation of this variable.
double adj_
The adjoint of this variable, which is the partial derivative of this variable with respect to the ro...
void * alloc(size_t len)
Return a newly allocated block of memory of the appropriate size managed by the stack allocator...
void chain()
Apply the chain rule to this variable based on the variables on which it depends. ...