00001 #ifndef __MCMC_H__
00002 #define __MCMC_H__
00003
00004 #include <vector>
00005 #include <cmath>
00006 #include <cuda.h>
00007 #include <hemi/hemi.h>
00008 #include "signals.h"
00009 #include "nll_kernels.h"
00010
00011 #ifdef __CUDACC__
00012 #include <curand_kernel.h>
00013 #endif
00014
00015 #ifndef __HEMI_ARRAY_H__
00016 #define __HEMI_ARRAY_H__
00017 #include <hemi/array.h>
00018 #endif
00019
00020 class TNtuple;
00021
00029 class MCMC {
00030 public:
00037 MCMC(const std::vector<Signal>& signals, TNtuple* data);
00038
00044 ~MCMC();
00045
00054 TNtuple* operator()(unsigned nsteps, float burnin_fraction,
00055 unsigned sync_interval=1000);
00056
00067 hemi::Array<float>* build_lut(const std::vector<Signal>& signals,
00068 TNtuple* data);
00069
00070 protected:
00090 void nll(const float* v, double* nll,
00091 double* event_partial_sums,
00092 double* event_total_sum);
00093
00094 private:
00095 unsigned nsignals;
00096 unsigned nevents;
00097 unsigned nnllblocks;
00098 unsigned nllblocksize;
00099 unsigned nnllthreads;
00100 unsigned nreducethreads;
00101 unsigned blocksize;
00102 unsigned nblocks;
00103 std::string varlist;
00104 hemi::Array<float>* expectations;
00105 hemi::Array<float>* constraints;
00106 hemi::Array<float>* lut;
00107 hemi::Array<RNGState>* rngs;
00108 };
00109
00110 #endif // __MCMC_H__
00111