Automatic Differentiation
 
Loading...
Searching...
No Matches
lambert_w.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_REV_FUN_LAMBERT_W_HPP
2#define STAN_MATH_REV_FUN_LAMBERT_W_HPP
3
10
11namespace stan {
12namespace math {
13
21template <typename T, require_stan_scalar_or_eigen_t<T>* = nullptr>
22inline auto lambert_w0(const var_value<T>& a) {
23 return make_callback_var(lambert_w0(a.val()), [a](auto& vi) mutable {
24 as_array_or_scalar(a.adj())
25 += (as_array_or_scalar(vi.adj())
26 / as_array_or_scalar(a.val() + exp(vi.val())));
27 });
28}
29
39template <typename T, require_stan_scalar_or_eigen_t<T>* = nullptr>
40inline auto lambert_wm1(const var_value<T>& a) {
41 return make_callback_var(lambert_wm1(a.val()), [a](auto& vi) mutable {
42 as_array_or_scalar(a.adj())
43 += (as_array_or_scalar(vi.adj())
44 / as_array_or_scalar(a.val() + exp(vi.val())));
45 });
46}
47
48} // namespace math
49} // namespace stan
50
51#endif
fvar< T > lambert_w0(const fvar< T > &x)
Definition lambert_w.hpp:13
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...
fvar< T > lambert_wm1(const fvar< T > &x)
Definition lambert_w.hpp:19
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...