Stan  2.10.0
probability, sampling & optimization
base_leapfrog.hpp
Go to the documentation of this file.
1 #ifndef STAN_MCMC_HMC_INTEGRATORS_BASE_LEAPFROG_HPP
2 #define STAN_MCMC_HMC_INTEGRATORS_BASE_LEAPFROG_HPP
3 
6 #include <iostream>
7 #include <iomanip>
8 
9 namespace stan {
10  namespace mcmc {
11 
12  template <class Hamiltonian>
13  class base_leapfrog : public base_integrator<Hamiltonian> {
14  public:
16  : base_integrator<Hamiltonian>() {}
17 
18  void evolve(typename Hamiltonian::PointType& z,
19  Hamiltonian& hamiltonian,
20  const double epsilon,
23  begin_update_p(z, hamiltonian, 0.5 * epsilon,
24  info_writer, error_writer);
25  update_q(z, hamiltonian, epsilon,
26  info_writer, error_writer);
27  end_update_p(z, hamiltonian, 0.5 * epsilon,
28  info_writer, error_writer);
29  }
30 
31  void
32  verbose_evolve(typename Hamiltonian::PointType& z,
33  Hamiltonian& hamiltonian,
34  const double epsilon,
37  std::stringstream msg;
38  msg.precision(6);
39 
40  int width = 14;
41  int nColumn = 4;
42 
43  msg << "Verbose Hamiltonian Evolution, Step Size = " << epsilon << ":";
44  info_writer(msg.str());
45 
46  msg.str("");
47  msg << " " << std::setw(nColumn * width)
48  << std::setfill('-')
49  << "" << std::setfill(' ');
50  info_writer(msg.str());
51 
52  msg.str("");
53  msg << " "
54  << std::setw(width) << std::left << "Poisson"
55  << std::setw(width) << std::left << "Initial"
56  << std::setw(width) << std::left << "Current"
57  << std::setw(width) << std::left << "DeltaH";
58  info_writer(msg.str());
59 
60  msg.str("");
61  msg << " "
62  << std::setw(width) << std::left << "Operator"
63  << std::setw(width) << std::left << "Hamiltonian"
64  << std::setw(width) << std::left << "Hamiltonian"
65  << std::setw(width) << std::left << "/ Stepsize^{2}";
66  info_writer(msg.str());
67 
68  msg.str("");
69  msg << " " << std::setw(nColumn * width)
70  << std::setfill('-')
71  << "" << std::setfill(' ');
72  info_writer(msg.str());
73 
74  double H0 = hamiltonian.H(z);
75 
76  begin_update_p(z, hamiltonian, 0.5 * epsilon,
77  info_writer, error_writer);
78 
79  double H1 = hamiltonian.H(z);
80 
81  msg.str("");
82  msg << " "
83  << std::setw(width) << std::left << "hat{V}/2"
84  << std::setw(width) << std::left << H0
85  << std::setw(width) << std::left << H1
86  << std::setw(width) << std::left << (H1 - H0) / (epsilon * epsilon);
87  info_writer(msg.str());
88 
89  update_q(z, hamiltonian, epsilon, info_writer, error_writer);
90 
91  double H2 = hamiltonian.H(z);
92 
93  msg.str("");
94  msg << " "
95  << std::setw(width) << std::left << "hat{T}"
96  << std::setw(width) << std::left << H0
97  << std::setw(width) << std::left << H2
98  << std::setw(width) << std::left << (H2 - H0) / (epsilon * epsilon);
99  info_writer(msg.str());
100 
101  end_update_p(z, hamiltonian, 0.5 * epsilon, info_writer, error_writer);
102 
103  double H3 = hamiltonian.H(z);
104 
105  msg.str("");
106  msg << " "
107  << std::setw(width) << std::left << "hat{V}/2"
108  << std::setw(width) << std::left << H0
109  << std::setw(width) << std::left << H3
110  << std::setw(width) << std::left << (H3 - H0) / (epsilon * epsilon);
111  info_writer(msg.str());
112 
113  msg.str("");
114  msg << " "
115  << std::setw(nColumn * width)
116  << std::setfill('-')
117  << ""
118  << std::setfill(' ');
119  info_writer(msg.str());
120  }
121 
122  virtual
123  void begin_update_p(
124  typename Hamiltonian::PointType& z,
125  Hamiltonian& hamiltonian, double epsilon,
127  interface_callbacks::writer::base_writer& error_writer) = 0;
128  virtual
129  void update_q(typename Hamiltonian::PointType& z,
130  Hamiltonian& hamiltonian, double epsilon,
132  interface_callbacks::writer::base_writer& error_writer) = 0;
133  virtual
134  void end_update_p(
135  typename Hamiltonian::PointType& z,
136  Hamiltonian& hamiltonian, double epsilon,
138  interface_callbacks::writer::base_writer& error_writer) = 0;
139  };
140 
141  } // mcmc
142 } // stan
143 #endif
virtual void update_q(typename Hamiltonian::PointType &z, Hamiltonian &hamiltonian, double epsilon, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)=0
virtual void begin_update_p(typename Hamiltonian::PointType &z, Hamiltonian &hamiltonian, double epsilon, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)=0
Probability, optimization and sampling library.
virtual void end_update_p(typename Hamiltonian::PointType &z, Hamiltonian &hamiltonian, double epsilon, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)=0
base_writer is an abstract base class defining the interface for Stan writer callbacks.
Definition: base_writer.hpp:20
void verbose_evolve(typename Hamiltonian::PointType &z, Hamiltonian &hamiltonian, const double epsilon, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)
void evolve(typename Hamiltonian::PointType &z, Hamiltonian &hamiltonian, const double epsilon, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)

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