134inline Eigen::Matrix<stan::return_type_t<T0, T1>, Eigen::Dynamic, 1>
138 using stan::math::var;
139 constexpr bool x_var = stan::is_var<stan::value_type_t<T0>>::value;
140 constexpr bool y_var = stan::is_var<stan::value_type_t<T1>>::value;
142 if constexpr (!x_var && !y_var) {
144 stan::math::value_of(y), len);
146 arena_t<Eigen::Matrix<stan::value_type_t<T0>, Eigen::Dynamic, 1>>
148 arena_t<Eigen::Matrix<stan::value_type_t<T1>, Eigen::Dynamic, 1>>
150 arena_t<Eigen::VectorXd> x_val = stan::math::value_of(x_arena);
151 arena_t<Eigen::VectorXd> y_val = stan::math::value_of(y_arena);
153 arena_t<Eigen::Matrix<var, Eigen::Dynamic, 1>> res(len);
154 for (
int i = 0; i < len; ++i) {
155 res.coeffRef(i) = var(z(i));
157 stan::math::reverse_pass_callback(
159 const Eigen::VectorXd zbar = res.adj();
160 Eigen::VectorXd xbar;
161 Eigen::VectorXd ybar;
162 if constexpr (x_var) {
163 xbar = Eigen::VectorXd::Zero(x_val.size());
165 if constexpr (y_var) {
166 ybar = Eigen::VectorXd::Zero(y_val.size());
169 x_var ? &xbar :
nullptr,
170 y_var ? &ybar :
nullptr);
171 if constexpr (x_var) {
172 x_arena.adj() += xbar;
174 if constexpr (y_var) {
175 y_arena.adj() += ybar;
178 return Eigen::Matrix<var, Eigen::Dynamic, 1>(res);