Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:38:30

0001 // -*- C++ -*-
0002 //
0003 // utilitiesTestSmearing.h is a part of ThePEG - Toolkit for HEP Event Generation
0004 // Copyright (C) 1999-2019 Leif Lonnblad, 2015 Marco A. Harrendorf
0005 //
0006 // ThePEG is licenced under version 3 of the GPL, see COPYING for details.
0007 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
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  * Helper class to test generated random numbers
0022  * 
0023  * The class checks how many random numbers are inside a pre-defined interval and how many outside
0024  * This class is e.g. useful to check random numbers produced by a gaussian distribution
0025  */
0026 template <typename Unit>
0027 class BinningCheck {
0028   private:
0029     // Do not accept missing interval limits
0030     BinningCheck() {}
0031   public:
0032     // Define interval limits
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     // Check if random number is inside / outside interval and increase corresponding counter
0041     void add(Unit randomNumber) {
0042       if(randomNumber >= m_lo && randomNumber <= m_hi) {
0043     m_in++;
0044       } else {
0045     m_out++;
0046       }
0047     }
0048     // Reset counters
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  * Start of BOOST unit tests for Helper class
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  * End of BOOST unit tests for Helper class
0099  * 
0100  */
0101 BOOST_AUTO_TEST_SUITE_END()
0102 
0103 
0104 
0105 /*
0106  * Local fix to provide randomGenerator object
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  * Start of boost unit tests for RandomGenerator.h
0123  * 
0124  */
0125 BOOST_FIXTURE_TEST_SUITE(repositoryRandomGenerator, FixLocal1)
0126 
0127 /*
0128  * Boost unit tests 
0129  * 
0130  */
0131 BOOST_AUTO_TEST_CASE(rndZeroToOne)
0132 {
0133   int N = 1000;
0134   // Check for whole interval 
0135   DoubleBinCheck posRange(0, 1);
0136   // Check for flat distribution
0137   DoubleBinCheck quarter1(0, 0.25);
0138   DoubleBinCheck quarter3(0.5, 0.75);
0139   
0140   // rnd function
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   // Prob laying inside of interval should be 1
0147   BOOST_CHECK_EQUAL(posRange.tot(), N);
0148   BOOST_CHECK_EQUAL(posRange.in(), N);
0149   BOOST_CHECK_EQUAL(posRange.out(), 0);
0150   
0151   // Prob laying inside of interval should be 0.25
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   // Prob laying inside of interval should be 0.25
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   // repeat for operator()
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     // Prob laying inside of interval should be 0.25
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   // Prob laying inside of interval should be 0.25
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     // Check for whole interval 
0191   DoubleBinCheck zero2hi(0, 2.5);
0192   // Check for flat distribution
0193   DoubleBinCheck quarter1(0, 0.5);
0194   DoubleBinCheck quarter3(1.5, 2.0);
0195   
0196   // rnd function
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   // Prob laying inside of interval should be 1
0203   BOOST_CHECK_EQUAL(zero2hi.tot(), N);
0204   BOOST_CHECK_EQUAL(zero2hi.in(), N);
0205   BOOST_CHECK_EQUAL(zero2hi.out(), 0);
0206   
0207   // Prob laying inside of interval should be 0.2
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   // Prob laying inside of interval should be 0.2
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   // repeat for operator(), note it is generally requiring a long!
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     // Prob laying inside of interval should be 0.2
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   // Prob laying inside of interval should be 0.2
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   // repeat for operator(), note it is requiring a long!
0242   long hiTwo = 3;
0243   // Check for whole interval 
0244   LongBinCheck zero2hiTwo(0, hiTwo);
0245   // Check for flat distribution
0246   LongBinCheck quarter1Two(1, 1);
0247   LongBinCheck quarter3Two(2, 2);
0248   
0249   // operator()(long N)
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   // Prob laying inside of interval should be 1
0256   BOOST_CHECK_EQUAL(zero2hiTwo.tot(), N);
0257   BOOST_CHECK_EQUAL(zero2hiTwo.in(), N);
0258   BOOST_CHECK_EQUAL(zero2hiTwo.out(), 0);
0259   
0260   // Prob laying inside of interval should be 0.333
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   // Prob laying inside of interval should be 0.333
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   // Check for whole interval 
0277   DoubleBinCheck zero2hi(lo, hi);
0278   // Check for flat distribution
0279   DoubleBinCheck quarter1(-0.5, 0.5);
0280   DoubleBinCheck quarter3(1.5, 2.5);
0281   
0282   // rnd function
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   // Prob laying inside of interval should be 1
0289   BOOST_CHECK_EQUAL(zero2hi.tot(), N);
0290   BOOST_CHECK_EQUAL(zero2hi.in(), N);
0291   BOOST_CHECK_EQUAL(zero2hi.out(), 0);
0292   
0293   // Prob laying inside of interval should be 0.25
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   // Prob laying inside of interval should be 0.25
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     // Check for whole interval 
0309   DoubleBinCheck posRange(0, 1);
0310   // Check for flat distribution
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     // Prob laying inside of interval should be 1
0327     BOOST_CHECK_EQUAL(posRange.tot(), N);
0328     BOOST_CHECK_EQUAL(posRange.in(), N);
0329     BOOST_CHECK_EQUAL(posRange.out(), 0);
0330     
0331     // Prob laying inside of interval should be 0.25
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     // Prob laying inside of interval should be 0.25
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   // Check for whole interval 
0347   LongBinCheck posRange(0, 1);
0348   // Check for flat distribution
0349   LongBinCheck zero(0, 0);
0350   LongBinCheck one(1, 1);
0351   
0352   // rndbool function, prob should be 0.5
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   // Prob laying inside of interval should be 1
0359   BOOST_CHECK_EQUAL(posRange.tot(), N);
0360   BOOST_CHECK_EQUAL(posRange.in(), N);
0361   BOOST_CHECK_EQUAL(posRange.out(), 0);
0362   
0363   // Prob laying inside of interval should be 0.5
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   // Prob laying inside of interval should be 0.5
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   // Check for whole interval 
0375   LongBinCheck posRangeTwo(0, 1);
0376   // Check for flat distribution
0377   LongBinCheck midPoint(0, 0);
0378   LongBinCheck hiEdge(1, 1);
0379   
0380   // rndbool function, prob should be now 0.4
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   // Prob laying inside of interval should be 1
0387   BOOST_CHECK_EQUAL(posRangeTwo.tot(), N);
0388   BOOST_CHECK_EQUAL(posRangeTwo.in(), N);
0389   BOOST_CHECK_EQUAL(posRangeTwo.out(), 0);
0390   
0391   // Prob laying inside of interval should be 0.6
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   // Prob laying inside of interval should be 0.4
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   // Check for whole interval 
0406   LongBinCheck posRange(0, 1);
0407   // Check for flat distribution
0408   LongBinCheck zero(0, 0);
0409   LongBinCheck one(1, 1);
0410   
0411   // rndbool function, prob should be 0.5
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   // Prob laying inside of interval should be 1
0418   BOOST_CHECK_EQUAL(posRange.tot(), N);
0419   BOOST_CHECK_EQUAL(posRange.in(), N);
0420   BOOST_CHECK_EQUAL(posRange.out(), 0);
0421   
0422   // Prob laying inside of interval should be 0.5
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   // Prob laying inside of interval should be 0.5
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   // Check for whole interval 
0434   LongBinCheck posRangeTwo(0, 1);
0435   // Check for flat distribution
0436   LongBinCheck midPoint(0, 0);
0437   LongBinCheck hiEdge(1, 1);
0438   
0439   // rndbool function, prob should be now 0.4
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   // Prob laying inside of interval should be 1
0446   BOOST_CHECK_EQUAL(posRangeTwo.tot(), N);
0447   BOOST_CHECK_EQUAL(posRangeTwo.in(), N);
0448   BOOST_CHECK_EQUAL(posRangeTwo.out(), 0);
0449   
0450   // Prob laying inside of interval should be 0.6
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   // Prob laying inside of interval should be 0.4
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   // Check for whole interval 
0467   LongBinCheck posRange(0, 1);
0468   // Check for flat distribution
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   // Prob laying inside of interval should be 1
0478   BOOST_CHECK_EQUAL(posRange.tot(), N);
0479   BOOST_CHECK_EQUAL(posRange.in(), N);
0480   BOOST_CHECK_EQUAL(posRange.out(), 0);
0481   
0482   // Prob laying inside of interval should be 0.6
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   // Prob laying inside of interval should be 0.2/0.5 = 0.4
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   // Check for whole interval 
0499   LongBinCheck posRange(0, 1);
0500   // Check for flat distribution
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   // Prob laying inside of interval should be 1
0510   BOOST_CHECK_EQUAL(posRange.tot(), N);
0511   BOOST_CHECK_EQUAL(posRange.in(), N);
0512   BOOST_CHECK_EQUAL(posRange.out(), 0);
0513   
0514   // Prob laying inside of interval should be 0.6
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   // Prob laying inside of interval should be 0.2/0.5 = 0.4
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   // Check for whole interval 
0532   LongBinCheck range(-1, 1);
0533   // Check for flat distribution
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   // Prob laying inside of interval should be 1
0545   BOOST_CHECK_EQUAL(range.tot(), N);
0546   BOOST_CHECK_EQUAL(range.in(), N);
0547   BOOST_CHECK_EQUAL(range.out(), 0);
0548   
0549   // Prob laying inside of interval should be 0.4
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   // Prob laying inside of interval should be 0.2
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   // Prob laying inside of interval should be 0.2
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   // Check for whole interval 
0572   LongBinCheck range(-1, 1);
0573   // Check for flat distribution
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   // Prob laying inside of interval should be 1
0585   BOOST_CHECK_EQUAL(range.tot(), N);
0586   BOOST_CHECK_EQUAL(range.in(), N);
0587   BOOST_CHECK_EQUAL(range.out(), 0);
0588   
0589   // Prob laying inside of interval should be 0.4
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   // Prob laying inside of interval should be 0.2
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   // Prob laying inside of interval should be 0.2
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   // Check for whole interval 
0611   LongBinCheck posRange(0, 1);
0612   // Check for flat distribution
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   // Prob laying inside of interval should be 1
0622   BOOST_CHECK_EQUAL(posRange.tot(), N);
0623   BOOST_CHECK_EQUAL(posRange.in(), N);
0624   BOOST_CHECK_EQUAL(posRange.out(), 0);
0625   
0626   // Prob laying inside of interval should be 0.666
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   // Prob laying inside of interval should be 0.333
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   // Check for whole interval 
0644   LongBinCheck zero2two(0, 2);
0645   // Check for flat distribution
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   // Prob laying inside of interval should be 1
0657   BOOST_CHECK_EQUAL(zero2two.tot(), N);
0658   BOOST_CHECK_EQUAL(zero2two.in(), N);
0659   BOOST_CHECK_EQUAL(zero2two.out(), 0);
0660   
0661   // Prob laying inside of interval should be 0.4 / 0.9
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   // Prob laying inside of interval should be 0.2 / 0.9
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   // Prob laying inside of interval should be 0.3 / 0.9
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   // Check for whole interval 
0685   LongBinCheck bin_03(0, 3);
0686   // Check for flat distribution
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   // Prob laying inside of interval should be 1
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   // Prob laying inside of interval should be 0.4 / 1.4
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   // Prob laying inside of interval should be 0.2 / 1.4
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   // Prob laying inside of interval should be 0.3 / 1.4
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   // Prob laying inside of interval should be 0.5 / 1.4
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   // Check for whole interval 
0729   DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0730   // Check for median
0731   DoubleBinCheck firstHalf(-DBL_MAX, log(2));
0732   DoubleBinCheck secondHalf(log(2), DBL_MAX);
0733   // Check for increasing probability
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   // Prob laying inside of interval should be 1
0745   BOOST_CHECK_EQUAL(allnums.tot(), N);
0746   BOOST_CHECK_EQUAL(allnums.in(), N);
0747   BOOST_CHECK_EQUAL(allnums.out(), 0);
0748   
0749   // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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   // Increasing probability
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   // Check for whole interval 
0768   DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0769   // Check for median
0770   DoubleBinCheck firstHalf(-DBL_MAX, log(2) * meanValue);
0771   DoubleBinCheck secondHalf(log(2) * meanValue, DBL_MAX);
0772   // Check for increasing probability
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   // Prob laying inside of interval should be 1
0784   BOOST_CHECK_EQUAL(allnums.tot(), N);
0785   BOOST_CHECK_EQUAL(allnums.in(), N);
0786   BOOST_CHECK_EQUAL(allnums.out(), 0);
0787   
0788   // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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   // Increasing probability
0799   BOOST_CHECK(neg1000.in() <= pos1000.in());  
0800 }
0801 
0802 BOOST_AUTO_TEST_CASE(rndGauss)
0803 {
0804   int N = 1000;
0805   
0806   // Check for whole interval 
0807   DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0808   // Check for median
0809   DoubleBinCheck firstHalf(-DBL_MAX, 0);
0810   DoubleBinCheck secondHalf(0, DBL_MAX);
0811   // Check for increasing probability
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   // Prob laying inside of interval should be 1
0826   BOOST_CHECK_EQUAL(allnums.tot(), N);
0827   BOOST_CHECK_EQUAL(allnums.in(), N);
0828   BOOST_CHECK_EQUAL(allnums.out(), 0);
0829   
0830   // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.68
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   // Prob laying inside of interval should be 99,730 0204%
0846   BOOST_CHECK_EQUAL(threeSigma.tot(), N);
0847   BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * N, 15);
0848 
0849   // Prob laying inside of interval should be  99,999 999 999 %
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       // Check for whole interval 
0861       DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0862       // Check for median
0863       DoubleBinCheck firstHalf(-DBL_MAX, mean);
0864       DoubleBinCheck secondHalf(mean, DBL_MAX);
0865       // Check for increasing probability
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       // Prob laying inside of interval should be 1
0880       BOOST_CHECK_EQUAL(allnums.tot(), N);
0881       BOOST_CHECK_EQUAL(allnums.in(), N);
0882       BOOST_CHECK_EQUAL(allnums.out(), 0);
0883       
0884       // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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         // Prob laying inside of interval should be 0.68
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       // Prob laying inside of interval should be 99,730 0204%
0900       BOOST_CHECK_EQUAL(threeSigma.tot(), N);
0901       BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * N, 15);
0902   
0903       // Prob laying inside of interval should be  99,999 999 999 %
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   // Check for whole interval 
0916   DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0917   // Check for median
0918   DoubleBinCheck firstHalf(-DBL_MAX, 0);
0919   DoubleBinCheck secondHalf(0, DBL_MAX);
0920   // Check for increasing probability
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   // Two random numbers were added in each round
0945   N *= 2;
0946   // Prob laying inside of interval should be 1
0947   BOOST_CHECK_EQUAL(allnums.tot(), N);
0948   BOOST_CHECK_EQUAL(allnums.in(), N);
0949   BOOST_CHECK_EQUAL(allnums.out(), 0);
0950   
0951   // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.68
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   // Prob laying inside of interval should be 99,730 0204%
0967   BOOST_CHECK_EQUAL(threeSigma.tot(), N);
0968   BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * N, 15);
0969 
0970   // Prob laying inside of interval should be  99,999 999 999 %
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   // Two random numbers will be added in each round
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       // Check for whole interval 
0985       DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
0986       // Check for median
0987       DoubleBinCheck firstHalf(-DBL_MAX, mean);
0988       DoubleBinCheck secondHalf(mean, DBL_MAX);
0989       // Check for increasing probability
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       // Prob laying inside of interval should be 1
1013       BOOST_CHECK_EQUAL(allnums.tot(), NTwo);
1014       BOOST_CHECK_EQUAL(allnums.in(), NTwo);
1015       BOOST_CHECK_EQUAL(allnums.out(), 0);
1016       
1017       // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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         // Prob laying inside of interval should be 0.68
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       // Prob laying inside of interval should be 99,730 0204%
1033       BOOST_CHECK_EQUAL(threeSigma.tot(), NTwo);
1034       BOOST_CHECK_CLOSE(threeSigma.in(), 0.99730 * NTwo, 15);
1035   
1036       // Prob laying inside of interval should be  99,999 999 999 %
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     // Check for whole interval 
1049     LongBinCheck zero2max(0, LONG_MAX);
1050     // Check for median
1051     LongBinCheck zero(0, mean);
1052     LongBinCheck secondHalf(mean, LONG_MAX);
1053     // Check for decreasing probability away from mean
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     // Prob laying inside of interval should be 1
1066     BOOST_CHECK_EQUAL(zero2max.tot(), N);
1067     BOOST_CHECK_EQUAL(zero2max.in(), N);
1068     BOOST_CHECK_EQUAL(zero2max.out(), 0);
1069     
1070     // Prob laying inside of interval should be 0.5
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       // Prob laying inside of interval should be 0.5
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     // Prob should decrease away from mean
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       // Check for whole interval 
1092       DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1093       // Check for median
1094       DoubleBinCheck firstHalf(-DBL_MAX, mean);
1095       DoubleBinCheck secondHalf(mean, DBL_MAX);
1096       // Check for decreasing probability away from mean
1097       DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1098       DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1099       // Additional check for symmetry
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       // Prob laying inside of interval should be 1
1112       BOOST_CHECK_EQUAL(allnums.tot(), N);
1113       BOOST_CHECK_EQUAL(allnums.in(), N);
1114       BOOST_CHECK_EQUAL(allnums.out(), 0);
1115       
1116       // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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       // Prob should decrease away from mean
1127       BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1128       
1129       // Prob should be roughly symmetric with a shift to the left or right
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       // Check for whole interval 
1143       DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1144       // Check for cut interval 
1145       DoubleBinCheck inCut(mean - cutValue, mean + cutValue);
1146       // Check for median
1147       DoubleBinCheck firstHalf(-DBL_MAX, mean);
1148       DoubleBinCheck secondHalf(mean, DBL_MAX);
1149       // Check for decreasing probability away from mean
1150       DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1151       DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1152       // Additional check for symmetry
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       // Prob laying inside of interval should be 1
1166       BOOST_CHECK_EQUAL(allnums.tot(), N);
1167       BOOST_CHECK_EQUAL(allnums.in(), N);
1168       BOOST_CHECK_EQUAL(allnums.out(), 0);
1169       
1170       // Prob laying inside of interval should be 1
1171       BOOST_CHECK_EQUAL(inCut.tot(), N);
1172       BOOST_CHECK_EQUAL(inCut.in(), N);
1173       BOOST_CHECK_EQUAL(inCut.out(), 0);
1174       
1175       // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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       // Prob should decrease away from mean
1186       BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1187       
1188       // Prob should be roughly symmetric with a shift to the left or right
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       // Check for whole interval 
1201       DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1202       // Check for median
1203       DoubleBinCheck firstHalf(-DBL_MAX, mean);
1204       DoubleBinCheck secondHalf(mean, DBL_MAX);
1205       // Check for decreasing probability away from mean
1206       DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1207       DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1208       // Additional check for symmetry
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       // Prob laying inside of interval should be 1
1221       BOOST_CHECK_EQUAL(allnums.tot(), N);
1222       BOOST_CHECK_EQUAL(allnums.in(), N);
1223       BOOST_CHECK_EQUAL(allnums.out(), 0);
1224       
1225       // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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       // Prob should decrease away from mean
1236       BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1237       
1238       // Prob should be roughly symmetric with a shift to the left or right
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       // Check for whole interval 
1252       DoubleBinCheck allnums(-DBL_MAX, DBL_MAX);
1253       // Check for cut interval 
1254       DoubleBinCheck inCut(mean - cutValue, mean + cutValue);
1255       // Check for median
1256       DoubleBinCheck firstHalf(-DBL_MAX, mean);
1257       DoubleBinCheck secondHalf(mean, DBL_MAX);
1258       // Check for decreasing probability away from mean
1259       DoubleBinCheck nearMean(mean - std::sqrt(gamma), mean + std::sqrt(gamma));
1260       DoubleBinCheck awayMeanOne(mean + std::sqrt(gamma), mean + 3 * std::sqrt(gamma));
1261       // Additional check for symmetry
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       // Prob laying inside of interval should be 1
1275       BOOST_CHECK_EQUAL(allnums.tot(), N);
1276       BOOST_CHECK_EQUAL(allnums.in(), N);
1277       BOOST_CHECK_EQUAL(allnums.out(), 0);
1278       
1279       // Prob laying inside of interval should be 1
1280       BOOST_CHECK_EQUAL(inCut.tot(), N);
1281       BOOST_CHECK_EQUAL(inCut.in(), N);
1282       BOOST_CHECK_EQUAL(inCut.out(), 0);
1283       
1284       // Prob laying inside of interval should be 0.5
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     // Prob laying inside of interval should be 0.5
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       // Prob should decrease away from mean
1295       BOOST_CHECK(nearMean.in() > awayMeanOne.in());
1296       
1297       // Prob should be roughly symmetric with a shift to the left or right
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 /* ThePEG_Repository_Test_RandomGenerator_H */