Hamiltonian Monte Carlo

montecarlo.hpp
Go to the documentation of this file.
1 //
2 // Created by Lars Gebraad on 7/11/17.
3 //
4 
5 #ifndef HMC_VSP_MONTECARLO_HPP
6 #define HMC_VSP_MONTECARLO_HPP
7 
44 #include <libio.h>
45 #include <fstream>
46 
47 class montecarlo {
48 public:
49  // Constructors and destructors
50  montecarlo(prior &in_prior, data &in_data, forwardModel in_model, int in_nt, double in_dt, int in_iterations,
51  bool useGeneralisedMomentumPropose, bool useGeneralisedMomentumKinetic, bool normalizeMomentum, bool
52  evaluateHamiltonianBeforeLeap);
53 
54 // montecarlo(prior &in_prior, data &in_data, posterior &in_posterior, forwardModel &in_model, int in_nt, double in_dt,
55 // int in_iterations, bool useGeneralisedMomentumPropose, bool useGeneralisedMomentumKinetic, bool normalizeMomentum);
56 
57 
58  ~montecarlo();
59 
60  void sample(bool hamilton);
61 
62  std::vector<double> precomp_misfitGrad(std::vector<double> parameters);
63 
64 private:
65  // Fields
70  int _nt; // Number of time steps for trajectory
71  double _dt; // Time step for trajectory
72  int _iterations; // Number of iterations for Monte Carlo sampling
77 
78  std::vector<double> _currentModel;
79  std::vector<double> _proposedModel;
80  std::vector<double> _currentMomentum;
81  std::vector<double> _proposedMomentum;
82 
83  std::vector<std::vector<double>> _massMatrix;
84  std::vector<std::vector<double>> _CholeskyLowerMassMatrix;
85  std::vector<std::vector<double>> _inverseMassMatrix; // needed to write Hamilton's equations in vector form
86  std::vector<std::vector<double>> _inverseMassMatrixDiagonal; // needed to write Hamilton's equations in vector form
87 
88  // Precomputed misfit function elements
89  std::vector<std::vector<double>> _A;
90  std::vector<double> _bT; // Because I haven't coded up the actual left multiplication of vector-matrices
91  double _c;
92 
93  // Member functions
94  void propose_metropolis();
95 
96  void propose_hamilton(int &uturns);
97 
98  void leap_frog(int &uturns, bool writeTrajectory);
99 
100  double chi();
101 
102  double energy();
103 
104  void write_sample(std::ofstream &outfile, double misfit);
105 
106  double precomp_misfit();
107 
108  std::vector<double> precomp_misfitGrad();
109 
110  double kineticEnergy();
111 };
112 
113 #endif //HMC_VSP_MONTECARLO_HPP
int _iterations
Definition: montecarlo.hpp:72
std::vector< std::vector< double > > _inverseMassMatrix
Definition: montecarlo.hpp:85
double _dt
Definition: montecarlo.hpp:71
double chi()
Definition: montecarlo.cpp:98
double precomp_misfit()
Definition: montecarlo.cpp:83
montecarlo(prior &in_prior, data &in_data, forwardModel in_model, int in_nt, double in_dt, int in_iterations, bool useGeneralisedMomentumPropose, bool useGeneralisedMomentumKinetic, bool normalizeMomentum, bool evaluateHamiltonianBeforeLeap)
Definition: montecarlo.cpp:17
std::vector< double > precomp_misfitGrad()
Definition: montecarlo.cpp:93
bool _normalizeMomentum
Definition: montecarlo.hpp:75
forwardModel _model
Definition: montecarlo.hpp:68
prior _prior
Definition: montecarlo.hpp:66
std::vector< std::vector< double > > _inverseMassMatrixDiagonal
Definition: montecarlo.hpp:86
bool _useGeneralisedMomentumPropose
Definition: montecarlo.hpp:74
void write_sample(std::ofstream &outfile, double misfit)
Definition: montecarlo.cpp:204
std::vector< double > _currentMomentum
Definition: montecarlo.hpp:80
double kineticEnergy()
Definition: montecarlo.cpp:87
void sample(bool hamilton)
Definition: montecarlo.cpp:109
double energy()
Definition: montecarlo.cpp:103
std::vector< std::vector< double > > _CholeskyLowerMassMatrix
Definition: montecarlo.hpp:84
bool _evaluateHamiltonianBeforeLeap
Definition: montecarlo.hpp:76
std::vector< double > _bT
Definition: montecarlo.hpp:90
std::vector< double > _currentModel
Definition: montecarlo.hpp:78
std::vector< double > _proposedMomentum
Definition: montecarlo.hpp:81
std::vector< std::vector< double > > _massMatrix
Definition: montecarlo.hpp:83
std::vector< double > _proposedModel
Definition: montecarlo.hpp:79
void propose_metropolis()
Definition: montecarlo.cpp:69
double _c
Definition: montecarlo.hpp:91
bool _useGeneralisedMomentumKinetic
Definition: montecarlo.hpp:73
void leap_frog(int &uturns, bool writeTrajectory)
Definition: montecarlo.cpp:161
std::vector< std::vector< double > > _A
Definition: montecarlo.hpp:89
Prior information in parameter space.
Definition: auxiliary.hpp:20
void propose_hamilton(int &uturns)
Definition: montecarlo.cpp:74
posterior _posterior
Definition: montecarlo.hpp:69