versatile-mcmc  0.1.7
metropolis.hpp
Go to the documentation of this file.
1 
14 #ifndef VMCMC_METROPOLIS_H_
15 #define VMCMC_METROPOLIS_H_
16 
17 #include <vmcmc/algorithm.hpp>
18 
19 #include <memory>
20 
21 namespace vmcmc
22 {
23 
24 class Proposal;
25 
40 {
41 public:
42  static double CalculateMHRatio(const Sample& prevState, const Sample& nextState,
43  double proposalAsymmetry = 1.0, double beta = 1.0);
44 
45 public:
47  virtual ~MetropolisHastings();
48 
49  virtual void Initialize() override;
50 
51  virtual void Advance(size_t nSteps = 1) override;
52 
53  virtual void Finalize() override;
54 
55  virtual size_t NumberOfChains() override { return fChainConfigs.size(); }
56  virtual const Chain& GetChain(size_t cIndex = 0) override;
57 
58  void SetNumberOfChains(size_t nChains);
59 
60  template <typename ContainerT = std::initializer_list<double>>
61  void SetBetas(ContainerT betas);
62  const std::vector<double>& GetBetas() const { return fBetas; }
63 
64  template <typename ProposalT, typename... ArgsT>
65  void SetProposalFunction(ArgsT&&... args);
66  void SetProposalFunction(std::shared_ptr<Proposal> proposalFunction) { fProposalFunction = proposalFunction; }
67  std::shared_ptr<Proposal> GetProposalFunction() { return fProposalFunction; };
68  std::shared_ptr<const Proposal> GetProposalFunction() const { return fProposalFunction; }
69 
70  void SetRandomizeStartPoint(bool randomizeStartPoint) { fRandomizeStartPoint = randomizeStartPoint; }
71  bool IsRandomizeStartPoint() const { return fRandomizeStartPoint; }
72 
73  void SetMultiThreading(bool enable);
74  bool IsMultiThreading() const { return fMultiThreading; }
75 
82  double GetSwapAcceptanceRate(size_t iChain, ptrdiff_t iBeta = -1) const;
83 
84 protected:
85  void AdvanceChainConfig(size_t iChainConfig, size_t iBeta, size_t nSteps = 1);
86  void ProposePtSwapping(size_t iChainConfig);
87 
88  bool fRandomizeStartPoint;
89 
90  std::vector<double> fBetas;
91  std::shared_ptr<Proposal> fProposalFunction;
92 
93  size_t fPtFrequency;
94 
95  struct ChainConfig;
96  std::vector<std::unique_ptr<ChainConfig>> fChainConfigs;
97 
98 private:
99  bool fMultiThreading;
100 };
101 
102 template <typename ProposalT, typename... ArgsT>
103 inline void MetropolisHastings::SetProposalFunction(ArgsT&&... args)
104 {
105  fProposalFunction = std::make_shared<ProposalT>(
106  std::forward<ArgsT>(args)...
107  );
108 }
109 
110 template <typename ContainerT>
111 inline void MetropolisHastings::SetBetas(ContainerT betas)
112 {
113  // make sure, that the default chain (0) has nominal temperature
114  fBetas = { 1.0 };
115 
116  // only add betas < 1.0 (higher temperature)
117  std::copy_if( betas.begin(), betas.end(),
118  std::back_inserter(fBetas), [](double beta){ return beta < 1.0 && beta > 0.0; } );
119 
120  // and sort in descending order
121  std::sort(fBetas.begin(), fBetas.end(), std::greater<double>());
122 }
123 
124 } /* namespace vmcmc */
125 
126 #endif /* VMCMC_METROPOLIS_H_ */
Contains abstract base class for MCMC sampling algorithms.
Definition: algorithm.cpp:28
Private class encapsulating Sample chains for parallel tempering.
Definition: metropolis.cpp:40
Implementation of the Metropolis-Hastings algorithm.
Definition: metropolis.hpp:39
Abstract base class for the core MCMC sampling algorithms.
Definition: algorithm.hpp:39
virtual void Advance(size_t nSteps=1) override
Definition: metropolis.cpp:204
A &#39;sample&#39; represents a node or data point in a Markov Chain.
Definition: sample.hpp:31
double GetSwapAcceptanceRate(size_t iChain, ptrdiff_t iBeta=-1) const
Get the fraction of accepted swaps between tempered chains.
Definition: metropolis.cpp:109