1 #ifndef STAN__AGRAD__REV__MATRIX__SQUARED_DISTANCE_HPP
2 #define STAN__AGRAD__REV__MATRIX__SQUARED_DISTANCE_HPP
25 class squared_distance_vv_vari :
public vari {
31 template <
int R1,
int C1,
int R2,
int C2>
33 var_squared_distance(
const Eigen::Matrix<var,R1,C1> &v1,
34 const Eigen::Matrix<var,R2,C2> &v2) {
37 typedef typename index_type<Matrix<var,R1,R2> >::type idx_t;
39 for (idx_t i = 0; i < v1.size(); i++) {
40 double diff = v1(i).vi_->val_ - v2(i).vi_->val_;
46 template<
int R1,
int C1,
int R2,
int C2>
47 squared_distance_vv_vari(
const Eigen::Matrix<var,R1,C1> &v1,
48 const Eigen::Matrix<var,R2,C2> &v2)
49 : vari(var_squared_distance(v1, v2)),
length_(v1.
size())
52 for (
size_t i = 0; i <
length_; i++)
56 for (
size_t i = 0; i <
length_; i++)
59 virtual void chain() {
60 for (
size_t i = 0; i <
length_; i++) {
61 double di = 2 * adj_ * (
v1_[i]->val_ -
v2_[i]->val_);
67 class squared_distance_vd_vari :
public vari {
73 template<
int R1,
int C1,
int R2,
int C2>
75 var_squared_distance(
const Eigen::Matrix<var,R1,C1> &v1,
76 const Eigen::Matrix<double,R2,C2> &v2) {
80 typedef typename index_type<Matrix<double,R1,C1> >::type idx_t;
83 for (idx_t i = 0; i < v1.size(); i++) {
84 double diff = v1(i).vi_->val_ - v2(i);
90 template<
int R1,
int C1,
int R2,
int C2>
91 squared_distance_vd_vari(
const Eigen::Matrix<var,R1,C1> &v1,
92 const Eigen::Matrix<double,R2,C2> &v2)
93 : vari(var_squared_distance(v1, v2)), length_(v1.
size())
96 for (
size_t i = 0; i <
length_; i++)
100 for (
size_t i = 0; i <
length_; i++)
103 virtual void chain() {
104 for (
size_t i = 0; i <
length_; i++) {
105 v1_[i]->adj_ += 2 * adj_ * (
v1_[i]->val_ -
v2_[i]);
111 template<
int R1,
int C1,
int R2,
int C2>
113 const Eigen::Matrix<var, R2, C2>& v2) {
118 return var(
new squared_distance_vv_vari(v1,v2));
120 template<
int R1,
int C1,
int R2,
int C2>
122 const Eigen::Matrix<double, R2, C2>& v2) {
127 return var(
new squared_distance_vd_vari(v1,v2));
129 template<
int R1,
int C1,
int R2,
int C2>
131 const Eigen::Matrix<var, R2, C2>& v2) {
136 return var(
new squared_distance_vd_vari(v2,v1));
memory::stack_alloc memalloc_
bool check_vector(const char *function, const Eigen::Matrix< T, R, C > &x, const char *name, T_result *result)
Primary template class for the metaprogram to compute the index type of a container.
void * alloc(size_t len)
Return a newly allocated block of memory of the appropriate size managed by the stack allocator...
Independent (input) and dependent (output) variables for gradients.
int size(const std::vector< T > &x)
var squared_distance(const Eigen::Matrix< var, R1, C1 > &v1, const Eigen::Matrix< var, R2, C2 > &v2)
bool check_matching_sizes(const char *function, const T_y1 &y1, const char *name1, const T_y2 &y2, const char *name2, T_result *result)