X-Git-Url: https://git.donarmstrong.com/?p=rsem.git;a=blobdiff_plain;f=sampling.h;h=7e445cf8995e871183b5b18b66ee23b8efd91b8e;hp=417140395b8b78801af1808fc93bf6d3eca9d602;hb=83ce658a4b9c5f04c081316314b66b94ad5ffbde;hpb=946f9a6adb2a82048c8453d44693cd3838d32939 diff --git a/sampling.h b/sampling.h index 4171403..7e445cf 100644 --- a/sampling.h +++ b/sampling.h @@ -5,17 +5,49 @@ #include #include #include +#include #include "boost/random.hpp" -boost::mt19937 rng(time(NULL)); -boost::uniform_01 rg(rng); +typedef unsigned int seedType; +typedef boost::random::mt19937 engine_type; +typedef boost::random::uniform_01<> uniform_01_dist; +typedef boost::random::gamma_distribution<> gamma_dist; +typedef boost::random::variate_generator uniform_01_generator; +typedef boost::random::variate_generator gamma_generator; + +class engineFactory { +public: + static void init() { seedEngine = new engine_type(time(NULL)); } + static void init(seedType seed) { seedEngine = new engine_type(seed); } + + static void finish() { if (seedEngine != NULL) delete seedEngine; } + + static engine_type *new_engine() { + seedType seed; + static std::set seedSet; // empty set of seeds + std::set::iterator iter; + + do { + seed = (*seedEngine)(); + iter = seedSet.find(seed); + } while (iter != seedSet.end()); + seedSet.insert(seed); + + return new engine_type(seed); + } + + private: + static engine_type *seedEngine; +}; + +engine_type* engineFactory::seedEngine = NULL; // arr should be cumulative! // interval : [,) // random number should be in [0, arr[len - 1]) // If by chance arr[len - 1] == 0.0, one possibility is to sample uniformly from 0...len-1 -int sample(std::vector& arr, int len) { +int sample(uniform_01_generator& rg, std::vector& arr, int len) { int l, r, mid; double prb = rg() * arr[len - 1];