1 #ifndef __STAN__AGRAD__REV__MATRIX__DIST_HPP__
2 #define __STAN__AGRAD__REV__MATRIX__DIST_HPP__
17 class squared_dist_vv_vari :
public vari {
23 template<
int R1,
int C1,
int R2,
int C2>
24 inline static double var_squared_dist(
const Eigen::Matrix<var,R1,C1> &v1,
25 const Eigen::Matrix<var,R2,C2> &v2) {
27 for (
size_t i = 0; i < v1.size(); i++) {
28 double diff = v1[i].vi_->val_ - v2[i].vi_->val_;
34 template<
int R1,
int C1,
int R2,
int C2>
35 squared_dist_vv_vari(
const Eigen::Matrix<var,R1,C1> &v1,
36 const Eigen::Matrix<var,R2,C2> &v2)
37 : vari(var_squared_dist(v1, v2)),
length_(v1.
size())
40 for (
size_t i = 0; i <
length_; i++)
44 for (
size_t i = 0; i <
length_; i++)
47 virtual void chain() {
48 for (
size_t i = 0; i <
length_; i++) {
49 double di = 2 * adj_ * (
v1_[i]->val_ -
v2_[i]->val_);
55 class squared_dist_vd_vari :
public vari {
61 template<
int R1,
int C1,
int R2,
int C2>
62 inline static double var_squared_dist(
const Eigen::Matrix<var,R1,C1> &v1,
63 const Eigen::Matrix<double,R2,C2> &v2) {
65 for (
size_t i = 0; i < v1.size(); i++) {
66 double diff = v1[i].vi_->val_ - v2[i];
72 template<
int R1,
int C1,
int R2,
int C2>
73 squared_dist_vd_vari(
const Eigen::Matrix<var,R1,C1> &v1,
74 const Eigen::Matrix<double,R2,C2> &v2)
75 : vari(var_squared_dist(v1, v2)), length_(v1.
size())
78 for (
size_t i = 0; i <
length_; i++)
82 for (
size_t i = 0; i <
length_; i++)
85 virtual void chain() {
86 for (
size_t i = 0; i <
length_; i++) {
87 v1_[i]->adj_ += 2 * adj_ * (
v1_[i]->val_ -
v2_[i]);
93 template<
int R1,
int C1,
int R2,
int C2>
95 const Eigen::Matrix<var, R2, C2>& v2) {
99 return var(
new squared_dist_vv_vari(v1,v2));
101 template<
int R1,
int C1,
int R2,
int C2>
103 const Eigen::Matrix<double, R2, C2>& v2) {
107 return var(
new squared_dist_vd_vari(v1,v2));
109 template<
int R1,
int C1,
int R2,
int C2>
111 const Eigen::Matrix<var, R2, C2>& v2) {
115 return var(
new squared_dist_vd_vari(v2,v1));
118 template<
int R1,
int C1,
int R2,
int C2>
119 inline var dist(
const Eigen::Matrix<var, R1, C1>& v1,
120 const Eigen::Matrix<var, R2, C2>& v2) {
124 return sqrt(
var(
new squared_dist_vv_vari(v1,v2)));
126 template<
int R1,
int C1,
int R2,
int C2>
127 inline var dist(
const Eigen::Matrix<var, R1, C1>& v1,
128 const Eigen::Matrix<double, R2, C2>& v2) {
132 return sqrt(
var(
new squared_dist_vd_vari(v1,v2)));
134 template<
int R1,
int C1,
int R2,
int C2>
135 inline var dist(
const Eigen::Matrix<double, R1, C1>& v1,
136 const Eigen::Matrix<var, R2, C2>& v2) {
140 return sqrt(
var(
new squared_dist_vd_vari(v2,v1)));