1#ifndef STAN_MATH_MIX_FUNCTOR_FINITE_DIFF_GRAD_HESSIAN_AUTO_HPP
2#define STAN_MATH_MIX_FUNCTOR_FINITE_DIFF_GRAD_HESSIAN_AUTO_HPP
45 double& fx, Eigen::MatrixXd& hess,
46 std::vector<Eigen::MatrixXd>& grad_hess_fx) {
50 grad_hess_fx.reserve(d);
52 Eigen::VectorXd x_temp(x);
53 Eigen::VectorXd grad_auto(d);
54 Eigen::MatrixXd hess_auto(d, d);
55 Eigen::MatrixXd hess_diff(d, d);
57 hessian(f, x, fx, grad_auto, hess);
59 for (
int i = 0; i < d; ++i) {
64 x_temp(i) = x(i) + 2 * epsilon;
65 hessian(f, x_temp, dummy_fx_eval, grad_auto, hess_auto);
66 hess_diff = -hess_auto;
68 x_temp(i) = x(i) + -2 * epsilon;
69 hessian(f, x_temp, dummy_fx_eval, grad_auto, hess_auto);
70 hess_diff += hess_auto;
72 x_temp(i) = x(i) + epsilon;
73 hessian(f, x_temp, dummy_fx_eval, grad_auto, hess_auto);
74 hess_diff += 8 * hess_auto;
76 x_temp(i) = x(i) + -epsilon;
77 hessian(f, x_temp, dummy_fx_eval, grad_auto, hess_auto);
78 hess_diff -= 8 * hess_auto;
81 hess_diff /= 12 * epsilon;
83 grad_hess_fx.push_back(hess_diff);
void finite_diff_grad_hessian_auto(const F &f, const Eigen::VectorXd &x, double &fx, Eigen::MatrixXd &hess, std::vector< Eigen::MatrixXd > &grad_hess_fx)
Calculate the value, Hessian, and the gradient of the Hessian of the specified function at the specif...
double finite_diff_stepsize(double u)
Return the stepsize for finite difference evaluations at the specified scalar.
void hessian(const F &f, const Eigen::Matrix< T, Eigen::Dynamic, 1 > &x, T &fx, Eigen::Matrix< T, Eigen::Dynamic, 1 > &grad, Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &H)
Calculate the value, the gradient, and the Hessian, of the specified function at the specified argume...
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...