1 #ifndef STAN_MATH_PRIM_MAT_FUN_UNIT_VECTOR_CONSTRAIN_HPP
2 #define STAN_MATH_PRIM_MAT_FUN_UNIT_VECTOR_CONSTRAIN_HPP
17 class unit_vector_elt_vari :
public vari {
26 unit_vector_elt_vari(
double val,
28 const double* unit_vector_y,
34 unit_vector_y_(unit_vector_y),
40 const double cubed_norm = norm_ * norm_ *
norm_;
41 for (
int m = 0; m <
size_; ++m) {
43 -= adj_ * unit_vector_y_[m] * unit_vector_y_[
idx_] / cubed_norm;
45 y_[m]->adj_ += adj_ /
norm_;
62 template <
int R,
int C>
63 Eigen::Matrix<var, R, C>
71 for (
int i = 0; i < y.size(); ++i)
72 y_vi_array[i] = y.coeff(i).vi_;
74 Eigen::VectorXd y_d(y.size());
75 for (
int i = 0; i < y.size(); ++i)
76 y_d.coeffRef(i) = y.coeff(i).val();
79 const double norm = y_d.norm();
81 Eigen::VectorXd unit_vector_d = y_d / norm;
83 double* unit_vector_y_d_array
85 .
alloc(
sizeof(
double) * y_d.size()));
86 for (
int i = 0; i < y_d.size(); ++i)
87 unit_vector_y_d_array[i] = unit_vector_d.coeff(i);
89 Eigen::Matrix<var, R, C> unit_vector_y(y.size());
90 for (
int k = 0; k < y.size(); ++k)
91 unit_vector_y.coeffRef(k)
92 =
var(
new unit_vector_elt_vari(unit_vector_d[k],
94 unit_vector_y_d_array,
110 template <
int R,
int C>
111 Eigen::Matrix<var, R, C>
bool check_vector(const char *function, const char *name, const Eigen::Matrix< T, R, C > &x)
Return true if the matrix is either a row vector or column vector.
static stack_alloc memalloc_
The variable implementation base class.
const double * unit_vector_y_
Independent (input) and dependent (output) variables for gradients.
fvar< T > dot_self(const Eigen::Matrix< fvar< T >, R, C > &v)
bool check_nonzero_size(const char *function, const char *name, const T_y &y)
Return true if the specified matrix/vector is of non-zero size.
Eigen::Matrix< fvar< T >, R, C > unit_vector_constrain(const Eigen::Matrix< fvar< T >, R, C > &y)
int size(const std::vector< T > &x)
Return the size of the specified standard vector.
bool check_positive_finite(const char *function, const char *name, const T_y &y)
Return true if y is positive and finite.
void * alloc(size_t len)
Return a newly allocated block of memory of the appropriate size managed by the stack allocator...