Automatic Differentiation
 
Loading...
Searching...
No Matches
log_falling_factorial.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_FUN_LOG_FALLING_FACTORIAL_HPP
2#define STAN_MATH_PRIM_FUN_LOG_FALLING_FACTORIAL_HPP
3
10
11namespace stan {
12namespace math {
13
54template <typename T1, typename T2, require_all_arithmetic_t<T1, T2>* = nullptr>
55inline return_type_t<T1, T2> log_falling_factorial(const T1 x, const T2 n) {
56 if (is_any_nan(x, n)) {
57 return NOT_A_NUMBER;
58 }
59 static constexpr const char* function = "log_falling_factorial";
60 check_positive(function, "first argument", x);
61 return lgamma(x + 1) - lgamma(x - n + 1);
62}
63
74template <typename T1, typename T2, require_any_container_t<T1, T2>* = nullptr>
75inline auto log_falling_factorial(const T1& a, const T2& b) {
76 return apply_scalar_binary(a, b, [&](const auto& c, const auto& d) {
77 return log_falling_factorial(c, d);
78 });
79}
80
81} // namespace math
82} // namespace stan
83#endif
typename return_type< Ts... >::type return_type_t
Convenience type for the return type of the specified template parameters.
static constexpr double NOT_A_NUMBER
(Quiet) not-a-number value.
Definition constants.hpp:56
fvar< T > lgamma(const fvar< T > &x)
Return the natural logarithm of the gamma function applied to the specified argument.
Definition lgamma.hpp:21
void check_positive(const char *function, const char *name, const T_y &y)
Check if y is positive.
fvar< T > log_falling_factorial(const fvar< T > &x, const fvar< T > &n)
auto apply_scalar_binary(const T1 &x, const T2 &y, const F &f)
Base template function for vectorization of binary scalar functions defined by applying a functor to ...
bool is_any_nan(const T &x)
Returns true if the input is NaN and false otherwise.
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...