Automatic Differentiation
 
Loading...
Searching...
No Matches
hypergeometric_2F1.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_REV_FUN_HYPERGEOMETRIC_2F1_HPP
2#define STAN_MATH_REV_FUN_HYPERGEOMETRIC_2F1_HPP
3
8
9namespace stan {
10namespace math {
11
29template <typename Ta1, typename Ta2, typename Tb, typename Tz,
30 require_all_stan_scalar_t<Ta1, Ta2, Tb, Tz>* = nullptr,
31 require_any_var_t<Ta1, Ta2, Tb, Tz>* = nullptr>
32inline return_type_t<Ta1, Ta1, Tb, Tz> hypergeometric_2F1(const Ta1& a1,
33 const Ta2& a2,
34 const Tb& b,
35 const Tz& z) {
36 double a1_dbl = value_of(a1);
37 double a2_dbl = value_of(a2);
38 double b_dbl = value_of(b);
39 double z_dbl = value_of(z);
40
41 return make_callback_var(
42 hypergeometric_2F1(a1_dbl, a2_dbl, b_dbl, z_dbl),
43 [a1, a2, b, z](auto& vi) mutable {
44 auto grad_tuple = grad_2F1(a1, a2, b, z);
45
46 if (!is_constant<Ta1>::value) {
47 forward_as<var>(a1).adj() += vi.adj() * std::get<0>(grad_tuple);
48 }
49 if (!is_constant<Ta2>::value) {
50 forward_as<var>(a2).adj() += vi.adj() * std::get<1>(grad_tuple);
51 }
52 if (!is_constant<Tb>::value) {
53 forward_as<var>(b).adj() += vi.adj() * std::get<2>(grad_tuple);
54 }
55 if (!is_constant<Tz>::value) {
56 forward_as<var>(z).adj() += vi.adj() * std::get<3>(grad_tuple);
57 }
58 });
59}
60} // namespace math
61} // namespace stan
62#endif
var_value< plain_type_t< T > > make_callback_var(T &&value, F &&functor)
Creates a new var initialized with a callback_vari with a given value and reverse-pass callback funct...
T value_of(const fvar< T > &v)
Return the value of the specified variable.
Definition value_of.hpp:18
return_type_t< Ta1, Ta1, Tb, Tz > hypergeometric_2F1(const Ta1 &a1, const Ta2 &a2, const Tb &b, const Tz &z)
Returns the Gauss hypergeometric function applied to the input arguments: .
auto grad_2F1(const T1 &a1, const T2 &a2, const T3 &b1, const T_z &z, double precision=1e-14, int max_steps=1e6)
Calculate the gradients of the hypergeometric function (2F1) as the power series stopping when the se...
Definition grad_2F1.hpp:271
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...