1 #ifndef STAN_MATH_REV_MAT_FUN_DETERMINANT_HPP
2 #define STAN_MATH_REV_MAT_FUN_DETERMINANT_HPP
15 template<
int R,
int C>
16 class determinant_vari :
public vari {
23 explicit determinant_vari(
const Eigen::Matrix<var, R, C> &A)
24 : vari(determinant_vari_calc(A)),
27 A_(reinterpret_cast<double*>
29 .alloc(sizeof(double) * A.
rows() * A.
cols()))),
30 _adjARef(reinterpret_cast<vari**>
32 .alloc(sizeof(vari*) * A.
rows() * A.
cols()))) {
36 A_[pos] = A(i, j).val();
37 _adjARef[pos++] = A(i, j).vi_;
42 double determinant_vari_calc(
const Eigen::Matrix<var, R, C> &A) {
43 Eigen::Matrix<double, R, C> Ad(A.rows(), A.cols());
46 Ad(i, j) = A(i, j).val();
47 return Ad.determinant();
49 virtual void chain() {
52 Matrix<double, R, C> adjA(_rows, _cols);
53 adjA = (adj_ * val_) *
54 Map<Matrix<double, R, C> >(A_, _rows, _cols).inverse().transpose();
58 _adjARef[pos++]->adj_ += adjA(i, j);
65 template <
int R,
int C>
68 return var(
new determinant_vari<R, C>(m));
int rows(const Eigen::Matrix< T, R, C > &m)
Return the number of rows in the specified matrix, vector, or row vector.
Independent (input) and dependent (output) variables for gradients.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Index size_type
Type for sizes and indexes in an Eigen matrix with double e.
fvar< T > determinant(const Eigen::Matrix< fvar< T >, R, C > &m)
int cols(const Eigen::Matrix< T, R, C > &m)
Return the number of columns in the specified matrix, vector, or row vector.
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.
AutodiffStackStorage< vari, chainable_alloc > ChainableStack