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];