13 #ifndef VMCMC_ALGORITHM_H_ 14 #define VMCMC_ALGORITHM_H_ 42 using DefaultCallable = std::function<double (const std::vector<double>&)>;
57 const ParameterConfig& GetParameterConfig()
const {
return fParameterConfig; }
59 void SetPrior(DefaultCallable prior);
60 template <
size_t NParams,
typename CallableT>
61 void SetPrior(CallableT prior);
63 void SetLikelihood(DefaultCallable likelihood);
64 template <
size_t NParams,
typename CallableT>
65 void SetLikelihood(CallableT likelihood);
67 void SetNegLogLikelihood(DefaultCallable negLoglikelihood);
68 template <
size_t NParams,
typename CallableT>
69 void SetNegLogLikelihood(CallableT negLoglikelihood);
71 void SetTotalLength(
size_t length) { fTotalLength = length; }
72 size_t GetTotalLength()
const {
return fTotalLength; }
79 template <
typename WriterT,
typename... ArgsT>
81 void AddWriter(std::shared_ptr<Writer> writer) { fWriters.push_back( writer ); }
88 double EvaluatePrior(
const std::vector<double>& paramValues)
const;
119 virtual void Initialize();
121 virtual void Advance(
size_t nSteps = 1) = 0;
123 virtual void Finalize();
125 virtual size_t NumberOfChains() = 0;
126 virtual const Chain& GetChain(
size_t cIndex = 0) = 0;
133 DefaultCallable fPrior;
135 DefaultCallable fLikelihood;
136 DefaultCallable fNegLogLikelihood;
141 std::vector<std::shared_ptr<Writer>> fWriters;
159 template <
size_t NParams,
typename C,
typename... Ts>
160 typename std::enable_if<NParams ==
sizeof...(Ts),
double>::type
163 return f(std::forward<Ts>(ts)...);
169 template <
size_t NParams,
typename C,
typename... Ts>
170 typename std::enable_if<NParams !=
sizeof...(Ts),
double>::type
173 constexpr ptrdiff_t index = NParams -
sizeof...(Ts) - 1;
174 static_assert(index >= 0,
"invalid number of function parameters");
175 return apply_first_n<NParams>(f, v, *(std::begin(v) + index), std::forward<Ts>(ts)...);
180 inline void Algorithm::SetPrior(DefaultCallable prior)
185 template <
size_t NParams,
typename CallableT>
186 inline void Algorithm::SetPrior(CallableT f)
188 fPrior = [=](
const std::vector<double>& v) {
189 return detail::apply_first_n<NParams>(f, v);
193 inline void Algorithm::SetLikelihood(DefaultCallable likelihood)
195 fLikelihood = likelihood;
196 fNegLogLikelihood =
nullptr;
199 template <
size_t NParams,
typename CallableT>
200 inline void Algorithm::SetLikelihood(CallableT f)
202 fLikelihood = [=](
const std::vector<double>& v) {
203 return detail::apply_first_n<NParams>(f, v);
205 fNegLogLikelihood =
nullptr;
208 inline void Algorithm::SetNegLogLikelihood(DefaultCallable negLoglikelihood)
210 fLikelihood =
nullptr;
211 fNegLogLikelihood = negLoglikelihood;
214 template <
size_t NParams,
typename CallableT>
215 inline void Algorithm::SetNegLogLikelihood(CallableT f)
217 fLikelihood =
nullptr;
218 fNegLogLikelihood = [=](
const std::vector<double>& v) {
219 return detail::apply_first_n<NParams>(f, v);
223 template <
typename WriterT,
typename... ArgsT>
226 fWriters.emplace_back( std::make_shared<WriterT>(std::forward<ArgsT>(args)...) );
Definition: algorithm.cpp:28
A list of parameters, describing the parameter space of the target function to be evaluated...
Definition: parameter.hpp:109
double EvaluateNegLogLikelihood(const std::vector< double > ¶mValues) const
Evaluate the target function -log(likelihood) for the given parameter values.
Definition: algorithm.cpp:147
Manages a list of ChainStatistics and calculates statistical properties regarding sets of individual ...
Definition: chain.hpp:98
double EvaluatePrior(const std::vector< double > ¶mValues) const
Evaluate the prior for the given parameter values.
Definition: algorithm.cpp:132
void SetParameterConfig(const ParameterConfig ¶mConfig)
Set the parameter configuration.
Definition: algorithm.cpp:40
Utility classes for calculation statistical momenta and diagnostics.
void Run()
Start sampling!
Definition: algorithm.cpp:185
bool Evaluate(Sample &sample) const
Evalutate the target function prior, likelihood and -log(likelihood) at the position defined by the s...
Definition: algorithm.cpp:154
Typetrait utility structs.
Abstract base class for the core MCMC sampling algorithms.
Definition: algorithm.hpp:39
void AddWriter(ArgsT &&...args)
Add an output writer by specifying its type and passing constructor arguments.
Definition: algorithm.hpp:224
Class definitions representing input parameter configurations.
A 'sample' represents a node or data point in a Markov Chain.
Definition: sample.hpp:31
std::enable_if< NParams==sizeof...(Ts), double >::type apply_first_n(C f, const std::vector< double > &v, Ts &&...ts)
Call a variadic function using a vector of arguments.
Definition: algorithm.hpp:161
double EvaluateLikelihood(const std::vector< double > ¶mValues) const
Evaluate the target function likelihood for the given parameter values.
Definition: algorithm.cpp:140