1 #ifndef __STAN__OPTIMIZATION__NESTEROV__GRADIENT_HPP__
2 #define __STAN__OPTIMIZATION__NESTEROV__GRADIENT_HPP__
8 namespace optimization {
14 std::vector<double> x_;
15 std::vector<double> y_;
18 std::vector<double> grad_;
21 std::ostream* output_stream_;
26 double lastlogp = logp_;
27 std::vector<double> lastgrad = grad_;
28 std::vector<double> lastx = x_;
29 for (
size_t i = 0; i < x_.size(); i++)
30 x_[i] += epsilon_ * grad_[i];
32 if (logp_ > lastlogp) {
33 while (logp_ > lastlogp) {
38 for (
size_t i = 0; i < x_.size(); i++)
39 x_[i] += epsilon_ * grad_[i];
47 while (!(logp_ > lastlogp)) {
49 for (
size_t i = 0; i < x_.size(); i++)
50 x_[i] = lastx[i] + epsilon_ * lastgrad[i];
59 const std::vector<int>& params_i,
61 std::ostream* output_stream = 0) :
62 model_(model), x_(params_r), y_(params_r), z_(params_i),
63 epsilon_(epsilon0), iteration_(0), output_stream_(output_stream) {
69 double logp() {
return logp_; }
70 void grad(std::vector<double>& g) { g = grad_; }
71 void params_r(std::vector<double>& x) { x = y_; }
75 std::vector<double> lastx = x_;
76 double lastlogp = logp_;
77 double gradnormsq = 0;
78 for (
size_t i = 0; i < grad_.size(); i++)
79 gradnormsq += grad_[i] * grad_[i];
81 while (!(logp_ > lastlogp + 0.5 * epsilon_ * gradnormsq)) {
83 for (
size_t i = 0; i < x_.size(); i++)
84 x_[i] = y_[i] + epsilon_ * grad_[i];
85 logp_ = model_.
log_prob(x_, z_, output_stream_);
87 for (
size_t i = 0; i < x_.size(); i++)
89 (iteration_ - 1) / (iteration_ + 2) * (x_[i] - lastx[i]);