1 #ifndef STAN_MATH_REV_MAT_FUN_LOG_DETERMINANT_SPD_HPP
2 #define STAN_MATH_REV_MAT_FUN_LOG_DETERMINANT_SPD_HPP
13 template <
int R,
int C>
19 Matrix<double, R, C> m_d(m.rows(), m.cols());
20 for (
int i = 0; i < m.size(); ++i)
23 Eigen::LDLT<Matrix<double, R, C> > ldlt(m_d);
24 if (ldlt.info() != Eigen::Success) {
28 "failed LDLT factorization");
32 m_d.setIdentity(m.rows(), m.cols());
33 ldlt.solveInPlace(m_d);
35 if (ldlt.isNegative() || (ldlt.vectorD().array() <= 1
e-16).any()) {
39 "matrix is negative definite");
42 double val = ldlt.vectorD().array().log().sum();
45 "log determininant of the matrix argument", val);
49 for (
int i = 0; i < m.size(); ++i)
50 operands[i] = m(i).vi_;
54 for (
int i = 0; i < m.size(); ++i)
55 gradients[i] = m_d(i);
58 operands, gradients));
static stack_alloc memalloc_
The variable implementation base class.
Independent (input) and dependent (output) variables for gradients.
A variable implementation taking a sequence of operands and partial derivatives with respect to the o...
void domain_error(const char *function, const char *name, const T &y, const char *msg1, const char *msg2)
Throw a domain error with a consistently formatted message.
T * alloc_array(size_t n)
Allocate an array on the arena of the specified size to hold values of the specified template paramet...
double e()
Return the base of the natural logarithm.
bool check_finite(const char *function, const char *name, const T_y &y)
Return true if y is finite.
bool check_square(const char *function, const char *name, const Eigen::Matrix< T_y, Eigen::Dynamic, Eigen::Dynamic > &y)
Return true if the specified matrix is square.
T log_determinant_spd(const Eigen::Matrix< T, R, C > &m)
Returns the log absolute determinant of the specified square matrix.