16 const double LOG2 = log(2.0);
19 constexpr
double NaN = std::numeric_limits<double>::quiet_NaN();
20 constexpr
double pi = M_PI;
71 assert(f(lower) > precision or f(upper) > precision);
73 const T m = lower + (upper-lower)/2.0;
74 if (upper-lower < 1e-3) {
77 else if (f(m) < precision) {
78 return get_log1pexp_breakout_bound<T>(precision, f, m, upper);
81 return get_log1pexp_breakout_bound<T>(precision, f, lower, m);
103 static const float breakout = get_log1pexp_breakout_bound<T>(1e-6, +[](T x) -> T {
return log1p(exp(x)); });
105 T z = std::min(a,b)-mx;
110 return mx + log1p(exp(z));
131 double logsumexp(
const std::vector<t>& v,
double f(
const t&) ) {
146 auto ret = lgamma_r(v, &sgn);
153 auto ret = lgamma_r(v, &sgn);
constexpr double pi
Definition: Numerics.h:20
const double ROOT2
Definition: Numerics.h:17
double mylgamma(double v)
Definition: Numerics.h:143
constexpr double infinity
Definition: Numerics.h:18
T logplusexp(const T a, const T b)
Definition: Numerics.h:89
double logsumexp(const t &v)
Compute log(sum(exp(v)). For now, this just unrolls logplusexp, but we might consider the faster (sta...
Definition: Numerics.h:122
const double LOG2
Definition: Numerics.h:16
constexpr double tau
Definition: Numerics.h:21
double lfactorial(double x)
Definition: Numerics.h:157
T get_log1pexp_breakout_bound(const double precision, T f(T), const T lower=-1e6, const T upper=1e6)
Tis takes a function f(x) and finds a bound B so that f(x) < precision for all x < B...
Definition: Numerics.h:69
constexpr double NaN
Definition: Numerics.h:19
double mygamma(double v)
Definition: Numerics.h:150