1 #ifndef __STAN__OPTIMIZATION__NEWTON_HPP__
2 #define __STAN__OPTIMIZATION__NEWTON_HPP__
5 #include <Eigen/Cholesky>
6 #include <Eigen/Eigenvalues>
11 namespace optimization {
13 typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
matrix_d;
14 typedef Eigen::Matrix<double, Eigen::Dynamic, 1>
vector_d;
21 Eigen::SelfAdjointEigenSolver<matrix_d> solver(H);
22 matrix_d eigenvectors = solver.eigenvectors();
23 vector_d eigenvalues = solver.eigenvalues();
24 vector_d eigenprojections = eigenvectors.transpose() * g;
25 for (
int i = 0; i < g.size(); i++) {
26 eigenprojections[i] = -eigenprojections[i] /
fabs(eigenvalues[i]);
28 g = eigenvectors * eigenprojections;
33 std::vector<double>& params_r,
34 std::vector<int>& params_i,
35 std::ostream* output_stream = 0) {
36 std::vector<double> gradient;
37 std::vector<double> hessian;
41 matrix_d H(params_r.size(), params_r.size());
42 for (
size_t i = 0; i < hessian.size(); i++) {
46 for (
size_t i = 0; i < gradient.size(); i++)
48 make_negative_definite_and_solve(H, g);
51 std::vector<double> new_params_r(params_r.size());
56 for (
size_t i = 0; i < params_r.size(); i++)
57 new_params_r[i] = params_r[i] - step_size * g[i];
60 }
catch (std::exception&
e) {
64 for (
size_t i = 0; i < params_r.size(); i++)
65 params_r[i] = new_params_r[i];
The prob_grad class represents densities with fixed numbers of discrete and scalar parameters and the...
virtual double grad_log_prob(std::vector< double > ¶ms_r, std::vector< int > ¶ms_i, std::vector< double > &gradient, std::ostream *output_stream=0)=0
virtual double grad_hess_log_prob(std::vector< double > ¶ms_r, std::vector< int > ¶ms_i, std::vector< double > &gradient, std::vector< double > &hessian, std::ostream *output_stream=0)
Evaluate the log-probability, its gradient, and its Hessian at params_r.
var fabs(const var &a)
Return the absolute value of the variable (cmath).
double e()
Return the base of the natural logarithm.
double newton_step(stan::model::prob_grad &model, std::vector< double > ¶ms_r, std::vector< int > ¶ms_i, std::ostream *output_stream=0)
Eigen::Matrix< double, Eigen::Dynamic, 1 > vector_d
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_d
Probability, optimization and sampling library.