1 #ifndef STAN_MCMC_HMC_INTEGRATORS_IMPL_LEAPFROG_HPP
2 #define STAN_MCMC_HMC_INTEGRATORS_IMPL_LEAPFROG_HPP
4 #include <stan/math/prim/mat/fun/Eigen.hpp>
10 template <
typename Hamiltonian>
14 max_num_fixed_point_(10),
15 fixed_point_threshold_(1e-8) {}
18 typename Hamiltonian::PointType& z,
19 Hamiltonian& hamiltonian,
23 hat_phi(z, hamiltonian, epsilon, info_writer, error_writer);
24 hat_tau(z, hamiltonian, epsilon, this->max_num_fixed_point_,
25 info_writer, error_writer);
28 void update_q(
typename Hamiltonian::PointType& z,
29 Hamiltonian& hamiltonian,
34 Eigen::VectorXd q_init = z.q + 0.5 * epsilon * hamiltonian.dtau_dp(z);
35 Eigen::VectorXd delta_q(z.q.size());
37 for (
int n = 0; n < this->max_num_fixed_point_; ++n) {
39 z.q.noalias() = q_init + 0.5 * epsilon * hamiltonian.dtau_dp(z);
40 hamiltonian.update_metric(z, info_writer, error_writer);
43 if (delta_q.cwiseAbs().maxCoeff() < this->fixed_point_threshold_)
46 hamiltonian.update_gradients(z, info_writer, error_writer);
50 typename Hamiltonian::PointType& z,
51 Hamiltonian& hamiltonian,
55 hat_tau(z, hamiltonian, epsilon, 1, info_writer, error_writer);
56 hat_phi(z, hamiltonian, epsilon, info_writer, error_writer);
60 void hat_phi(
typename Hamiltonian::PointType& z,
61 Hamiltonian& hamiltonian,
65 z.p -= epsilon * hamiltonian.dphi_dq(z, info_writer, error_writer);
69 void hat_tau(
typename Hamiltonian::PointType& z,
70 Hamiltonian& hamiltonian,
75 Eigen::VectorXd p_init = z.p;
76 Eigen::VectorXd delta_p(z.p.size());
78 for (
int n = 0; n < num_fixed_point; ++n) {
80 z.p.noalias() = p_init
82 * hamiltonian.dtau_dq(z, info_writer, error_writer);
84 if (delta_p.cwiseAbs().maxCoeff() < this->fixed_point_threshold_)
90 return this->max_num_fixed_point_;
94 if (n > 0) this->max_num_fixed_point_ = n;
98 return this->fixed_point_threshold_;
102 if (t > 0) this->fixed_point_threshold_ = t;
106 int max_num_fixed_point_;
107 double fixed_point_threshold_;
void set_fixed_point_threshold(double t)
int max_num_fixed_point()
Probability, optimization and sampling library.
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)
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)
void hat_tau(typename Hamiltonian::PointType &z, Hamiltonian &hamiltonian, double epsilon, int num_fixed_point, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)
double fixed_point_threshold()
base_writer is an abstract base class defining the interface for Stan writer callbacks.
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)
void hat_phi(typename Hamiltonian::PointType &z, Hamiltonian &hamiltonian, double epsilon, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)
void set_max_num_fixed_point(int n)