1#ifndef STAN_MATH_FWD_FUN_INV_INC_BETA_HPP
2#define STAN_MATH_FWD_FUN_INV_INC_BETA_HPP
35template <
typename T1,
typename T2,
typename T3,
36 require_all_stan_scalar_t<T1, T2, T3>* =
nullptr,
37 require_any_fvar_t<T1, T2, T3>* =
nullptr>
46 T_return log_w =
log(w);
47 T_return log1m_w =
log1m(w);
48 auto one_m_a = 1 - a_val;
49 auto one_m_b = 1 - b_val;
50 T_return one_m_w = 1 - w;
53 auto lbeta_ab =
lbeta(a_val, b_val);
54 auto digamma_apb =
digamma(a_val + b_val);
59 std::vector<T_return> da_a{a_val, a_val, one_m_b};
60 std::vector<T_return> da_b{ap1, ap1};
61 auto da1 =
exp(one_m_b * log1m_w + one_m_a * log_w);
62 auto da2 =
exp(a_val * log_w + 2 *
lgamma(a_val)
64 auto da3 =
inc_beta(a_val, b_val, w) *
exp(lbeta_ab)
65 * (log_w -
digamma(a_val) + digamma_apb);
66 inv_d_ += forward_as<fvar<T_return>>(a).d_ * da1 * (da2 - da3);
70 std::vector<T_return> db_a{b_val, b_val, one_m_a};
71 std::vector<T_return> db_b{bp1, bp1};
72 auto db1 = (w - 1) *
exp(-b_val * log1m_w + one_m_a * log_w);
74 - 2 *
lgamma(bp1) + b_val * log1m_w;
76 auto db3 =
inc_beta(b_val, a_val, one_m_w) *
exp(lbeta_ab)
77 * (log1m_w -
digamma(b_val) + digamma_apb);
79 inv_d_ += forward_as<fvar<T_return>>(b).d_ * db1 * (
exp(db2) - db3);
83 inv_d_ += forward_as<fvar<T_return>>(p).d_
84 *
exp(one_m_b * log1m_w + one_m_a * log_w + lbeta_ab);
auto hypergeometric_3F2(const Ta &a, const Tb &b, const Tz &z)
Hypergeometric function (3F2).
fvar< T > lbeta(const fvar< T > &x1, const fvar< T > &x2)
T value_of(const fvar< T > &v)
Return the value of the specified variable.
fvar< T > log(const fvar< T > &x)
fvar< partials_return_t< T1, T2, T3 > > inv_inc_beta(const T1 &a, const T2 &b, const T3 &p)
The inverse of the normalized incomplete beta function of a, b, with probability p.
fvar< T > inc_beta(const fvar< T > &a, const fvar< T > &b, const fvar< T > &x)
fvar< T > lgamma(const fvar< T > &x)
Return the natural logarithm of the gamma function applied to the specified argument.
fvar< T > log1m(const fvar< T > &x)
fvar< T > digamma(const fvar< T > &x)
Return the derivative of the log gamma function at the specified argument.
fvar< T > exp(const fvar< T > &x)
typename partials_return_type< Args... >::type partials_return_t
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...
Defines a static member function type which is defined to be false as the primitive scalar types cann...
This template class represents scalars used in forward-mode automatic differentiation,...