Markov Chain Monte Carlo simulator. More...
#include <mcmc.h>
Public Member Functions | |
MCMC (const std::vector< Signal > &signals, TNtuple *data) | |
~MCMC () | |
TNtuple * | operator() (unsigned nsteps, float burnin_fraction, unsigned sync_interval=1000) |
hemi::Array< float > * | build_lut (const std::vector< Signal > &signals, TNtuple *data) |
Protected Member Functions | |
void | nll (const float *v, double *nll, double *event_partial_sums, double *event_total_sum) |
Private Attributes | |
unsigned | nsignals |
number of signals | |
unsigned | nevents |
number of events | |
unsigned | nnllblocks |
number of cuda blocks for nll partial sums | |
unsigned | nllblocksize |
size of cuda blocks for nll partial sums | |
unsigned | nnllthreads |
number of threads for nll partial sums | |
unsigned | nreducethreads |
number of threads to use in partial sum reduction kernel | |
unsigned | blocksize |
size of blocks for per-signal kernels | |
unsigned | nblocks |
number of blocks for per-signal kernels | |
std::string | varlist |
string identifier list for ntuple indexing | |
hemi::Array< float > * | expectations |
signal rate expectation values | |
hemi::Array< float > * | constraints |
signal rate gaussian constraints | |
hemi::Array< float > * | lut |
Event/PDF probability lookup table. | |
hemi::Array< RNGState > * | rngs |
CURAND RNGs, ignored in CPU mode. |
Markov Chain Monte Carlo simulator.
Given a set of signal PDFs and a dataset, random walk to map out the likelihood space.
MCMC::MCMC | ( | const std::vector< Signal > & | signals, | |
TNtuple * | data | |||
) |
Constructor
signals | List of Signals defining the PDFs and expectations | |
data | The dataset as a TNtuple with fields "e:r" |
MCMC::~MCMC | ( | ) |
Destructor
Free HEMI arrays
hemi::Array< float > * MCMC::build_lut | ( | const std::vector< Signal > & | signals, | |
TNtuple * | data | |||
) |
Build Pj(xi) lookup table
Build a table with nevents rows and nsignals columns, containing the value of normalized PDF j evaluted at event i.
signals | Signals defining the PDFs | |
data | TNtuple defining the dataset |
void MCMC::nll | ( | const float * | v, | |
double * | nll, | |||
double * | event_partial_sums, | |||
double * | event_total_sum | |||
) | [protected] |
Evaluate the NLL function
-logL = sum(Nj) + 1/2*sum((r-r')^2/s^2) - sum(log(sum(Nj*Pj(xi))))
Nothing is returned -- the output stays in the nll array, so it can stay on the device.
This is done in three steps, to support running on the GPU:
1. Compute partial sums of chunks of events for the last term 2. Total up partial sums from step 1 3. Add normalization and other constraints with sum from step 2
v | Parameter vector at which to evaluate | |
nll | Container for output NLL value | |
event_partial_sums | Pre-allocated buffer for event term calculation | |
event_total_sum | Pre-allocated buffer for event term total |
TNtuple * MCMC::operator() | ( | unsigned | nsteps, | |
float | burnin_fraction, | |||
unsigned | sync_interval = 1000 | |||
) |
Perform walk.
nsteps | Number of random-walk steps to take | |
burnin_fraction | Fraction of initial steps to throw out | |
sync_interval | How often to copy accepted from GPU to storage |