#ifndef UTIL_H #define UTIL_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include // mingw de error, by katoh #include namespace ProbCons { const double IMPOSSIBLE = -FLT_MAX + 1000; const double IMPOSSIBLEDBL = -DBL_MAX + 10000; namespace MXSCARNA { template inline bool IsPossible(const T& v) { return (v > (IMPOSSIBLE + 1.0e-5)); } template inline T logSum(const T& a, const T& b) { if (a >= b) { return a + log(1.0 + exp(b - a)); } else { return b + log(1.0 + exp(a - b)); } } template inline T logSub(const T&a, const T& b) { if(a > b) { return log(exp(a) - exp(b)); } else { return log(exp(a) - exp(b)); } } template inline T logSum(const T& a, const T& b, const T& c) { if (a >= b) { if( a >= c ) { return a + log(1.0 + (exp(b - a) + exp(c - a))); } else { if( b >= c) { return b + log(exp(a - b) + 1.0 + exp(c - b)); } } } return c + log(exp(a - c) + exp(b - c) + 1.0); } } template inline T logSumExp(const T& x, const T& y) { if(x == y) return x + 0.69314718055; double vmin = std::min(x, y); double vmax = std::max(x, y); if (vmax > vmin + 50) { return vmax; } else { return vmax + std::log (std::exp (vmin - vmax) + 1.0); } } } #endif /* UTIL_H */