File indexing completed on 2026-08-06 09:38:30
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef ThePEG_Repository_Test_RandomGenerator_H
0010 #define ThePEG_Repository_Test_RandomGenerator_H
0011
0012 #include <boost/test/unit_test.hpp>
0013 #include <boost/iterator/iterator_concepts.hpp>
0014
0015 #include "ThePEG/Repository/RandomGenerator.h"
0016 #include <StandardRandom.h>
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 template <typename Unit>
0027 class BinningCheck {
0028 private:
0029
0030 BinningCheck() {}
0031 public:
0032
0033 BinningCheck(Unit lo, Unit hi)
0034 : m_lo(lo), m_hi(hi), m_in(0), m_out(0) {}
0035 ~BinningCheck() {}
0036
0037 int in() {return m_in;}
0038 int out() {return m_out;}
0039 int tot() {return m_out + m_in;}
0040
0041 void add(Unit randomNumber) {
0042 if(randomNumber >= m_lo && randomNumber <= m_hi) {
0043 m_in++;
0044 } else {
0045 m_out++;
0046 }
0047 }
0048
0049 void reset() {m_in = 0; m_out = 0;}
0050
0051 private:
0052 Unit m_lo, m_hi;
0053 int m_in, m_out;
0054 };
0055 typedef BinningCheck<double> DoubleBinCheck;
0056 typedef BinningCheck<long> LongBinCheck;
0057
0058
0059
0060
0061
0062 BOOST_AUTO_TEST_SUITE(HelperRandomNumberBinning)
0063
0064 BOOST_AUTO_TEST_CASE(HelperDoubleBinning)
0065 {
0066 DoubleBinCheck a(0, 1);
0067 a.add(-1.1);
0068 a.add(-0.1);
0069 a.add(0.1);
0070 a.add(0.5);
0071 a.add(0.8);
0072 a.add(1.1);
0073 a.add(100);
0074 BOOST_CHECK_EQUAL(a.tot(), 7);
0075 BOOST_CHECK_EQUAL(a.in(), 3);
0076 BOOST_CHECK_EQUAL(a.out(), 4);
0077
0078 a.reset();
0079 BOOST_CHECK_EQUAL(a.tot(), 0);
0080 BOOST_CHECK_EQUAL(a.in(), 0);
0081 BOOST_CHECK_EQUAL(a.out(), 0);
0082
0083
0084 DoubleBinCheck b(-1.5, 0.5);
0085 b.add(-1.1);
0086 b.add(-0.1);
0087 b.add(0.1);
0088 b.add(0.5);
0089 b.add(0.8);
0090 b.add(1.1);
0091 b.add(100);
0092 BOOST_CHECK_EQUAL(b.tot(), 7);
0093 BOOST_CHECK_EQUAL(b.in(), 4);
0094 BOOST_CHECK_EQUAL(b.out(), 3);
0095 }
0096
0097
0098
0099
0100
0101 BOOST_AUTO_TEST_SUITE_END()
0102
0103
0104
0105
0106
0107
0108
0109 struct FixLocal1 {
0110 FixLocal1() : rng() {
0111 BOOST_TEST_MESSAGE( "setup local fixture for repositoryTestRandomGenerator" );
0112 }
0113
0114 ~FixLocal1() {
0115 BOOST_TEST_MESSAGE( "teardown local fixture for repositoryTestRandomGenerator" );
0116 }
0117
0118 ThePEG::StandardRandom rng;
0119 };
0120
0121
0122
0123
0124
0125 BOOST_FIXTURE_TEST_SUITE(repositoryRandomGenerator, FixLocal1)
0126
0127
0128
0129
0130
0131 BOOST_AUTO_TEST_CASE(rndZeroToOne)
0132 {
0133 int N = 1000;
0134
0135 DoubleBinCheck posRange(0, 1);
0136
0137 DoubleBinCheck quarter1(0, 0.25);
0138 DoubleBinCheck quarter3(0.5, 0.75);
0139
0140
0141 for(int i = 0; i < N; ++i) {
0142 posRange.add(rng.rnd());
0143 quarter1.add(rng.rnd());
0144 quarter3.add(rng.rnd());
0145 }
0146
0147 BOOST_CHECK_EQUAL(posRange.tot(), N);
0148 BOOST_CHECK_EQUAL(posRange.in(), N);
0149 BOOST_CHECK_EQUAL(posRange.out(), 0);
0150
0151
0152 BOOST_CHECK_EQUAL(quarter1.tot(), N);
0153 BOOST_CHECK_CLOSE(quarter1.in(), 0.25 * N, 10);
0154 BOOST_CHECK_CLOSE(quarter1.out(), 0.75 * N, 5);
0155
0156
0157 BOOST_CHECK_EQUAL(quarter3.tot(), N);
0158 BOOST_CHECK_CLOSE(quarter3.in(), 0.25 * N, 10);
0159 BOOST_CHECK_CLOSE(quarter3.out(), 0.75 * N, 5);
0160
0161
0162
0163 posRange.reset();
0164 quarter1.reset();
0165 quarter3.reset();
0166 for(int i = 0; i < N; ++i) {
0167 posRange.add(rng());
0168 quarter1.add(rng());
0169 quarter3.add(rng());
0170 }
0171 BOOST_CHECK_EQUAL(posRange.tot(), N);
0172 BOOST_CHECK_EQUAL(posRange.in(), N);
0173 BOOST_CHECK_EQUAL(posRange.out(), 0);
0174
0175
0176 BOOST_CHECK_EQUAL(quarter1.tot(), N);
0177 BOOST_CHECK_CLOSE(quarter1.in(), 0.25 * N, 10);
0178 BOOST_CHECK_CLOSE(quarter1.out(), 0.75 * N, 5);
0179
0180
0181 BOOST_CHECK_EQUAL(quarter3.tot(), N);
0182 BOOST_CHECK_CLOSE(quarter3.in(), 0.25 * N, 10);
0183 BOOST_CHECK_CLOSE(quarter3.out(), 0.75 * N, 5);
0184 }
0185
0186 BOOST_AUTO_TEST_CASE(rndZeroTohi)
0187 {
0188 int N = 1000;
0189 double hi = 2.5;
0190
0191 DoubleBinCheck zero2hi(0, 2.5);
0192
0193 DoubleBinCheck quarter1(0, 0.5);
0194 DoubleBinCheck quarter3(1.5, 2.0);
0195
0196
0197 for(int i = 0; i < N; ++i) {
0198 zero2hi.add(rng.rnd(hi));
0199 quarter1.add(rng.rnd(hi));
0200 quarter3.add(rng.rnd(hi));
0201 }
0202
0203 BOOST_CHECK_EQUAL(zero2hi.tot(), N);
0204 BOOST_CHECK_EQUAL(zero2hi.in(), N);
0205 BOOST_CHECK_EQUAL(zero2hi.out(), 0);
0206
0207
0208 BOOST_CHECK_EQUAL(quarter1.tot(), N);
0209 BOOST_CHECK_CLOSE(quarter1.in(), 0.2 * N, 10);
0210 BOOST_CHECK_CLOSE(quarter1.out(), 0.8 * N, 5);
0211
0212
0213 BOOST_CHECK_EQUAL(quarter3.tot(), N);
0214 BOOST_CHECK_CLOSE(quarter3.in(), 0.2 * N, 10);
0215 BOOST_CHECK_CLOSE(quarter3.out(), 0.8 * N, 5);
0216
0217
0218
0219 zero2hi.reset();
0220 quarter1.reset();
0221 quarter3.reset();
0222 for(int i = 0; i < N; ++i) {
0223 zero2hi.add(rng(hi));
0224 quarter1.add(rng(hi));
0225 quarter3.add(rng(hi));
0226 }
0227 BOOST_CHECK_EQUAL(zero2hi.tot(), N);
0228 BOOST_CHECK_EQUAL(zero2hi.in(), N);
0229 BOOST_CHECK_EQUAL(zero2hi.out(), 0);
0230
0231
0232 BOOST_CHECK_EQUAL(quarter1.tot(), N);
0233 BOOST_CHECK_CLOSE(quarter1.in(), 0.2 * N, 10);
0234 BOOST_CHECK_CLOSE(quarter1.out(), 0.8 * N, 5);
0235
0236
0237 BOOST_CHECK_EQUAL(quarter3.tot(), N);
0238 BOOST_CHECK_CLOSE(quarter3.in(), 0.2 * N, 10);
0239 BOOST_CHECK_CLOSE(quarter3.out(), 0.8 * N, 5);
0240
0241
0242 long hiTwo = 3;
0243
0244 LongBinCheck zero2hiTwo(0, hiTwo);
0245
0246 LongBinCheck quarter1Two(1, 1);
0247 LongBinCheck quarter3Two(2, 2);
0248
0249
0250 for(int i = 0; i < N; ++i) {
0251 zero2hiTwo.add(rng(hiTwo));
0252 quarter1Two.add(rng(hiTwo));
0253 quarter3Two.add(rng(hiTwo));
0254 }
0255
0256 BOOST_CHECK_EQUAL(zero2hiTwo.tot(), N);
0257 BOOST_CHECK_EQUAL(zero2hiTwo.in(), N);
0258 BOOST_CHECK_EQUAL(zero2hiTwo.out(), 0);
0259
0260
0261 BOOST_CHECK_EQUAL(quarter1Two.tot(), N);
0262 BOOST_CHECK_CLOSE(quarter1Two.in(), 0.333 * N, 10);
0263 BOOST_CHECK_CLOSE(quarter1Two.out(), 0.666 * N, 5);
0264
0265
0266 BOOST_CHECK_EQUAL(quarter3Two.tot(), N);
0267 BOOST_CHECK_CLOSE(quarter3Two.in(), 0.333 * N, 10);
0268 BOOST_CHECK_CLOSE(quarter3Two.out(), 0.666 * N, 5);
0269 }
0270
0271 BOOST_AUTO_TEST_CASE(rndIntervallLowerLimitTohi)
0272 {
0273 int N = 1000;
0274 double lo = -1.5;
0275 double hi = 2.5;
0276
0277 DoubleBinCheck zero2hi(lo, hi);
0278
0279 DoubleBinCheck quarter1(-0.5, 0.5);
0280 DoubleBinCheck quarter3(1.5, 2.5);
0281
0282
0283 for(int i = 0; i < N; ++i) {
0284 zero2hi.add(rng.rnd(lo, hi));
0285 quarter1.add(rng.rnd(lo, hi));
0286 quarter3.add(rng.rnd(lo, hi));
0287 }
0288
0289 BOOST_CHECK_EQUAL(zero2hi.tot(), N);
0290 BOOST_CHECK_EQUAL(zero2hi.in(), N);
0291 BOOST_CHECK_EQUAL(zero2hi.out(), 0);
0292
0293
0294 BOOST_CHECK_EQUAL(quarter1.tot(), N);
0295 BOOST_CHECK_CLOSE(quarter1.in(), 0.25 * N, 10);
0296 BOOST_CHECK_CLOSE(quarter1.out(), 0.75 * N, 5);
0297
0298
0299 BOOST_CHECK_EQUAL(quarter3.tot(), N);
0300 BOOST_CHECK_CLOSE(quarter3.in(), 0.25 * N, 10);
0301 BOOST_CHECK_CLOSE(quarter3.out(), 0.75 * N, 5);
0302 }
0303
0304 BOOST_AUTO_TEST_CASE(rndZeroToOneVector)
0305 {
0306 int N = 10;
0307 int L = 10;
0308
0309 DoubleBinCheck posRange(0, 1);
0310
0311 DoubleBinCheck quarter1(0, 0.25);
0312 DoubleBinCheck quarter3(0.5, 0.75);
0313
0314 for(int i = 0; i < N; ++i) {
0315 posRange.reset();
0316 quarter1.reset();
0317 quarter3.reset();
0318
0319 std::vector<double> rndvec = rng.rndvec(L);
0320 BOOST_CHECK_EQUAL(static_cast<int>(rndvec.size()), L);
0321 for(int j = 0; j < static_cast<int>(rndvec.size()); ++j) {
0322 posRange.add(rndvec[j]);
0323 quarter1.add(rndvec[j]);
0324 quarter3.add(rndvec[j]);
0325 }
0326
0327 BOOST_CHECK_EQUAL(posRange.tot(), N);
0328 BOOST_CHECK_EQUAL(posRange.in(), N);
0329 BOOST_CHECK_EQUAL(posRange.out(), 0);
0330
0331
0332 BOOST_CHECK_EQUAL(quarter1.tot(), N);
0333 BOOST_CHECK_CLOSE(quarter1.in(), 0.25 * L, 300);
0334 BOOST_CHECK_CLOSE(quarter1.out(), 0.75 * L, 300);
0335
0336
0337 BOOST_CHECK_EQUAL(quarter3.tot(), N);
0338 BOOST_CHECK_CLOSE(quarter3.in(), 0.25 * L, 300);
0339 BOOST_CHECK_CLOSE(quarter3.out(), 0.75 * L, 300);
0340 }
0341 }
0342
0343 BOOST_AUTO_TEST_CASE(rndBoolSingleProbability)
0344 {
0345 int N = 1000;
0346
0347 LongBinCheck posRange(0, 1);
0348
0349 LongBinCheck zero(0, 0);
0350 LongBinCheck one(1, 1);
0351
0352
0353 for(int i = 0; i < N; ++i) {
0354 posRange.add(rng.rndbool());
0355 zero.add(rng.rndbool());
0356 one.add(rng.rndbool());
0357 }
0358
0359 BOOST_CHECK_EQUAL(posRange.tot(), N);
0360 BOOST_CHECK_EQUAL(posRange.in(), N);
0361 BOOST_CHECK_EQUAL(posRange.out(), 0);
0362
0363
0364 BOOST_CHECK_EQUAL(zero.tot(), N);
0365 BOOST_CHECK_CLOSE(zero.in(), 0.5 * N, 10);
0366 BOOST_CHECK_CLOSE(zero.out(), 0.5 * N, 10);
0367
0368
0369 BOOST_CHECK_EQUAL(one.tot(), N);
0370 BOOST_CHECK_CLOSE(one.in(), 0.5 * N, 10);
0371 BOOST_CHECK_CLOSE(one.out(), 0.5 * N, 10);
0372
0373
0374
0375 LongBinCheck posRangeTwo(0, 1);
0376
0377 LongBinCheck midPoint(0, 0);
0378 LongBinCheck hiEdge(1, 1);
0379
0380
0381 for(int i = 0; i < N; ++i) {
0382 posRangeTwo.add(rng.rndbool(0.4));
0383 midPoint.add(rng.rndbool(0.4));
0384 hiEdge.add(rng.rndbool(0.4));
0385 }
0386
0387 BOOST_CHECK_EQUAL(posRangeTwo.tot(), N);
0388 BOOST_CHECK_EQUAL(posRangeTwo.in(), N);
0389 BOOST_CHECK_EQUAL(posRangeTwo.out(), 0);
0390
0391
0392 BOOST_CHECK_EQUAL(midPoint.tot(), N);
0393 BOOST_CHECK_CLOSE(midPoint.in(), 0.6 * N, 10);
0394 BOOST_CHECK_CLOSE(midPoint.out(), 0.4 * N, 10);
0395
0396
0397 BOOST_CHECK_EQUAL(hiEdge.tot(), N);
0398 BOOST_CHECK_CLOSE(hiEdge.in(), 0.4 * N, 10);
0399 BOOST_CHECK_CLOSE(hiEdge.out(), 0.6 * N, 10);
0400 }
0401
0402 BOOST_AUTO_TEST_CASE(prndBoolSingleProbability)
0403 {
0404 int N = 1000;
0405
0406 LongBinCheck posRange(0, 1);
0407
0408 LongBinCheck zero(0, 0);
0409 LongBinCheck one(1, 1);
0410
0411
0412 for(int i = 0; i < N; ++i) {
0413 posRange.add(rng.prndbool());
0414 zero.add(rng.prndbool());
0415 one.add(rng.prndbool());
0416 }
0417
0418 BOOST_CHECK_EQUAL(posRange.tot(), N);
0419 BOOST_CHECK_EQUAL(posRange.in(), N);
0420 BOOST_CHECK_EQUAL(posRange.out(), 0);
0421
0422
0423 BOOST_CHECK_EQUAL(zero.tot(), N);
0424 BOOST_CHECK_CLOSE(zero.in(), 0.5 * N, 15);
0425 BOOST_CHECK_CLOSE(zero.out(), 0.5 * N, 15);
0426
0427
0428 BOOST_CHECK_EQUAL(one.tot(), N);
0429 BOOST_CHECK_CLOSE(one.in(), 0.5 * N, 15);
0430 BOOST_CHECK_CLOSE(one.out(), 0.5 * N, 15);
0431
0432
0433
0434 LongBinCheck posRangeTwo(0, 1);
0435
0436 LongBinCheck midPoint(0, 0);
0437 LongBinCheck hiEdge(1, 1);
0438
0439
0440 for(int i = 0; i < N; ++i) {
0441 posRangeTwo.add(rng.prndbool(0.4));
0442 midPoint.add(rng.prndbool(0.4));
0443 hiEdge.add(rng.prndbool(0.4));
0444 }
0445
0446 BOOST_CHECK_EQUAL(posRangeTwo.tot(), N);
0447 BOOST_CHECK_EQUAL(posRangeTwo.in(), N);
0448 BOOST_CHECK_EQUAL(posRangeTwo.out(), 0);
0449
0450
0451 BOOST_CHECK_EQUAL(midPoint.tot(), N);
0452 BOOST_CHECK_CLOSE(midPoint.in(), 0.6 * N, 10);
0453 BOOST_CHECK_CLOSE(midPoint.out(), 0.4 * N, 10);
0454
0455
0456 BOOST_CHECK_EQUAL(hiEdge.tot(), N);
0457 BOOST_CHECK_CLOSE(hiEdge.in(), 0.4 * N, 10);
0458 BOOST_CHECK_CLOSE(hiEdge.out(), 0.6 * N, 10);
0459 }
0460
0461 BOOST_AUTO_TEST_CASE(rndBoolTwoProbabilities)
0462 {
0463 int N = 1000;
0464 double p1 = 0.2;
0465 double p2 = 0.3;
0466
0467 LongBinCheck posRange(0, 1);
0468
0469 LongBinCheck zero(0, 0);
0470 LongBinCheck one(1, 1);
0471
0472 for(int i = 0; i < N; ++i) {
0473 posRange.add(rng.rndbool(p1, p2));
0474 zero.add(rng.rndbool(p1, p2));
0475 one.add(rng.rndbool(p1, p2));
0476 }
0477
0478 BOOST_CHECK_EQUAL(posRange.tot(), N);
0479 BOOST_CHECK_EQUAL(posRange.in(), N);
0480 BOOST_CHECK_EQUAL(posRange.out(), 0);
0481
0482
0483 BOOST_CHECK_EQUAL(zero.tot(), N);
0484 BOOST_CHECK_CLOSE(zero.in(), 0.6 * N, 10);
0485 BOOST_CHECK_CLOSE(zero.out(), 0.4 * N, 10);
0486
0487
0488 BOOST_CHECK_EQUAL(one.tot(), N);
0489 BOOST_CHECK_CLOSE(one.in(), 0.4 * N, 10);
0490 BOOST_CHECK_CLOSE(one.out(), 0.6 * N, 10);
0491 }
0492
0493 BOOST_AUTO_TEST_CASE(prndBoolTwoProbabilities)
0494 {
0495 int N = 1000;
0496 double p1 = 0.2;
0497 double p2 = 0.3;
0498
0499 LongBinCheck posRange(0, 1);
0500
0501 LongBinCheck zero(0, 0);
0502 LongBinCheck one(1, 1);
0503
0504 for(int i = 0; i < N; ++i) {
0505 posRange.add(rng.prndbool(p1, p2));
0506 zero.add(rng.prndbool(p1, p2));
0507 one.add(rng.prndbool(p1, p2));
0508 }
0509
0510 BOOST_CHECK_EQUAL(posRange.tot(), N);
0511 BOOST_CHECK_EQUAL(posRange.in(), N);
0512 BOOST_CHECK_EQUAL(posRange.out(), 0);
0513
0514
0515 BOOST_CHECK_EQUAL(zero.tot(), N);
0516 BOOST_CHECK_CLOSE(zero.in(), 0.6 * N, 10);
0517 BOOST_CHECK_CLOSE(zero.out(), 0.4 * N, 10);
0518
0519
0520 BOOST_CHECK_EQUAL(one.tot(), N);
0521 BOOST_CHECK_CLOSE(one.in(), 0.4 * N, 10);
0522 BOOST_CHECK_CLOSE(one.out(), 0.6 * N, 10);
0523 }
0524
0525 BOOST_AUTO_TEST_CASE(rndSign)
0526 {
0527 int N = 1000;
0528 double p1 = 0.4;
0529 double p2 = 0.2;
0530 double p3 = 0.3;
0531
0532 LongBinCheck range(-1, 1);
0533
0534 LongBinCheck lowEdge(-1, -1);
0535 LongBinCheck midPoint(0, 0);
0536 LongBinCheck hiEdge(1, 1);
0537
0538 for(int i = 0; i < N; ++i) {
0539 range.add(rng.rndsign(p1, p2, p3));
0540 lowEdge.add(rng.rndsign(p1, p2, p3));
0541 midPoint.add(rng.rndsign(p1, p2, p3));
0542 hiEdge.add(rng.rndsign(p1, p2, p3));
0543 }
0544
0545 BOOST_CHECK_EQUAL(range.tot(), N);
0546 BOOST_CHECK_EQUAL(range.in(), N);
0547 BOOST_CHECK_EQUAL(range.out(), 0);
0548
0549
0550 BOOST_CHECK_EQUAL(lowEdge.tot(), N);
0551 BOOST_CHECK_CLOSE(lowEdge.in(), 0.4/0.9 * N, 10);
0552 BOOST_CHECK_CLOSE(lowEdge.out(), 0.5/0.9 * N, 10);
0553
0554
0555 BOOST_CHECK_EQUAL(midPoint.tot(), N);
0556 BOOST_CHECK_CLOSE(midPoint.in(), 0.2/0.9 * N, 10);
0557 BOOST_CHECK_CLOSE(midPoint.out(), 0.7/0.9 * N, 10);
0558
0559
0560 BOOST_CHECK_EQUAL(hiEdge.tot(), N);
0561 BOOST_CHECK_CLOSE(hiEdge.in(), 0.3/0.9 * N, 10);
0562 BOOST_CHECK_CLOSE(hiEdge.out(), 0.6/0.9 * N, 10);
0563 }
0564
0565 BOOST_AUTO_TEST_CASE(prndSign)
0566 {
0567 int N = 1000;
0568 double p1 = 0.4;
0569 double p2 = 0.2;
0570 double p3 = 0.3;
0571
0572 LongBinCheck range(-1, 1);
0573
0574 LongBinCheck lowEdge(-1, -1);
0575 LongBinCheck midPoint(0, 0);
0576 LongBinCheck hiEdge(1, 1);
0577
0578 for(int i = 0; i < N; ++i) {
0579 range.add(rng.prndsign(p1, p2, p3));
0580 lowEdge.add(rng.prndsign(p1, p2, p3));
0581 midPoint.add(rng.prndsign(p1, p2, p3));
0582 hiEdge.add(rng.prndsign(p1, p2, p3));
0583 }
0584
0585 BOOST_CHECK_EQUAL(range.tot(), N);
0586 BOOST_CHECK_EQUAL(range.in(), N);
0587 BOOST_CHECK_EQUAL(range.out(), 0);
0588
0589
0590 BOOST_CHECK_EQUAL(lowEdge.tot(), N);
0591 BOOST_CHECK_CLOSE(lowEdge.in(), 0.4/0.9 * N, 10);
0592 BOOST_CHECK_CLOSE(lowEdge.out(), 0.5/0.9 * N, 10);
0593
0594
0595 BOOST_CHECK_EQUAL(midPoint.tot(), N);
0596 BOOST_CHECK_CLOSE(midPoint.in(), 0.2/0.9 * N, 10);
0597 BOOST_CHECK_CLOSE(midPoint.out(), 0.7/0.9 * N, 10);
0598
0599
0600 BOOST_CHECK_EQUAL(hiEdge.tot(), N);
0601 BOOST_CHECK_CLOSE(hiEdge.in(), 0.3/0.9 * N, 10);
0602 BOOST_CHECK_CLOSE(hiEdge.out(), 0.6/0.9 * N, 10);
0603 }
0604
0605 BOOST_AUTO_TEST_CASE(rnd2)
0606 {
0607 int N = 1000;
0608 double p1 = 0.4;
0609 double p2 = 0.2;
0610
0611 LongBinCheck posRange(0, 1);
0612
0613 LongBinCheck midPoint(0, 0);
0614 LongBinCheck hiEdge(1, 1);
0615
0616 for(int i = 0; i < N; ++i) {
0617 posRange.add(rng.rnd2(p1, p2));
0618 midPoint.add(rng.rnd2(p1, p2));
0619 hiEdge.add(rng.rnd2(p1, p2));
0620 }
0621
0622 BOOST_CHECK_EQUAL(posRange.tot(), N);
0623 BOOST_CHECK_EQUAL(posRange.in(), N);
0624 BOOST_CHECK_EQUAL(posRange.out(), 0);
0625
0626
0627 BOOST_CHECK_EQUAL(midPoint.tot(), N);
0628 BOOST_CHECK_CLOSE(midPoint.in(), 0.666 * N, 10);
0629 BOOST_CHECK_CLOSE(midPoint.out(), 0.333 * N, 10);
0630
0631
0632 BOOST_CHECK_EQUAL(hiEdge.tot(), N);
0633 BOOST_CHECK_CLOSE(hiEdge.in(), 0.333 * N, 10);
0634 BOOST_CHECK_CLOSE(hiEdge.out(), 0.666 * N, 10);
0635 }
0636
0637 BOOST_AUTO_TEST_CASE(rnd3)
0638 {
0639 int N = 1000;
0640 double p1 = 0.4;
0641 double p2 = 0.2;
0642 double p3 = 0.3;
0643
0644 LongBinCheck zero2two(0, 2);
0645
0646 LongBinCheck midPoint(0, 0);
0647 LongBinCheck hiEdge(1, 1);
0648 LongBinCheck two(2, 2);
0649
0650 for(int i = 0; i < N; ++i) {
0651 zero2two.add(rng.rnd3(p1, p2, p3));
0652 midPoint.add(rng.rnd3(p1, p2, p3));
0653 hiEdge.add(rng.rnd3(p1, p2, p3));
0654 two.add(rng.rnd3(p1, p2, p3));
0655 }
0656
0657 BOOST_CHECK_EQUAL(zero2two.tot(), N);
0658 BOOST_CHECK_EQUAL(zero2two.in(), N);
0659 BOOST_CHECK_EQUAL(zero2two.out(), 0);
0660
0661
0662 BOOST_CHECK_EQUAL(midPoint.tot(), N);
0663 BOOST_CHECK_CLOSE(midPoint.in(), 0.4/0.9 * N, 10);
0664 BOOST_CHECK_CLOSE(midPoint.out(), 0.5/0.9 * N, 10);
0665
0666
0667 BOOST_CHECK_EQUAL(hiEdge.tot(), N);
0668 BOOST_CHECK_CLOSE(hiEdge.in(), 0.2/0.9 * N, 10);
0669 BOOST_CHECK_CLOSE(hiEdge.out(), 0.7/0.9 * N, 10);
0670
0671
0672 BOOST_CHECK_EQUAL(two.tot(), N);
0673 BOOST_CHECK_CLOSE(two.in(), 0.3/0.9 * N, 10);
0674 BOOST_CHECK_CLOSE(two.out(), 0.6/0.9 * N, 10);
0675 }
0676
0677 BOOST_AUTO_TEST_CASE(rnd4)
0678 {
0679 int N = 1000;
0680 double p1 = 0.4;
0681 double p2 = 0.2;
0682 double p3 = 0.3;
0683 double p4 = 0.5;
0684
0685 LongBinCheck bin_03(0, 3);
0686
0687 LongBinCheck bin0(0, 0);
0688 LongBinCheck bin1(1, 1);
0689 LongBinCheck bin2(2, 2);
0690 LongBinCheck bin3(3, 3);
0691
0692 for(int i = 0; i < N; ++i) {
0693 bin_03.add(rng.rnd4(p1, p2, p3, p4));
0694 bin0.add(rng.rnd4(p1, p2, p3, p4));
0695 bin1.add(rng.rnd4(p1, p2, p3, p4));
0696 bin2.add(rng.rnd4(p1, p2, p3, p4));
0697 bin3.add(rng.rnd4(p1, p2, p3, p4));
0698 }
0699
0700 BOOST_CHECK_EQUAL(bin_03.tot(), N);
0701 BOOST_CHECK_EQUAL(bin_03.in(), N);
0702 BOOST_CHECK_EQUAL(bin_03.out(), 0);
0703
0704
0705 BOOST_CHECK_EQUAL(bin0.tot(), N);
0706 BOOST_CHECK_CLOSE(bin0.in(), 0.4/1.4 * N, 10);
0707 BOOST_CHECK_CLOSE(bin0.out(), 1.0/1.4 * N, 10);
0708
0709
0710 BOOST_CHECK_EQUAL(bin1.tot(), N);
0711 BOOST_CHECK_CLOSE(bin1.in(), 0.2/1.4 * N, 10);
0712 BOOST_CHECK_CLOSE(bin1.out(), 1.2/1.4 * N, 10);
0713
0714
0715 BOOST_CHECK_EQUAL(bin2.tot(), N);
0716 BOOST_CHECK_CLOSE(bin2.in(), 0.3/1.4 * N, 10);
0717 BOOST_CHECK_CLOSE(bin2.out(), 1.1/1.4 * N, 10);
0718
0719
0720 BOOST_CHECK_EQUAL(bin3.tot(), N);
0721 BOOST_CHECK_CLOSE(bin3.in(), 0.5/1.4 * N, 10);
0722 BOOST_CHECK_CLOSE(bin3.out(), 0.9/1.4 * N, 10);
0723 }
0724
0725 BOOST_AUTO_TEST_CASE(rndExp)
0726 {
0727 int N = 1000;
0728
0729 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0730
0731 DoubleBinCheck firstHalf(-DBL_MAX, log(2));
0732 DoubleBinCheck secondHalf(log(2), DBL_MAX);
0733
0734 DoubleBinCheck neg1000(-1000, 0);
0735 DoubleBinCheck pos1000(0, 1000);
0736
0737 for(int i = 0; i < N; ++i) {
0738 allnums.add(rng.rndExp());
0739 firstHalf.add(rng.rndExp());
0740 secondHalf.add(rng.rndExp());
0741 neg1000.add(rng.rndExp());
0742 pos1000.add(rng.rndExp());
0743 }
0744
0745 BOOST_CHECK_EQUAL(allnums.tot(), N);
0746 BOOST_CHECK_EQUAL(allnums.in(), N);
0747 BOOST_CHECK_EQUAL(allnums.out(), 0);
0748
0749
0750 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
0751 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 15);
0752 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 15);
0753
0754
0755 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
0756 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 15);
0757 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 15);
0758
0759
0760 BOOST_CHECK(neg1000.in() <= pos1000.in());
0761 }
0762
0763 BOOST_AUTO_TEST_CASE(rndExpMean)
0764 {
0765 int N = 1000;
0766 double meanValue = 5;
0767
0768 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0769
0770 DoubleBinCheck firstHalf(-DBL_MAX, log(2) * meanValue);
0771 DoubleBinCheck secondHalf(log(2) * meanValue, DBL_MAX);
0772
0773 DoubleBinCheck neg1000(-1000, 0);
0774 DoubleBinCheck pos1000(0, 1000);
0775
0776 for(int i = 0; i < N; ++i) {
0777 allnums.add(rng.rndExp(meanValue));
0778 firstHalf.add(rng.rndExp(meanValue));
0779 secondHalf.add(rng.rndExp(meanValue));
0780 neg1000.add(rng.rndExp(meanValue));
0781 pos1000.add(rng.rndExp(meanValue));
0782 }
0783
0784 BOOST_CHECK_EQUAL(allnums.tot(), N);
0785 BOOST_CHECK_EQUAL(allnums.in(), N);
0786 BOOST_CHECK_EQUAL(allnums.out(), 0);
0787
0788
0789 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
0790 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 15);
0791 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 15);
0792
0793
0794 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
0795 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 15);
0796 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 15);
0797
0798
0799 BOOST_CHECK(neg1000.in() <= pos1000.in());
0800 }
0801
0802 BOOST_AUTO_TEST_CASE(rndGauss)
0803 {
0804 int N = 1000;
0805
0806
0807 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0808
0809 DoubleBinCheck firstHalf(-DBL_MAX, 0);
0810 DoubleBinCheck secondHalf(0, DBL_MAX);
0811
0812 DoubleBinCheck oneSigma(-1, 1);
0813 DoubleBinCheck threeSigma(-3, 3);
0814 DoubleBinCheck eightSigma(-8, 8);
0815
0816 for(int i = 0; i < N; ++i) {
0817 allnums.add(rng.rndGauss());
0818 firstHalf.add(rng.rndGauss());
0819 secondHalf.add(rng.rndGauss());
0820 oneSigma.add(rng.rndGauss());
0821 threeSigma.add(rng.rndGauss());
0822 eightSigma.add(rng.rndGauss());
0823 }
0824
0825
0826 BOOST_CHECK_EQUAL(allnums.tot(), N);
0827 BOOST_CHECK_EQUAL(allnums.in(), N);
0828 BOOST_CHECK_EQUAL(allnums.out(), 0);
0829
0830
0831 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
0832 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 15);
0833 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 15);
0834
0835
0836 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
0837 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 15);
0838 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 15);
0839
0840
0841 BOOST_CHECK_EQUAL(oneSigma.tot(), N);
0842 BOOST_CHECK_CLOSE(oneSigma.in(), 0.68 * N, 15);
0843 BOOST_CHECK_CLOSE(oneSigma.out(), 0.32 * N, 15);
0844
0845
0846 BOOST_CHECK_EQUAL(threeSigma.tot(), N);
0847 BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * N, 15);
0848
0849
0850 BOOST_CHECK_EQUAL(eightSigma.tot(), N);
0851 BOOST_CHECK_CLOSE(eightSigma.in(), 0.9999 * N, 15);
0852 }
0853
0854 BOOST_AUTO_TEST_CASE(rndGaussMeanSigma)
0855 {
0856 int N = 1000;
0857
0858 for(double mean = 1; mean < 5; mean += 1) {
0859 for(double sigma = 0.25; sigma < 0.65; sigma += 0.1) {
0860
0861 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0862
0863 DoubleBinCheck firstHalf(-DBL_MAX, mean);
0864 DoubleBinCheck secondHalf(mean, DBL_MAX);
0865
0866 DoubleBinCheck oneSigma(mean - sigma, mean + sigma);
0867 DoubleBinCheck threeSigma(mean - 3 * sigma, mean + 3 * sigma);
0868 DoubleBinCheck eightSigma(mean - 8 * sigma, mean + 8 * sigma);
0869
0870 for(int i = 0; i < N; ++i) {
0871 allnums.add(rng.rndGauss(sigma, mean));
0872 firstHalf.add(rng.rndGauss(sigma, mean));
0873 secondHalf.add(rng.rndGauss(sigma, mean));
0874 oneSigma.add(rng.rndGauss(sigma, mean));
0875 threeSigma.add(rng.rndGauss(sigma, mean));
0876 eightSigma.add(rng.rndGauss(sigma, mean));
0877 }
0878
0879
0880 BOOST_CHECK_EQUAL(allnums.tot(), N);
0881 BOOST_CHECK_EQUAL(allnums.in(), N);
0882 BOOST_CHECK_EQUAL(allnums.out(), 0);
0883
0884
0885 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
0886 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 15);
0887 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 15);
0888
0889
0890 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
0891 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 15);
0892 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 15);
0893
0894
0895 BOOST_CHECK_EQUAL(oneSigma.tot(), N);
0896 BOOST_CHECK_CLOSE(oneSigma.in(), 0.68 * N, 15);
0897 BOOST_CHECK_CLOSE(oneSigma.out(), 0.32 * N, 15);
0898
0899
0900 BOOST_CHECK_EQUAL(threeSigma.tot(), N);
0901 BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * N, 15);
0902
0903
0904 BOOST_CHECK_EQUAL(eightSigma.tot(), N);
0905 BOOST_CHECK_CLOSE(eightSigma.in(), 0.9999 * N, 15);
0906 }
0907 }
0908 }
0909
0910
0911 BOOST_AUTO_TEST_CASE(rndGaussTwoNumbers)
0912 {
0913 int N = 1000;
0914
0915
0916 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0917
0918 DoubleBinCheck firstHalf(-DBL_MAX, 0);
0919 DoubleBinCheck secondHalf(0, DBL_MAX);
0920
0921 DoubleBinCheck oneSigma(-1, 1);
0922 DoubleBinCheck threeSigma(-3, 3);
0923 DoubleBinCheck eightSigma(-8, 8);
0924
0925 double r1, r2;
0926 for(int i = 0; i < N; ++i) {
0927 rng.rndGaussTwoNumbers(r1, r2);
0928
0929 allnums.add(r1);
0930 firstHalf.add(r1);
0931 secondHalf.add(r1);
0932 oneSigma.add(r1);
0933 threeSigma.add(r1);
0934 eightSigma.add(r1);
0935
0936 allnums.add(r2);
0937 firstHalf.add(r2);
0938 secondHalf.add(r2);
0939 oneSigma.add(r2);
0940 threeSigma.add(r2);
0941 eightSigma.add(r2);
0942 }
0943
0944
0945 N *= 2;
0946
0947 BOOST_CHECK_EQUAL(allnums.tot(), N);
0948 BOOST_CHECK_EQUAL(allnums.in(), N);
0949 BOOST_CHECK_EQUAL(allnums.out(), 0);
0950
0951
0952 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
0953 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 15);
0954 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 15);
0955
0956
0957 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
0958 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 15);
0959 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 15);
0960
0961
0962 BOOST_CHECK_EQUAL(oneSigma.tot(), N);
0963 BOOST_CHECK_CLOSE(oneSigma.in(), 0.68 * N, 15);
0964 BOOST_CHECK_CLOSE(oneSigma.out(), 0.32 * N, 15);
0965
0966
0967 BOOST_CHECK_EQUAL(threeSigma.tot(), N);
0968 BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * N, 15);
0969
0970
0971 BOOST_CHECK_EQUAL(eightSigma.tot(), N);
0972 BOOST_CHECK_CLOSE(eightSigma.in(), 0.9999 * N, 15);
0973 }
0974
0975 BOOST_AUTO_TEST_CASE(rndGaussTwoNumbersMeanSigma)
0976 {
0977 int N = 1000;
0978
0979 int NTwo = 2 * N;
0980 double r1, r2;
0981
0982 for(double mean = 1; mean < 5; mean += 1) {
0983 for(double sigma = 0.25; sigma < 0.65; sigma += 0.1) {
0984
0985 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0986
0987 DoubleBinCheck firstHalf(-DBL_MAX, mean);
0988 DoubleBinCheck secondHalf(mean, DBL_MAX);
0989
0990 DoubleBinCheck oneSigma(mean - sigma, mean + sigma);
0991 DoubleBinCheck threeSigma(mean - 3 * sigma, mean + 3 * sigma);
0992 DoubleBinCheck eightSigma(mean - 8 * sigma, mean + 8 * sigma);
0993
0994 for(int i = 0; i < N; ++i) {
0995 rng.rndGaussTwoNumbers(r1, r2, sigma, mean);
0996
0997 allnums.add(r1);
0998 firstHalf.add(r1);
0999 secondHalf.add(r1);
1000 oneSigma.add(r1);
1001 threeSigma.add(r1);
1002 eightSigma.add(r1);
1003
1004 allnums.add(r2);
1005 firstHalf.add(r2);
1006 secondHalf.add(r2);
1007 oneSigma.add(r2);
1008 threeSigma.add(r2);
1009 eightSigma.add(r2);
1010 }
1011
1012
1013 BOOST_CHECK_EQUAL(allnums.tot(), NTwo);
1014 BOOST_CHECK_EQUAL(allnums.in(), NTwo);
1015 BOOST_CHECK_EQUAL(allnums.out(), 0);
1016
1017
1018 BOOST_CHECK_EQUAL(firstHalf.tot(), NTwo);
1019 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * NTwo, 15);
1020 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * NTwo, 15);
1021
1022
1023 BOOST_CHECK_EQUAL(secondHalf.tot(), NTwo);
1024 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * NTwo, 15);
1025 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * NTwo, 15);
1026
1027
1028 BOOST_CHECK_EQUAL(oneSigma.tot(), NTwo);
1029 BOOST_CHECK_CLOSE(oneSigma.in(), 0.68 * NTwo, 15);
1030 BOOST_CHECK_CLOSE(oneSigma.out(), 0.32 * NTwo, 15);
1031
1032
1033 BOOST_CHECK_EQUAL(threeSigma.tot(), NTwo);
1034 BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * NTwo, 15);
1035
1036
1037 BOOST_CHECK_EQUAL(eightSigma.tot(), NTwo);
1038 BOOST_CHECK_CLOSE(eightSigma.in(), 0.9999 * NTwo, 15);
1039 }
1040 }
1041 }
1042
1043 BOOST_AUTO_TEST_CASE(rndPoisson)
1044 {
1045 int N = 1000;
1046
1047 for(double mean = 5; mean < 21; mean += 5) {
1048
1049 LongBinCheck zero2max(0, LONG_MAX);
1050
1051 LongBinCheck zero(0, mean);
1052 LongBinCheck secondHalf(mean, LONG_MAX);
1053
1054 LongBinCheck nearMean(mean - std::sqrt(mean), mean + std::sqrt(mean));
1055 LongBinCheck awayMean(mean + std::sqrt(mean), mean + 3 * std::sqrt(mean));
1056
1057 for(int i = 0; i < N; ++i) {
1058 zero2max.add(rng.rndPoisson(mean));
1059 zero.add(rng.rndPoisson(mean));
1060 secondHalf.add(rng.rndPoisson(mean));
1061 nearMean.add(rng.rndPoisson(mean));
1062 awayMean.add(rng.rndPoisson(mean));
1063 }
1064
1065
1066 BOOST_CHECK_EQUAL(zero2max.tot(), N);
1067 BOOST_CHECK_EQUAL(zero2max.in(), N);
1068 BOOST_CHECK_EQUAL(zero2max.out(), 0);
1069
1070
1071 BOOST_CHECK_EQUAL(zero.tot(), N);
1072 BOOST_CHECK_CLOSE(zero.in(), 0.5 * N, 30);
1073 BOOST_CHECK_CLOSE(zero.out(), 0.5 * N, 30);
1074
1075
1076 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
1077 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 30);
1078 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 30);
1079
1080
1081 BOOST_CHECK(nearMean.in() > awayMean.in());
1082 }
1083 }
1084
1085 BOOST_AUTO_TEST_CASE(rndBW)
1086 {
1087 int N = 1000;
1088
1089 for(double mean = 5; mean < 21; mean += 5) {
1090 for (double gamma = 1; gamma < 5; gamma += 1) {
1091
1092 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1093
1094 DoubleBinCheck firstHalf(-DBL_MAX, mean);
1095 DoubleBinCheck secondHalf(mean, DBL_MAX);
1096
1097 DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1098 DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1099
1100 DoubleBinCheck awayMeanTwo(mean - 3 * std::sqrt(gamma), mean - std::sqrt(gamma));
1101
1102 for(int i = 0; i < N; ++i) {
1103 allnums.add(rng.rndBW(mean, gamma));
1104 firstHalf.add(rng.rndBW(mean, gamma));
1105 secondHalf.add(rng.rndBW(mean, gamma));
1106 nearMean.add(rng.rndBW(mean, gamma));
1107 awayMeanOne.add(rng.rndBW(mean, gamma));
1108 awayMeanTwo.add(rng.rndBW(mean, gamma));
1109 }
1110
1111
1112 BOOST_CHECK_EQUAL(allnums.tot(), N);
1113 BOOST_CHECK_EQUAL(allnums.in(), N);
1114 BOOST_CHECK_EQUAL(allnums.out(), 0);
1115
1116
1117 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
1118 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 30);
1119 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 30);
1120
1121
1122 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
1123 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 30);
1124 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 30);
1125
1126
1127 BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1128
1129
1130 BOOST_CHECK_CLOSE(1.0 * awayMeanTwo.in(), 1.0 * awayMeanOne.in(), 60);
1131 }
1132 }
1133 }
1134
1135 BOOST_AUTO_TEST_CASE(rndBWCut)
1136 {
1137 int N = 1000;
1138
1139 double cutValue = 2;
1140 for(double mean = 5; mean < 10; mean += 2) {
1141 for (double gamma = 1; gamma < 5; gamma += 1) {
1142
1143 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1144
1145 DoubleBinCheck inCut(mean - cutValue, mean + cutValue);
1146
1147 DoubleBinCheck firstHalf(-DBL_MAX, mean);
1148 DoubleBinCheck secondHalf(mean, DBL_MAX);
1149
1150 DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1151 DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1152
1153 DoubleBinCheck awayMeanTwo(mean - 3 * std::sqrt(gamma), mean - std::sqrt(gamma));
1154
1155 for(int i = 0; i < N; ++i) {
1156 allnums.add(rng.rndBW(mean, gamma, cutValue));
1157 inCut.add(rng.rndBW(mean, gamma, cutValue));
1158 firstHalf.add(rng.rndBW(mean, gamma, cutValue));
1159 secondHalf.add(rng.rndBW(mean, gamma, cutValue));
1160 nearMean.add(rng.rndBW(mean, gamma, cutValue));
1161 awayMeanOne.add(rng.rndBW(mean, gamma, cutValue));
1162 awayMeanTwo.add(rng.rndBW(mean, gamma, cutValue));
1163 }
1164
1165
1166 BOOST_CHECK_EQUAL(allnums.tot(), N);
1167 BOOST_CHECK_EQUAL(allnums.in(), N);
1168 BOOST_CHECK_EQUAL(allnums.out(), 0);
1169
1170
1171 BOOST_CHECK_EQUAL(inCut.tot(), N);
1172 BOOST_CHECK_EQUAL(inCut.in(), N);
1173 BOOST_CHECK_EQUAL(inCut.out(), 0);
1174
1175
1176 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
1177 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 30);
1178 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 30);
1179
1180
1181 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
1182 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 30);
1183 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 30);
1184
1185
1186 BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1187
1188
1189 BOOST_CHECK_CLOSE(1.0 * awayMeanTwo.in(), 1.0 * awayMeanOne.in(), 60);
1190 }
1191 }
1192 }
1193
1194 BOOST_AUTO_TEST_CASE(rndRelBW)
1195 {
1196 int N = 1000;
1197
1198 for(double mean = 5; mean < 21; mean += 5) {
1199 for (double gamma = 1; gamma < 5; gamma += 1) {
1200
1201 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1202
1203 DoubleBinCheck firstHalf(-DBL_MAX, mean);
1204 DoubleBinCheck secondHalf(mean, DBL_MAX);
1205
1206 DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1207 DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1208
1209 DoubleBinCheck awayMeanTwo(mean - 3 * std::sqrt(gamma), mean - std::sqrt(gamma));
1210
1211 for(int i = 0; i < N; ++i) {
1212 allnums.add(rng.rndRelBW<double>(mean, gamma));
1213 firstHalf.add(rng.rndRelBW<double>(mean, gamma));
1214 secondHalf.add(rng.rndRelBW<double>(mean, gamma));
1215 nearMean.add(rng.rndRelBW<double>(mean, gamma));
1216 awayMeanOne.add(rng.rndRelBW<double>(mean, gamma));
1217 awayMeanTwo.add(rng.rndRelBW<double>(mean, gamma));
1218 }
1219
1220
1221 BOOST_CHECK_EQUAL(allnums.tot(), N);
1222 BOOST_CHECK_EQUAL(allnums.in(), N);
1223 BOOST_CHECK_EQUAL(allnums.out(), 0);
1224
1225
1226 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
1227 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 50);
1228 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 50);
1229
1230
1231 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
1232 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 50);
1233 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 50);
1234
1235
1236 BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1237
1238
1239 BOOST_CHECK_CLOSE(1.0 * awayMeanTwo.in(), 1.0 * awayMeanOne.in(), 200);
1240 }
1241 }
1242 }
1243
1244 BOOST_AUTO_TEST_CASE(rndRelBWCut)
1245 {
1246 int N = 1000;
1247
1248 double cutValue = 2;
1249 for(double mean = 5; mean < 10; mean += 2) {
1250 for (double gamma = 1; gamma < 5; gamma += 1) {
1251
1252 DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1253
1254 DoubleBinCheck inCut(mean - cutValue, mean + cutValue);
1255
1256 DoubleBinCheck firstHalf(-DBL_MAX, mean);
1257 DoubleBinCheck secondHalf(mean, DBL_MAX);
1258
1259 DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1260 DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1261
1262 DoubleBinCheck awayMeanTwo(mean - 3 * std::sqrt(gamma), mean - std::sqrt(gamma));
1263
1264 for(int i = 0; i < N; ++i) {
1265 allnums.add(rng.rndRelBW<double>(mean, gamma, cutValue));
1266 inCut.add(rng.rndRelBW<double>(mean, gamma, cutValue));
1267 firstHalf.add(rng.rndRelBW<double>(mean, gamma, cutValue));
1268 secondHalf.add(rng.rndRelBW<double>(mean, gamma, cutValue));
1269 nearMean.add(rng.rndRelBW<double>(mean, gamma, cutValue));
1270 awayMeanOne.add(rng.rndRelBW<double>(mean, gamma, cutValue));
1271 awayMeanTwo.add(rng.rndRelBW<double>(mean, gamma, cutValue));
1272 }
1273
1274
1275 BOOST_CHECK_EQUAL(allnums.tot(), N);
1276 BOOST_CHECK_EQUAL(allnums.in(), N);
1277 BOOST_CHECK_EQUAL(allnums.out(), 0);
1278
1279
1280 BOOST_CHECK_EQUAL(inCut.tot(), N);
1281 BOOST_CHECK_EQUAL(inCut.in(), N);
1282 BOOST_CHECK_EQUAL(inCut.out(), 0);
1283
1284
1285 BOOST_CHECK_EQUAL(firstHalf.tot(), N);
1286 BOOST_CHECK_CLOSE(firstHalf.in(), 0.5 * N, 30);
1287 BOOST_CHECK_CLOSE(firstHalf.out(), 0.5 * N, 30);
1288
1289
1290 BOOST_CHECK_EQUAL(secondHalf.tot(), N);
1291 BOOST_CHECK_CLOSE(secondHalf.in(), 0.5 * N, 30);
1292 BOOST_CHECK_CLOSE(secondHalf.out(), 0.5 * N, 30);
1293
1294
1295 BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1296
1297
1298 BOOST_CHECK_CLOSE(1.0 * awayMeanTwo.in(), 1.0 * awayMeanOne.in(), 120);
1299 }
1300 }
1301 }
1302
1303 BOOST_AUTO_TEST_SUITE_END()
1304
1305 #endif