29 //#include <pthread.h> // mingw de error, by katoh
34 const double IMPOSSIBLE = -FLT_MAX + 1000;
35 const double IMPOSSIBLEDBL = -DBL_MAX + 10000;
40 IsPossible(const T& v) {
41 return (v > (IMPOSSIBLE + 1.0e-5));
46 logSum(const T& a, const T& b)
49 return a + log(1.0 + exp(b - a));
51 return b + log(1.0 + exp(a - b));
57 logSub(const T&a, const T& b)
60 return log(exp(a) - exp(b));
63 return log(exp(a) - exp(b));
69 logSum(const T& a, const T& b, const T& c)
73 return a + log(1.0 + (exp(b - a) + exp(c - a)));
77 return b + log(exp(a - b) + 1.0 + exp(c - b));
81 return c + log(exp(a - c) + exp(b - c) + 1.0);
88 logSumExp(const T& x, const T& y)
90 if(x == y) return x + 0.69314718055;
91 double vmin = std::min(x, y);
92 double vmax = std::max(x, y);
94 if (vmax > vmin + 50) {
98 return vmax + std::log (std::exp (vmin - vmax) + 1.0);