// [[Rcpp::depends(BH)]] // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(StanHeaders)]] #include #include #include #include // [[Rcpp::export]] double test_Jacobian(Eigen::MatrixXd A) { stan::math::matrix_v A_var = stan::math::to_var(A); typedef Eigen::AutoDiffScalar ADScalar; typedef Eigen::Matrix ADMatrix; ADMatrix A_(A.rows(), A.cols()); for (int i = 0; i < A.size(); i++) A_(i).value() = A_var(i); const int derivative_num = A.size(); int derivative_idx = 0; for (int i = 0; i < A.size(); i++) { A_(i).derivatives() = Eigen::VectorXd::Unit(derivative_num, derivative_idx); derivative_idx++; } ADMatrix A_inv = A_.inverse(); stan::math::matrix_v J(derivative_num, derivative_num); int pos = 0; for (int i = 0; i < A.rows(); i++) for (int j = 0; j < A.cols(); j++) { J.col(pos++) = A_inv(i, j).derivatives(); } stan::math::var log_abs_det_J = stan::math::log_determinant(J); return log_abs_det_J.val(); }