5#include "CLHEP/Random/Random.h"
7#include "CLHEP/Random/engineIDulong.h"
16# pragma GCC diagnostic ignored "-Wkeyword-macro"
27 dsfmt_init_gen_rand (dsfmt, seed);
31 const uint32_t* seeds,
35 dsfmt_init_by_array (dsfmt, seeds_nc, key_length);
58 int curIndex = abs(
int(engineNum%
maxIndex));
59 long mask = ((
cycle & 0x007fffff) << 8);
61 HepRandom::getTheTableSeeds( seedlist, curIndex );
62 seedlist[0] = (seedlist[0])^mask;
86 int err=posix_memalign((
void**)&
m_dsfmt,16,
sizeof(dsfmt_t));
88 std::stringstream errstring;
89 errstring <<
"dSFMTEngine::init_dsfmt() : could not allocate memory for dsfmt data structure, error=" << err;
90 throw std::runtime_error(errstring.str());
123 for(
int i=0; i < size; ++i) vect[i] =
flat();
135 const int numBuff=DSFMT_N;
136 while (i < numBuff && seeds[i]) {
150 const int numBuff=DSFMT_N;
151 uint32_t buf[numBuff]{};
152 while (i < numBuff && seeds[i]) {
164 std::ofstream outFile( filename, std::ios::out ) ;
165 if (!outFile.bad()) {
166 outFile <<
m_dsfmt->idx << std::endl;
167 for (
int i=0; i<DSFMT_N + 1; ++i) outFile <<std::setprecision(20)
168 <<
m_dsfmt->status[i].u32[0] <<
" " <<
m_dsfmt->status[i].u32[1] <<
" "
169 <<
m_dsfmt->status[i].u32[2] <<
" " <<
m_dsfmt->status[i].u32[3] <<
" ";
170 outFile << std::endl;
176 std::ifstream inFile( filename, std::ios::in);
178 std::cerr <<
" -- Engine state remains unchanged\n";
182 if (!inFile.bad() && !inFile.eof()) {
184 for (
int i=0; i<DSFMT_N + 1; ++i) inFile >>
m_dsfmt->status[i].u32[0] >>
m_dsfmt->status[i].u32[1]
192 std::cout <<
"--------- dSFMT engine status ---------\n";
193 int pr = std::cout.precision();
194 std::cout.precision(20);
195 std::cout <<
" Current index = " <<
m_dsfmt->idx <<
"\n";
196 std::cout <<
" Array status[] = \n";
197 for (
int i=0; i<DSFMT_N + 1; ++i) {
198 std::cout <<
m_dsfmt->status[i].u32[0] <<
" " <<
m_dsfmt->status[i].u32[1] <<
" "
199 <<
m_dsfmt->status[i].u32[2] <<
" " <<
m_dsfmt->status[i].u32[3] <<
"\n";
201 std::cout <<
"----------------------------------------" << std::endl;
202 std::cout.precision(pr);
205dSFMTEngine::operator float() {
206 return (
float)
flat();
209dSFMTEngine::operator
unsigned int() {
210 return dsfmt_genrand_uint32(
m_dsfmt);
215 char beginMarker[] =
"dSFMTEngine-begin";
216 char endMarker[] =
"dSFMTEngine-end";
218 int pr = os.precision(20);
219 os <<
" " << beginMarker <<
" ";
221 for (
int i=0; i<DSFMT_N + 1; ++i) {
222 os <<
m_dsfmt->status[i].u32[0] <<
"\n";
223 os <<
m_dsfmt->status[i].u32[1] <<
"\n";
224 os <<
m_dsfmt->status[i].u32[2] <<
"\n";
225 os <<
m_dsfmt->status[i].u32[3] <<
"\n";
227 os << endMarker <<
"\n";
233 std::vector<unsigned long> v;
234 v.push_back (engineIDulong<dSFMTEngine>());
236 for (
int i=0; i<DSFMT_N + 1; ++i) {
237 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[0]));
238 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[1]));
239 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[2]));
240 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[3]));
253 if (strcmp(beginMarker,
"dSFMTEngine-begin")) {
254 is.clear(std::ios::badbit | is.rdstate());
255 std::cerr <<
"\nInput stream mispositioned or"
256 <<
"\ndSFMTEngine state description missing or"
257 <<
"\nwrong engine type found." << std::endl;
264 return "dSFMTEngine-begin";
272 for (
int i=0; i<DSFMT_N + 1; ++i) {
273 is >>
m_dsfmt->status[i].u32[0] ;
274 is >>
m_dsfmt->status[i].u32[1] ;
275 is >>
m_dsfmt->status[i].u32[2] ;
276 is >>
m_dsfmt->status[i].u32[3] ;
282 if (strcmp(endMarker,
"dSFMTEngine-end")) {
283 is.clear(std::ios::badbit | is.rdstate());
284 std::cerr <<
"\ndSFMTEngine state description incomplete."
285 <<
"\nInput stream is probably mispositioned now." << std::endl;
292 if ((v[0] & 0xffffffffUL) != engineIDulong<dSFMTEngine>()) {
294 "\ndSFMTEngine get:state vector has wrong ID word - state unchanged\n";
303 "\ndSFMTEngine get:state vector has wrong length - state unchanged\n";
308 for (
int i=0; i<DSFMT_N + 1; ++i) {
309 m_dsfmt->status[i].u32[0]=v[2+i*4+0];
310 m_dsfmt->status[i].u32[1]=v[2+i*4+1];
311 m_dsfmt->status[i].u32[2]=v[2+i*4+2];
312 m_dsfmt->status[i].u32[3]=v[2+i*4+3];
double cycle(double a, double b)
Define macros for attributes used to control the static checker.
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
#define ATLAS_THREAD_SAFE
virtual std::string name() const override
virtual std::istream & get(std::istream &is) override
static std::atomic< int > numEngines
void setSeeds(const uint32_t *seeds, int k=0)
static std::string engineName()
static constexpr int maxIndex
static std::string beginTag()
virtual void setSeed(long seed, int k=0) override
virtual void showStatus() const override
dSFMTEngine & operator=(const dSFMTEngine &p)
virtual void saveStatus(const char filename[]="MTwist.conf") const override
virtual void flatArray(const int size, double *vect) override
virtual double flat() override
virtual std::vector< unsigned long > put() const override
virtual std::istream & getState(std::istream &is) override
virtual void restoreStatus(const char filename[]="MTwist.conf") override
const unsigned int VECTOR_STATE_SIZE
static const int MarkerLen