2#include "CLHEP/Random/Randomize.h"
3#include "CLHEP/Random/NonRandomEngine.h"
4#include "CLHEP/Random/defs.h"
11 std::ofstream
output(
"testSaveEngineStatus.cout");
13 std::ostream &
output = std::cout;
18#define TEST_ORIGINAL_SAVE
23#define TEST_MISSING_FILES
24#define CREATE_OLD_SAVES
25#define VERIFY_OLD_SAVES
43 std::vector<double> ab(2);
51 double r = RandGauss::shoot();
52 output <<
"r(1) = " << r << std::endl;
53 HepRandom::saveEngineStatus();
54 r = RandGauss::shoot();
55 output <<
"r(2) = " << r << std::endl;
57 r = RandGauss::shoot();
58 output <<
"r(3) = " << r << std::endl;
59 for (
int i=0; i < 1001; i++) {
60 r = RandGauss::shoot();
62 r = RandGauss::shoot();
64 output <<
"r1005= " << r << std::endl;
65 r = RandGauss::shoot();
70 HepRandom::restoreEngineStatus();
71 double r = RandGauss::shoot();
72 output <<
"restored r(2) = " << r << std::endl;
74 output <<
"THIS DOES NOT MATCH REMEMBERED VALUE BUT THAT IS EXPECTED\n";
76 r = RandGauss::shoot();
77 output <<
"restored r(3) = " << r << std::endl;
78 for (
int i=0; i < 1001; i++) {
79 r = RandGauss::shoot();
81 r = RandGauss::shoot();
82 output <<
"restored r1005= " << r << std::endl;
84 output <<
"THIS DOES NOT MATCH REMEMBERED VALUE BUT THAT IS EXPECTED\n";
90 int r = RandFlat::shootBit();
91 output <<
"r(1) = " << r << std::endl;
92 HepRandom::saveEngineStatus();
93 r = RandFlat::shootBit();
94 output <<
"r(2) = " << r << std::endl;
96 r = RandFlat::shootBit();
97 output <<
"r(3) = " << r << std::endl;
99 for (
int i=0; i < 1001; i++) {
100 d = RandFlat::shoot();
102 "This line inserted so clever compilers don't warn about not using d\n";
104 r = RandFlat::shootBit();
106 output <<
"r1005= " << r << std::endl;
107 r = RandFlat::shootBit();
112 HepRandom::restoreEngineStatus();
113 int r = RandFlat::shootBit();
114 output <<
"restored r(2) = " << r << std::endl;
116 output <<
"THIS DOES NOT MATCH REMEMBERED VALUE BUT THAT IS EXPECTED\n";
118 r = RandFlat::shootBit();
119 output <<
"restored r(3) = " << r << std::endl;
120 for (
int i=0; i < 1001; i++) {
121 r = RandFlat::shootBit();
123 r = RandFlat::shootBit();
124 output <<
"restored r1005= " << r << std::endl;
126 output <<
"THIS DOES NOT MATCH REMEMBERED VALUE BUT THAT IS EXPECTED\n";
135 double r = RandGauss::shoot();
136 output <<
"r(1) = " << r << std::endl;
137 RandGauss::saveEngineStatus();
138 r = RandGauss::shoot();
139 output <<
"r(2) = " << r << std::endl;
141 r = RandGauss::shoot();
142 output <<
"r(3) = " << r << std::endl;
143 for (
int i=0; i < 1001; i++) {
144 r = RandGauss::shoot();
146 r = RandGauss::shoot();
148 output <<
"r1005= " << r << std::endl;
149 r = RandGauss::shoot();
155 RandGauss::restoreEngineStatus();
156 double r = RandGauss::shoot();
157 output <<
"restored r(2) = " << r << std::endl;
159 std::cout <<
"restored r(2) = " << r << std::endl;
160 std::cout <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
162 output <<
"restored r(2) = " << r << std::endl;
163 output <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
167 r = RandGauss::shoot();
168 output <<
"restored r(3) = " << r << std::endl;
169 for (
int i=0; i < 1001; i++) {
170 r = RandGauss::shoot();
172 r = RandGauss::shoot();
173 output <<
"restored r1005= " << r << std::endl;
175 std::cout <<
"restored r1005= " << r << std::endl;
176 std::cout <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
178 output <<
"restored r1005= " << r << std::endl;
179 output <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
188 int r = RandFlat::shootBit();
189 output <<
"r(1) = " << r << std::endl;
190 RandFlat::saveEngineStatus();
191 r = RandFlat::shootBit();
192 output <<
"r(2) = " << r << std::endl;
194 r = RandFlat::shootBit();
195 output <<
"r(3) = " << r << std::endl;
196 for (
int i=0; i < 1001; i++) {
197 r = RandFlat::shootBit();
199 r = RandFlat::shootBit();
201 output <<
"r1005 = " << r << std::endl;
202 r = RandFlat::shootBit();
204 output <<
"r1006 = " << r << std::endl;
205 r = RandFlat::shootBit();
207 output <<
"r1007 = " << r << std::endl;
208 r = RandFlat::shootBit();
214 RandFlat::restoreEngineStatus();
215 int r = RandFlat::shootBit();
216 output <<
"restored r(2) = " << r << std::endl;
219 std::cout <<
"restored r(2) = " << r << std::endl;
220 std::cout <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
222 output <<
"restored r(2) = " << r << std::endl;
223 output <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
226 r = RandFlat::shootBit();
227 output <<
"restored r(3) = " << r << std::endl;
228 for (
int i=0; i < 1001; i++) {
229 r = RandFlat::shootBit();
231 r = RandFlat::shootBit();
232 output <<
"restored r1005= " << r << std::endl;
235 std::cout <<
"restored r1005= " << r << std::endl;
236 std::cout <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
238 output <<
"restored r1005= " << r << std::endl;
239 output <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
242 r = RandFlat::shootBit();
243 output <<
"restored r1006= " << r << std::endl;
246 std::cout <<
"restored r1006= " << r << std::endl;
247 std::cout <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
249 output <<
"restored r1006= " << r << std::endl;
250 output <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
253 r = RandFlat::shootBit();
254 output <<
"restored r1007= " << r << std::endl;
257 std::cout <<
"restored r1007= " << r << std::endl;
258 std::cout <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
260 output <<
"restored r1007= " << r << std::endl;
261 output <<
"????? THIS DOES NOT MATCH REMEMBERED VALUE!\n";
269template <
class E,
class D>
274 output <<
"File-not-found test restoring "<<D::distributionName()<<
":\n";
276 D::restoreEngineStatus(
"noSuchFile");
277 D::setTheEngine(old);
286 stat |= fileNotThere <E, RandBinomial>();
287 stat |= fileNotThere <E, RandBit>();
288 stat |= fileNotThere <E, RandBreitWigner>();
289 stat |= fileNotThere <E, RandChiSquare>();
290 stat |= fileNotThere <E, RandExponential>();
291 stat |= fileNotThere <E, RandFlat>();
292 stat |= fileNotThere <E, RandGamma>();
293 stat |= fileNotThere <E, RandGauss>();
294 stat |= fileNotThere <E, RandGaussQ>();
295 stat |= fileNotThere <E, RandGaussT>();
296 stat |= fileNotThere <E, RandLandau>();
297 stat |= fileNotThere <E, RandPoisson>();
298 stat |= fileNotThere <E, RandPoissonQ>();
299 stat |= fileNotThere <E, RandPoissonT>();
300 stat |= fileNotThere <E, RandSkewNormal>();
301 stat |= fileNotThere <E, RandStudentT>();
307 stat |= fileNotThereEngine<DRand48Engine>();
308 stat |= fileNotThereEngine<DualRand>();
309 stat |= fileNotThereEngine<Hurd160Engine>();
310 stat |= fileNotThereEngine<Hurd288Engine>();
311 stat |= fileNotThereEngine<HepJamesRandom>();
312 stat |= fileNotThereEngine<MTwistEngine>();
313 stat |= fileNotThereEngine<RandEngine>();
314 stat |= fileNotThereEngine<RanecuEngine>();
315 stat |= fileNotThereEngine<Ranlux64Engine>();
316 stat |= fileNotThereEngine<RanluxEngine>();
317 stat |= fileNotThereEngine<RanshiEngine>();
318 stat |= fileNotThereEngine<TripleRand>();
324template <
class E,
class D>
331 for (
int i=0; i<3; i++) r += D::shoot();
332 D::saveEngineStatus(filename);
333 if (r == -99999999.1) stat = 999;
335 D::setTheEngine(old);
343template <
class E,
class D>
352 for (
int i=0; i<3; i++) r += D::shoot();
353 D::saveEngineStatus();
356 double keyValue = D::shoot();
359 D::restoreEngineStatus(filename);
360 if (!
equals(D::shoot(), keyValue)) {
361 std::cout <<
"???? Value mismatch from file " << filename <<
"\n";
363 output <<
"???? Value mismatch from file " << filename <<
"\n";
369 D::restoreEngineStatus();
370 if (!
equals(D::shoot(),keyValue)) {
371 std::cout <<
"???? Value mismatch from new-format file \n";
373 output <<
"???? Value mismatch from new-format file \n";
378 D::setTheEngine(old);
390#ifdef TEST_ORIGINAL_SAVE
391 output <<
"=====================================\n";
393 output <<
"Original tests of static save/restore\n";
394 output <<
"=====================================\n\n";
396 output <<
"Using old method or HepRandom::saveEngineStatus:\n";
397 output <<
"All these tests should have a chance of failure.\n";
399 output << RandGauss:: getTheEngine()->name();
400 output << RandGaussQ::getTheEngine()->name();
407 output <<
"Using the class-specific RandGauss::saveEngineStatus:\n";
408 output <<
"All these tests should work properly.\n";
416#ifdef TEST_MISSING_FILES
417 output <<
"\n=======================================\n";
419 output <<
"Test of behavior when a file is missing \n";
420 output <<
"=======================================\n\n";
422 output <<
"Testing restoreEngineStatus with missing file:\n";
423 output <<
"Expect a number of <Failure to find or open> messages!\n";
427#ifdef CREATE_OLD_SAVES
428 stat |= saveEngine<DRand48Engine, RandPoisson>(
"DRand48Engine.oldsav");
429 stat |= saveEngine<DualRand, RandPoisson>(
"DualRand.oldsav");
430 stat |= saveEngine<Hurd160Engine, RandPoisson>(
"Hurd160Engine.oldsav");
431 stat |= saveEngine<Hurd288Engine, RandPoisson>(
"Hurd288Engine.oldsav");
432 stat |= saveEngine<HepJamesRandom,RandPoisson>(
"HepJamesRandom.oldsav");
433 stat |= saveEngine<MTwistEngine, RandPoisson>(
"MTwistEngine.oldsav");
434 stat |= saveEngine<RanecuEngine, RandPoisson>(
"RanecuEngine.oldsav");
435 stat |= saveEngine<Ranlux64Engine,RandPoisson>(
"Ranlux64Engine.oldsav");
436 stat |= saveEngine<RanluxEngine, RandPoisson>(
"RanluxEngine.oldsav");
437 stat |= saveEngine<RanshiEngine, RandPoisson>(
"RanshiEngine.oldsav");
438 stat |= saveEngine<TripleRand, RandPoisson>(
"TripleRand.oldsav");
441#ifdef VERIFY_OLD_SAVES
442 output <<
"\n==============================================\n";
444 output <<
" Verification that changes wont invalidate \n";
445 output <<
"invalidate engine saves from previous versions \n";
446 output <<
"==============================================\n\n";
448 stat |= checkSaveEngine<DRand48Engine, RandPoisson>(
"DRand48Engine.oldsav");
449 stat |= checkSaveEngine<DualRand, RandPoisson>(
"DualRand.oldsav");
450 stat |= checkSaveEngine<Hurd160Engine, RandPoisson>(
"Hurd160Engine.oldsav");
451 stat |= checkSaveEngine<Hurd288Engine, RandPoisson>(
"Hurd288Engine.oldsav");
452 stat |= checkSaveEngine<HepJamesRandom,RandPoisson>(
"HepJamesRandom.oldsav");
453 stat |= checkSaveEngine<MTwistEngine, RandPoisson>(
"MTwistEngine.oldsav");
454 stat |= checkSaveEngine<Ranlux64Engine,RandPoisson>(
"Ranlux64Engine.oldsav");
455 stat |= checkSaveEngine<RanluxEngine, RandPoisson>(
"RanluxEngine.oldsav");
456 stat |= checkSaveEngine<RanshiEngine, RandPoisson>(
"RanshiEngine.oldsav");
457 stat |= checkSaveEngine<TripleRand, RandPoisson>(
"TripleRand.oldsav");
458 stat |= checkSaveEngine<RanecuEngine, RandPoisson>(
"RanecuEngine.oldsav");
461 output <<
"\n=============================================\n\n";
464 std::cout <<
"One or more problems detected: stat = " << stat <<
"\n";
465 output <<
"One or more problems detected: stat = " << stat <<
"\n";
467 output <<
"testSaveEngineStatus passed with no problems detected.\n";
470 if (stat == 0)
return 0;
471 if (stat > 0)
return -(stat|1);
int saveEngine(const char *filename)
int checkSaveEngine(const char *filename)
bool equals(double a, double b)
bool equals01(const std::vector< double > &ab)
std::ofstream output("testSaveEngineStatus.cout")