5 #include "CLHEP/Random/Random.h"
7 #include "CLHEP/Random/engineIDulong.h"
22 dsfmt_init_gen_rand (dsfmt, seed);
30 dsfmt_init_by_array (dsfmt, seeds_nc, key_length);
39 static const int MarkerLen = 64;
43 std::atomic<int> dSFMTEngine::numEngines = 0;
47 dSFMTEngine::dSFMTEngine():m_dsfmt(0)
53 int curIndex = abs(
int(engineNum%
maxIndex));
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());
130 const int numBuff=DSFMT_N;
131 while (
i < numBuff && seeds[
i]) {
145 const int numBuff=DSFMT_N;
147 while (
i < numBuff && seeds[
i]) {
162 for (
int i=0;
i<DSFMT_N + 1; ++
i)
outFile <<std::setprecision(20)
173 std::cerr <<
" -- Engine state remains unchanged\n";
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] <<
" "
196 std::cout <<
"----------------------------------------" << std::endl;
197 std::cout.precision(
pr);
201 return (
float)flat();
204 dSFMTEngine::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) {
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]));
242 char beginMarker [MarkerLen];
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";
264 char endMarker [MarkerLen];
267 for (
int i=0;
i<DSFMT_N + 1; ++
i) {
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) {