inline typename boost::math::tools::promote_args<T>::type log1m_exp(const T a) { if (a >= 0) return std::numeric_limits<double>::quiet_NaN(); else if (a > -0.693147) return std::log(-boost::math::expm1(a)); //0.693147 is approximatelly equal to log(2) else return log1m(std::exp(a)); }
Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> read_corr_L(const Eigen::Array<T, Eigen::Dynamic, 1>& CPCs, size_t K, T& log_prob) { Eigen::Matrix<T, Eigen::Dynamic, 1> values(CPCs.rows() - 1); size_t pos = 0; // no need to abs() because this Jacobian determinant // is strictly positive (and triangular) // see inverse of Jacobian in equation 11 of LKJ paper for (size_t k = 1; k <= (K - 2); k++) for (size_t i = k + 1; i <= K; i++) { values(pos) = (K - k - 1) * log1m(square(CPCs(pos))); pos++; } log_prob += 0.5 * sum(values); return read_corr_L(CPCs, K); }
inline fvar<T> log1m(const fvar<T>& x) { return fvar<T>(log1m(x.val_), -x.d_ / (1 - x.val_)); }
static inline T fun(const T& x) { return log1m(x); }