Stan  1.3
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
nesterov_gradient.hpp
Go to the documentation of this file.
1 #ifndef __STAN__OPTIMIZATION__NESTEROV__GRADIENT_HPP__
2 #define __STAN__OPTIMIZATION__NESTEROV__GRADIENT_HPP__
3 
5 
6 namespace stan {
7 
8  namespace optimization {
9 
11 
12  private:
13  stan::model::prob_grad& model_;
14  std::vector<double> x_;
15  std::vector<double> y_;
16  std::vector<int> z_;
17  double logp_;
18  std::vector<double> grad_;
19  double epsilon_;
20  int iteration_;
21  std::ostream* output_stream_;
22 
23  public:
25  epsilon_ = 1;
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];
31  logp_ = model_.grad_log_prob(x_, z_, grad_, output_stream_);
32  if (logp_ > lastlogp) {
33  while (logp_ > lastlogp) {
34  lastlogp = logp_;
35  lastgrad = grad_;
36  lastx = x_;
37  epsilon_ *= 2;
38  for (size_t i = 0; i < x_.size(); i++)
39  x_[i] += epsilon_ * grad_[i];
40  logp_ = model_.grad_log_prob(x_, z_, grad_, output_stream_);
41  }
42  logp_ = lastlogp;
43  grad_ = lastgrad;
44  x_ = lastx;
45  epsilon_ /= 2;
46  } else {
47  while (!(logp_ > lastlogp)) {
48  epsilon_ /= 2;
49  for (size_t i = 0; i < x_.size(); i++)
50  x_[i] = lastx[i] + epsilon_ * lastgrad[i];
51  logp_ = model_.grad_log_prob(x_, z_, grad_, output_stream_);
52  }
53  }
54  y_ = x_;
55  }
56 
58  const std::vector<double>& params_r,
59  const std::vector<int>& params_i,
60  double epsilon0 = -1,
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) {
64  logp_ = model.grad_log_prob(x_, z_, grad_, output_stream_);
65  if (epsilon_ == -1)
67  }
68 
69  double logp() { return logp_; }
70  void grad(std::vector<double>& g) { g = grad_; }
71  void params_r(std::vector<double>& x) { x = y_; }
72 
73  double step() {
74  iteration_++;
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];
80  epsilon_ *= 2;
81  while (!(logp_ > lastlogp + 0.5 * epsilon_ * gradnormsq)) {
82  epsilon_ /= 2;
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_);
86  }
87  for (size_t i = 0; i < x_.size(); i++)
88  y_[i] = x_[i] +
89  (iteration_ - 1) / (iteration_ + 2) * (x_[i] - lastx[i]);
90  logp_ = model_.grad_log_prob(y_, z_, grad_, output_stream_);
91  return logp_;
92  }
93  };
94 
95  }
96 
97 }
98 
99 #endif

     [ Stan Home Page ] © 2011–2013, Stan Development Team.