1 #ifndef __STAN__AGRAD__REV__MATRIX__DOT_PRODUCT_HPP__
2 #define __STAN__AGRAD__REV__MATRIX__DOT_PRODUCT_HPP__
17 class dot_product_vv_vari :
public vari {
22 inline static double var_dot(
const var* v1,
const var* v2,
25 for (
size_t i = 0; i <
length; i++)
26 result += v1[i].vi_->val_ * v2[i].vi_->val_;
29 template<
typename Derived1,
typename Derived2>
30 inline static double var_dot(
const Eigen::DenseBase<Derived1> &v1,
31 const Eigen::DenseBase<Derived2> &v2) {
33 for (
int i = 0; i < v1.size(); i++)
34 result += v1[i].vi_->val_ * v2[i].vi_->val_;
37 inline static double var_dot(vari** v1, vari** v2,
size_t length) {
39 for (
size_t i = 0; i <
length; ++i)
40 result += v1[i]->val_ * v2[i]->val_;
44 dot_product_vv_vari(vari** v1, vari** v2,
size_t length)
45 : vari(var_dot(v1,v2,length)),
51 dot_product_vv_vari(
const var* v1,
const var* v2,
size_t length,
52 dot_product_vv_vari* shared_v1 = NULL,
53 dot_product_vv_vari* shared_v2 = NULL) :
54 vari(var_dot(v1, v2, length)),
length_(length) {
55 if (shared_v1 == NULL) {
57 for (
size_t i = 0; i <
length_; i++)
63 if (shared_v2 == NULL) {
65 for (
size_t i = 0; i <
length_; i++)
72 template<
typename Derived1,
typename Derived2>
73 dot_product_vv_vari(
const Eigen::DenseBase<Derived1> &v1,
74 const Eigen::DenseBase<Derived2> &v2,
75 dot_product_vv_vari* shared_v1 = NULL,
76 dot_product_vv_vari* shared_v2 = NULL) :
78 if (shared_v1 == NULL) {
80 for (
size_t i = 0; i <
length_; i++)
86 if (shared_v2 == NULL) {
88 for (
size_t i = 0; i <
length_; i++)
95 template<
int R1,
int C1,
int R2,
int C2>
96 dot_product_vv_vari(
const Eigen::Matrix<var,R1,C1> &v1,
97 const Eigen::Matrix<var,R2,C2> &v2,
98 dot_product_vv_vari* shared_v1 = NULL,
99 dot_product_vv_vari* shared_v2 = NULL) :
101 if (shared_v1 == NULL) {
103 for (
size_t i = 0; i <
length_; i++)
107 v1_ = shared_v1->v1_;
109 if (shared_v2 == NULL) {
111 for (
size_t i = 0; i <
length_; i++)
115 v2_ = shared_v2->v2_;
118 virtual void chain() {
119 for (
size_t i = 0; i <
length_; i++) {
120 v1_[i]->adj_ += adj_ *
v2_[i]->val_;
121 v2_[i]->adj_ += adj_ *
v1_[i]->val_;
126 class dot_product_vd_vari :
public vari {
131 inline static double var_dot(
const var* v1,
const double* v2,
134 for (
size_t i = 0; i <
length; i++)
135 result += v1[i].vi_->val_ * v2[i];
138 template<
typename Derived1,
typename Derived2>
139 inline static double var_dot(
const Eigen::DenseBase<Derived1> &v1,
140 const Eigen::DenseBase<Derived2> &v2) {
142 for (
int i = 0; i < v1.size(); i++)
143 result += v1[i].vi_->val_ * v2[i];
147 dot_product_vd_vari(
const var* v1,
const double* v2,
size_t length,
148 dot_product_vd_vari *shared_v1 = NULL,
149 dot_product_vd_vari *shared_v2 = NULL) :
150 vari(var_dot(v1, v2, length)),
length_(length) {
151 if (shared_v1 == NULL) {
153 for (
size_t i = 0; i <
length_; i++)
156 v1_ = shared_v1->v1_;
158 if (shared_v2 == NULL) {
160 for (
size_t i = 0; i <
length_; i++)
163 v2_ = shared_v2->v2_;
166 template<
typename Derived1,
typename Derived2>
167 dot_product_vd_vari(
const Eigen::DenseBase<Derived1> &v1,
168 const Eigen::DenseBase<Derived2> &v2,
169 dot_product_vd_vari *shared_v1 = NULL,
170 dot_product_vd_vari *shared_v2 = NULL) :
172 if (shared_v1 == NULL) {
174 for (
size_t i = 0; i <
length_; i++)
177 v1_ = shared_v1->v1_;
179 if (shared_v2 == NULL) {
181 for (
size_t i = 0; i <
length_; i++)
184 v2_ = shared_v2->v2_;
187 template<
int R1,
int C1,
int R2,
int C2>
188 dot_product_vd_vari(
const Eigen::Matrix<var,R1,C1> &v1,
189 const Eigen::Matrix<double,R2,C2> &v2,
190 dot_product_vd_vari *shared_v1 = NULL,
191 dot_product_vd_vari *shared_v2 = NULL) :
193 if (shared_v1 == NULL) {
195 for (
size_t i = 0; i <
length_; i++)
198 v1_ = shared_v1->v1_;
200 if (shared_v2 == NULL) {
202 for (
size_t i = 0; i <
length_; i++)
205 v2_ = shared_v2->v2_;
208 virtual void chain() {
209 for (
size_t i = 0; i <
length_; i++) {
210 v1_[i]->adj_ += adj_ *
v2_[i];
224 template<
int R1,
int C1,
int R2,
int C2>
226 const Eigen::Matrix<var, R2, C2>& v2) {
230 return var(
new dot_product_vv_vari(v1,v2));
241 template<
int R1,
int C1,
int R2,
int C2>
243 const Eigen::Matrix<double, R2, C2>& v2) {
247 return var(
new dot_product_vd_vari(v1,v2));
258 template<
int R1,
int C1,
int R2,
int C2>
260 const Eigen::Matrix<var, R2, C2>& v2) {
264 return var(
new dot_product_vd_vari(v2,v1));
275 return var(
new dot_product_vv_vari(v1, v2, length));
286 return var(
new dot_product_vd_vari(v1, v2, length));
297 return var(
new dot_product_vd_vari(v2, v1, length));
308 const std::vector<var>& v2) {
310 return var(
new dot_product_vv_vari(&v1[0], &v2[0], v1.size()));
321 const std::vector<double>& v2) {
323 return var(
new dot_product_vd_vari(&v1[0], &v2[0], v1.size()));
334 const std::vector<var>& v2) {
336 return var(
new dot_product_vd_vari(&v2[0], &v1[0], v1.size()));
339 template<
int R1,
int C1,
int R2,
int C2>
340 inline Eigen::Matrix<var, 1, C1>
342 const Eigen::Matrix<var, R2, C2>& v2) {
344 Eigen::Matrix<var, 1, C1> ret(1,v1.cols());
345 for (
size_type j = 0; j < v1.cols(); ++j) {
346 ret(j) =
var(
new dot_product_vv_vari(v1.col(j),v2.col(j)));
351 template<
int R1,
int C1,
int R2,
int C2>
352 inline Eigen::Matrix<var, 1, C1>
354 const Eigen::Matrix<double, R2, C2>& v2) {
356 Eigen::Matrix<var, 1, C1> ret(1,v1.cols());
357 for (
size_type j = 0; j < v1.cols(); ++j) {
358 ret(j) =
var(
new dot_product_vd_vari(v1.col(j),v2.col(j)));
363 template<
int R1,
int C1,
int R2,
int C2>
364 inline Eigen::Matrix<var, 1, C1>
366 const Eigen::Matrix<var, R2, C2>& v2) {
368 Eigen::Matrix<var, 1, C1> ret(1,v1.cols());
369 for (
size_type j = 0; j < v1.cols(); ++j) {
370 ret(j) =
var(
new dot_product_vd_vari(v2.col(j),v1.col(j)));
375 template<
int R1,
int C1,
int R2,
int C2>
376 inline Eigen::Matrix<var, R1, 1>
378 const Eigen::Matrix<var, R2, C2>& v2) {
380 Eigen::Matrix<var, R1, 1> ret(v1.rows(),1);
381 for (
size_type j = 0; j < v1.rows(); ++j) {
382 ret(j) =
var(
new dot_product_vv_vari(v1.row(j),v2.row(j)));
387 template<
int R1,
int C1,
int R2,
int C2>
388 inline Eigen::Matrix<var, R1, 1>
390 const Eigen::Matrix<double, R2, C2>& v2) {
392 Eigen::Matrix<var, R1, 1> ret(v1.rows(),1);
393 for (
size_type j = 0; j < v1.rows(); ++j) {
394 ret(j) =
var(
new dot_product_vd_vari(v1.row(j),v2.row(j)));
399 template<
int R1,
int C1,
int R2,
int C2>
400 inline Eigen::Matrix<var, R1, 1>
402 const Eigen::Matrix<var, R2, C2>& v2) {
404 Eigen::Matrix<var, R1, 1> ret(v1.rows(),1);
405 for (
size_type j = 0; j < v1.rows(); ++j) {
406 ret(j) =
var(
new dot_product_vd_vari(v2.row(j),v1.row(j)));