122inline stan::return_type_t<T0, T1>
R_to_r(
const T0& R,
const T1& gt_rev_pmf,
123 const double& abs_tol,
126 using stan::math::value_of;
127 using stan::math::var;
128 constexpr bool R_var = stan::is_var<T0>::value;
129 constexpr bool g_var = stan::is_var<stan::value_type_t<T1>>::value;
130 const double R_d = value_of(R);
131 if constexpr (!R_var && !g_var) {
134 arena_t<Eigen::Matrix<stan::value_type_t<T1>, -1, 1>> g_a = gt_rev_pmf;
135 arena_t<Eigen::VectorXd> g_val = value_of(g_a);
139 stan::math::reverse_pass_callback([=]()
mutable {
140 const double rbar = res.adj();
142 Eigen::VectorXd e(g_var ? g_val.size() : 0);
144 if constexpr (R_var) {
145 R_v.adj() += rbar * s0 / (R_d * s1);
147 if constexpr (g_var) {
148 g_a.adj() += (rbar / s1) * e;