Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
base_leapfrog.hpp
Go to the documentation of this file.
1 #ifndef STAN__MCMC__BASE__LEAPFROG__BETA
2 #define STAN__MCMC__BASE__LEAPFROG__BETA
3 
4 #include <iostream>
5 #include <iomanip>
7 
8 namespace stan {
9 
10  namespace mcmc {
11 
12  template <typename H, typename P>
13  class base_leapfrog: public base_integrator<H, P> {
14 
15  public:
16 
17  base_leapfrog(std::ostream* o): base_integrator<H, P>(o) {};
18 
19  void evolve(P& z, H& hamiltonian, const double epsilon) {
20 
21  begin_update_p(z, hamiltonian, 0.5 * epsilon);
22 
23  update_q(z, hamiltonian, epsilon);
24  hamiltonian.update(z);
25 
26  end_update_p(z, hamiltonian, 0.5 * epsilon);
27 
28  }
29 
30  void verbose_evolve(P& z, H& hamiltonian, const double epsilon) {
31 
32  this->out_stream_->precision(6);
33  int width = 14;
34  int nColumn = 4;
35 
36  if (this->out_stream_) {
37 
38  *(this->out_stream_) << "Verbose Hamiltonian Evolution, Step Size = " << epsilon << ":" << std::endl;
39  *(this->out_stream_) << " " << std::setw(nColumn * width) << std::setfill('-')
40  << "" << std::setfill(' ') << std::endl;
41  *(this->out_stream_) << " "
42  << std::setw(width) << std::left << "Poisson"
43  << std::setw(width) << std::left << "Initial"
44  << std::setw(width) << std::left << "Current"
45  << std::setw(width) << std::left << "DeltaH"
46  << std::endl;
47  *(this->out_stream_) << " "
48  << std::setw(width) << std::left << "Operator"
49  << std::setw(width) << std::left << "Hamiltonian"
50  << std::setw(width) << std::left << "Hamiltonian"
51  << std::setw(width) << std::left << "/ Stepsize^{2}"
52  << std::endl;
53  *(this->out_stream_) << " " << std::setw(nColumn * width) << std::setfill('-')
54  << "" << std::setfill(' ') << std::endl;
55 
56  }
57 
58  double H0 = hamiltonian.H(z);
59 
60  begin_update_p(z, hamiltonian, 0.5 * epsilon);
61 
62  double H1 = hamiltonian.H(z);
63 
64  if (this->out_stream_) {
65 
66  *(this->out_stream_) << " "
67  << std::setw(width) << std::left << "hat{V}/2"
68  << std::setw(width) << std::left << H0
69  << std::setw(width) << std::left << H1
70  << std::setw(width) << std::left << (H1 - H0) / (epsilon * epsilon)
71  << std::endl;
72 
73  }
74 
75  update_q(z, hamiltonian, epsilon);
76  hamiltonian.update(z);
77 
78  double H2 = hamiltonian.H(z);
79 
80  if (this->out_stream_) {
81 
82  *(this->out_stream_) << " "
83  << std::setw(width) << std::left << "hat{T}"
84  << std::setw(width) << std::left << H0
85  << std::setw(width) << std::left << H2
86  << std::setw(width) << std::left << (H2 - H0) / (epsilon * epsilon)
87  << std::endl;
88 
89  }
90 
91  end_update_p(z, hamiltonian, 0.5 * epsilon);
92 
93  double H3 = hamiltonian.H(z);
94 
95  if (this->out_stream_) {
96 
97  *(this->out_stream_) << " "
98  << std::setw(width) << std::left << "hat{V}/2"
99  << std::setw(width) << std::left << H0
100  << std::setw(width) << std::left << H3
101  << std::setw(width) << std::left << (H3 - H0) / (epsilon * epsilon)
102  << std::endl;
103 
104  *(this->out_stream_) << " " << std::setw(nColumn * width) << std::setfill('-')
105  << "" << std::setfill(' ') << std::endl;
106 
107  }
108 
109  }
110 
111  virtual void begin_update_p(P& z, H& hamiltonian, double epsilon) = 0;
112  virtual void update_q(P& z, H& hamiltonian, double epsilon) = 0;
113  virtual void end_update_p(P& z, H& hamiltonian, double epsilon) = 0;
114 
115  };
116 
117  } // mcmc
118 
119 } // stan
120 
121 
122 #endif
void evolve(P &z, H &hamiltonian, const double epsilon)
base_leapfrog(std::ostream *o)
virtual void update_q(P &z, H &hamiltonian, double epsilon)=0
void verbose_evolve(P &z, H &hamiltonian, const double epsilon)
virtual void begin_update_p(P &z, H &hamiltonian, double epsilon)=0
virtual void end_update_p(P &z, H &hamiltonian, double epsilon)=0

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