autoppl  v0.8
A C++ template library for probabilistic programming
leapfrog.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <fastad>
3 
4 namespace ppl {
5 namespace mcmc {
6 
17 template <class ADExprType
18  , class MatType>
19 inline double reset_autodiff(ADExprType& ad_expr,
20  Eigen::MatrixBase<MatType>& adjoints,
21  Eigen::MatrixBase<MatType>& tp_adjoints)
22 {
23  adjoints.setZero();
24  tp_adjoints.setZero();
25  return ad::autodiff(ad_expr);
26 }
27 
49 template <class ADExprType
50  , class MatType
51  , class MomentumHandlerType>
52 inline double leapfrog(ADExprType& ad_expr,
53  Eigen::MatrixBase<MatType>& theta,
54  Eigen::MatrixBase<MatType>& theta_adj,
55  Eigen::MatrixBase<MatType>& tp_adj,
56  Eigen::MatrixBase<MatType>& r,
57  const MomentumHandlerType& m_handler,
58  double epsilon,
59  bool reuse_adj)
60 {
61  if (!reuse_adj) {
62  reset_autodiff(ad_expr, theta_adj, tp_adj);
63  }
64  const double half_step = epsilon/2.;
65  r += half_step * theta_adj;
66 
67  theta += epsilon * m_handler.dkinetic_dr(r);
68 
69  const double new_potential =
70  -reset_autodiff(ad_expr, theta_adj, tp_adj);
71  r += half_step * theta_adj;
72 
73  return new_potential;
74 }
75 
76 } // namespace mcmc
77 } // namespace ppl
ppl::mcmc::reset_autodiff
double reset_autodiff(ADExprType &ad_expr, Eigen::MatrixBase< MatType > &adjoints, Eigen::MatrixBase< MatType > &tp_adjoints)
Definition: leapfrog.hpp:19
ppl::mcmc::leapfrog
double leapfrog(ADExprType &ad_expr, Eigen::MatrixBase< MatType > &theta, Eigen::MatrixBase< MatType > &theta_adj, Eigen::MatrixBase< MatType > &tp_adj, Eigen::MatrixBase< MatType > &r, const MomentumHandlerType &m_handler, double epsilon, bool reuse_adj)
Definition: leapfrog.hpp:52
ppl
Definition: bounded.hpp:11