Automatic Differentiation
 
Loading...
Searching...
No Matches
hypergeometric_pFq.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_FWD_FUN_HYPERGEOMETRIC_PFQ_HPP
2#define STAN_MATH_FWD_FUN_HYPERGEOMETRIC_PFQ_HPP
3
12
13namespace stan {
14namespace math {
15
28template <
29 typename Ta, typename Tb, typename Tz,
30 typename FvarT = return_type_t<Ta, Tb, Tz>, bool grad_a = is_autodiff_v<Ta>,
31 bool grad_b = is_autodiff_v<Tb>, bool grad_z = is_autodiff_v<Tz>,
32 require_all_vector_t<Ta, Tb>* = nullptr, require_fvar_t<FvarT>* = nullptr>
33inline FvarT hypergeometric_pFq(Ta&& a, Tb&& b, Tz&& z) {
34 auto&& a_ref = to_ref(as_column_vector_or_scalar(a));
35 auto&& b_ref = to_ref(as_column_vector_or_scalar(b));
36 auto&& a_val = value_of(a_ref);
37 auto&& b_val = value_of(b_ref);
38 auto&& z_val = value_of(z);
39
40 partials_type_t<FvarT> pfq_val = hypergeometric_pFq(a_val, b_val, z_val);
41 auto grad_tuple
42 = grad_pFq<grad_a, grad_b, grad_z>(pfq_val, a_val, b_val, z_val);
43
44 FvarT rtn = FvarT(pfq_val, 0.0);
45
46 if constexpr (grad_a) {
47 rtn.d_ += dot_product(a_ref.d(), std::get<0>(grad_tuple));
48 }
49 if constexpr (grad_b) {
50 rtn.d_ += dot_product(b_ref.d(), std::get<1>(grad_tuple));
51 }
52 if constexpr (grad_z) {
53 rtn.d_ += z.d_ * std::get<2>(grad_tuple);
54 }
55
56 return rtn;
57}
58
59} // namespace math
60} // namespace stan
61#endif
auto as_column_vector_or_scalar(T &&a)
as_column_vector_or_scalar of a kernel generator expression.
typename partials_type< T >::type partials_type_t
Helper alias for accessing the partial type.
T value_of(const fvar< T > &v)
Return the value of the specified variable.
Definition value_of.hpp:18
FvarT hypergeometric_pFq(Ta &&a, Tb &&b, Tz &&z)
Returns the generalized hypergeometric (pFq) function applied to the input arguments.
ref_type_t< T && > to_ref(T &&a)
This evaluates expensive Eigen expressions.
Definition to_ref.hpp:18
auto dot_product(const T_a &a, const T_b &b)
Returns the dot product of the specified vectors.
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...