void hessian(const F& f, const Eigen::Matrix<double, Eigen::Dynamic, 1>& x, double& fx, Eigen::Matrix<double, Eigen::Dynamic, 1>& grad, Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& H) { H.resize(x.size(), x.size()); grad.resize(x.size()); try { for (int i = 0; i < x.size(); ++i) { start_nested(); Eigen::Matrix<fvar<var>, Eigen::Dynamic, 1> x_fvar(x.size()); for (int j = 0; j < x.size(); ++j) x_fvar(j) = fvar<var>(x(j), i == j); fvar<var> fx_fvar = f(x_fvar); grad(i) = fx_fvar.d_.val(); if (i == 0) fx = fx_fvar.val_.val(); stan::math::grad(fx_fvar.d_.vi_); for (int j = 0; j < x.size(); ++j) H(i, j) = x_fvar(j).val_.adj(); stan::math::recover_memory_nested(); } } catch (const std::exception& e) { stan::math::recover_memory_nested(); throw; } }
void partial_derivative(const F& f, const Eigen::Matrix<T, Eigen::Dynamic, 1>& x, int n, T& fx, T& dfx_dxn) { Eigen::Matrix<fvar<T>, Eigen::Dynamic, 1> x_fvar(x.size()); for (int i = 0; i < x.size(); ++i) x_fvar(i) = fvar<T>(x(i), i == n); fvar<T> fx_fvar = f(x_fvar); fx = fx_fvar.val_; dfx_dxn = fx_fvar.d_; }
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) { H.resize(x.size(), x.size()); grad.resize(x.size()); Eigen::Matrix<fvar<fvar<T> >, Eigen::Dynamic, 1> x_fvar(x.size()); for (int i = 0; i < x.size(); ++i) { for (int j = i; j < x.size(); ++j) { for (int k = 0; k < x.size(); ++k) x_fvar(k) = fvar<fvar<T> >(fvar<T>(x(k), j == k), fvar<T>(i == k, 0)); fvar<fvar<T> > fx_fvar = f(x_fvar); if (j == 0) fx = fx_fvar.val_.val_; if (i == j) grad(i) = fx_fvar.d_.val_; H(i, j) = fx_fvar.d_.d_; H(j, i) = H(i, j); } } }