5#include "CLHEP/Random/Random.h"
7#include "CLHEP/Random/engineIDulong.h"
22 dsfmt_init_gen_rand (dsfmt, seed);
26 const uint32_t* seeds,
30 dsfmt_init_by_array (dsfmt, seeds_nc, key_length);
53 int curIndex = abs(
int(engineNum%
maxIndex));
54 long mask = ((
cycle & 0x007fffff) << 8);
56 HepRandom::getTheTableSeeds( seedlist, curIndex );
57 seedlist[0] = (seedlist[0])^mask;
81 int err=posix_memalign((
void**)&
m_dsfmt,16,
sizeof(dsfmt_t));
83 std::stringstream errstring;
84 errstring <<
"dSFMTEngine::init_dsfmt() : could not allocate memory for dsfmt data structure, error=" << err;
85 throw std::runtime_error(errstring.str());
118 for(
int i=0; i < size; ++i) vect[i] =
flat();
130 const int numBuff=DSFMT_N;
131 while (i < numBuff && seeds[i]) {
145 const int numBuff=DSFMT_N;
146 uint32_t buf[numBuff]{};
147 while (i < numBuff && seeds[i]) {
159 std::ofstream outFile( filename, std::ios::out ) ;
160 if (!outFile.bad()) {
161 outFile <<
m_dsfmt->idx << std::endl;
162 for (
int i=0; i<DSFMT_N + 1; ++i) outFile <<std::setprecision(20)
163 <<
m_dsfmt->status[i].u32[0] <<
" " <<
m_dsfmt->status[i].u32[1] <<
" "
164 <<
m_dsfmt->status[i].u32[2] <<
" " <<
m_dsfmt->status[i].u32[3] <<
" ";
165 outFile << std::endl;
171 std::ifstream inFile( filename, std::ios::in);
173 std::cerr <<
" -- Engine state remains unchanged\n";
177 if (!inFile.bad() && !inFile.eof()) {
179 for (
int i=0; i<DSFMT_N + 1; ++i) inFile >>
m_dsfmt->status[i].u32[0] >>
m_dsfmt->status[i].u32[1]
187 std::cout <<
"--------- dSFMT engine status ---------\n";
188 int pr = std::cout.precision();
189 std::cout.precision(20);
190 std::cout <<
" Current index = " <<
m_dsfmt->idx <<
"\n";
191 std::cout <<
" Array status[] = \n";
192 for (
int i=0; i<DSFMT_N + 1; ++i) {
193 std::cout <<
m_dsfmt->status[i].u32[0] <<
" " <<
m_dsfmt->status[i].u32[1] <<
" "
194 <<
m_dsfmt->status[i].u32[2] <<
" " <<
m_dsfmt->status[i].u32[3] <<
"\n";
196 std::cout <<
"----------------------------------------" << std::endl;
197 std::cout.precision(pr);
200dSFMTEngine::operator float() {
201 return (
float)
flat();
204dSFMTEngine::operator
unsigned int() {
205 return dsfmt_genrand_uint32(
m_dsfmt);
210 char beginMarker[] =
"dSFMTEngine-begin";
211 char endMarker[] =
"dSFMTEngine-end";
213 int pr = os.precision(20);
214 os <<
" " << beginMarker <<
" ";
216 for (
int i=0; i<DSFMT_N + 1; ++i) {
217 os <<
m_dsfmt->status[i].u32[0] <<
"\n";
218 os <<
m_dsfmt->status[i].u32[1] <<
"\n";
219 os <<
m_dsfmt->status[i].u32[2] <<
"\n";
220 os <<
m_dsfmt->status[i].u32[3] <<
"\n";
222 os << endMarker <<
"\n";
228 std::vector<unsigned long> v;
229 v.push_back (engineIDulong<dSFMTEngine>());
231 for (
int i=0; i<DSFMT_N + 1; ++i) {
232 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[0]));
233 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[1]));
234 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[2]));
235 v.push_back(
static_cast<unsigned long>(
m_dsfmt->status[i].u32[3]));
248 if (strcmp(beginMarker,
"dSFMTEngine-begin")) {
249 is.clear(std::ios::badbit | is.rdstate());
250 std::cerr <<
"\nInput stream mispositioned or"
251 <<
"\ndSFMTEngine state description missing or"
252 <<
"\nwrong engine type found." << std::endl;
259 return "dSFMTEngine-begin";
267 for (
int i=0; i<DSFMT_N + 1; ++i) {
268 is >>
m_dsfmt->status[i].u32[0] ;
269 is >>
m_dsfmt->status[i].u32[1] ;
270 is >>
m_dsfmt->status[i].u32[2] ;
271 is >>
m_dsfmt->status[i].u32[3] ;
277 if (strcmp(endMarker,
"dSFMTEngine-end")) {
278 is.clear(std::ios::badbit | is.rdstate());
279 std::cerr <<
"\ndSFMTEngine state description incomplete."
280 <<
"\nInput stream is probably mispositioned now." << std::endl;
287 if ((v[0] & 0xffffffffUL) != engineIDulong<dSFMTEngine>()) {
289 "\ndSFMTEngine get:state vector has wrong ID word - state unchanged\n";
298 "\ndSFMTEngine get:state vector has wrong length - state unchanged\n";
303 for (
int i=0; i<DSFMT_N + 1; ++i) {
304 m_dsfmt->status[i].u32[0]=v[2+i*4+0];
305 m_dsfmt->status[i].u32[1]=v[2+i*4+1];
306 m_dsfmt->status[i].u32[2]=v[2+i*4+2];
307 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