1 #ifndef STAN_MATH_REV_FUN_DETERMINANT_HPP 2 #define STAN_MATH_REV_FUN_DETERMINANT_HPP 3 4 #include <stan/math/rev/meta.hpp> 5 #include <stan/math/rev/core.hpp> 6 #include <stan/math/prim/err.hpp> 7 #include <stan/math/prim/fun/Eigen.hpp> 8 9 namespace stan { 10 namespace math { 11 12 template <typename T, require_rev_matrix_t<T>* = nullptr> determinant(const T & m)13inline var determinant(const T& m) { 14 check_square("determinant", "m", m); 15 16 if (m.size() == 0) { 17 return var(1.0); 18 } 19 20 arena_t<T> arena_m = m; 21 auto m_lu = arena_m.val().partialPivLu(); 22 auto arena_m_inv_transpose = to_arena(m_lu.inverse().transpose()); 23 var det = m_lu.determinant(); 24 25 reverse_pass_callback([arena_m, det, arena_m_inv_transpose]() mutable { 26 arena_m.adj() += (det.adj() * det.val()) * arena_m_inv_transpose; 27 }); 28 29 return det; 30 } 31 32 } // namespace math 33 } // namespace stan 34 #endif 35