14 #ifndef VMCMC_METROPOLIS_H_ 15 #define VMCMC_METROPOLIS_H_ 42 static double CalculateMHRatio(
const Sample& prevState,
const Sample& nextState,
43 double proposalAsymmetry = 1.0,
double beta = 1.0);
49 virtual void Initialize()
override;
51 virtual void Advance(
size_t nSteps = 1)
override;
53 virtual void Finalize()
override;
55 virtual size_t NumberOfChains()
override {
return fChainConfigs.size(); }
56 virtual const Chain& GetChain(
size_t cIndex = 0)
override;
58 void SetNumberOfChains(
size_t nChains);
60 template <
typename ContainerT = std::initializer_list<
double>>
61 void SetBetas(ContainerT betas);
62 const std::vector<double>& GetBetas()
const {
return fBetas; }
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; }
70 void SetRandomizeStartPoint(
bool randomizeStartPoint) { fRandomizeStartPoint = randomizeStartPoint; }
71 bool IsRandomizeStartPoint()
const {
return fRandomizeStartPoint; }
73 void SetMultiThreading(
bool enable);
74 bool IsMultiThreading()
const {
return fMultiThreading; }
85 void AdvanceChainConfig(
size_t iChainConfig,
size_t iBeta,
size_t nSteps = 1);
86 void ProposePtSwapping(
size_t iChainConfig);
88 bool fRandomizeStartPoint;
90 std::vector<double> fBetas;
91 std::shared_ptr<Proposal> fProposalFunction;
96 std::vector<std::unique_ptr<ChainConfig>> fChainConfigs;
102 template <
typename ProposalT,
typename... ArgsT>
103 inline void MetropolisHastings::SetProposalFunction(ArgsT&&... args)
105 fProposalFunction = std::make_shared<ProposalT>(
106 std::forward<ArgsT>(args)...
110 template <
typename ContainerT>
111 inline void MetropolisHastings::SetBetas(ContainerT betas)
117 std::copy_if( betas.begin(), betas.end(),
118 std::back_inserter(fBetas), [](
double beta){
return beta < 1.0 && beta > 0.0; } );
121 std::sort(fBetas.begin(), fBetas.end(), std::greater<double>());
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 'sample' 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