Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/RNGTest/SmallCrush.cpp
4 : : \copyright 2012-2015 J. Bakosi,
5 : : 2016-2018 Los Alamos National Security, LLC.,
6 : : 2019-2021 Triad National Security, LLC.
7 : : All rights reserved. See the LICENSE file for details.
8 : : \brief Class re-creating the TestU01 library's SmallCrush battery
9 : : \details Class re-creating the TestU01 library's SmallCrush battery.
10 : : */
11 : : // *****************************************************************************
12 : :
13 : : #include "NoWarning/charm.hpp"
14 : : #include "NoWarning/pup_stl.hpp"
15 : : #include "NoWarning/pup.hpp"
16 : :
17 : : extern "C" {
18 : : #include <gdef.h>
19 : : #include <gofw.h>
20 : : #include <sknuth.h>
21 : : #include <sres.h>
22 : : #include <sstring.h>
23 : : #include <swalk.h>
24 : : }
25 : :
26 : : #include "Tags.hpp"
27 : : #include "PUPUtil.hpp"
28 : : #include "TestU01.hpp"
29 : : #include "StatTest.hpp"
30 : : #include "TestStack.hpp"
31 : : #include "TestU01Props.hpp"
32 : : #include "TestU01Stack.hpp"
33 : : #include "SmallCrush.hpp"
34 : :
35 : : namespace rngtest {
36 : :
37 : : extern TestStack g_testStack;
38 : :
39 : : } // rngtest::
40 : :
41 : : using rngtest::SmallCrush;
42 : :
43 : : void
44 : 12 : SmallCrush::addTests( std::vector< std::function< StatTest() > >& tests,
45 : : tk::ctr::RNGType rng,
46 : : CProxy_TestU01Suite& proxy )
47 : : // *****************************************************************************
48 : : // Add statistical tests to battery
49 : : //! \details This function adds, i.e., registers, all statistical tests to the
50 : : //! test stack corresponding to the TestU01 library's SmallCrush battery.
51 : : //! \param[in] tests Vector of test constructors to add tests to
52 : : //! \param[in] rng RNG ID enum associated with the RNG to be tested
53 : : //! \param[in] proxy Charm++ host proxy to which the tests will call back to
54 : : // *****************************************************************************
55 : : {
56 : : // Select test stack
57 : : const auto& stack = g_testStack.TestU01;
58 : :
59 : : // Find RNG
60 : 12 : auto gen = stack.generator(rng);
61 : :
62 : : static const long THOUSAND = 1000;
63 : : static const long MILLION = THOUSAND * THOUSAND;
64 : :
65 : : // Marsaglia's BirthdaySpacings
66 : : #ifdef USE_LONGLONG
67 : : stack.add< TestU01< TestU01Props< tag::BirthdaySpacings, CProxy_TestU01Suite,
68 : : sres_Poisson, sres_CreatePoisson,
69 : : sres_DeletePoisson,
70 : : long, long, int, long, int, int > > >
71 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Birthday Spacings"},
72 [ + - ][ + + ]: 36 : 1L, 5L * MILLION, 0, 1073741824L, 2, 1 );
[ + - ][ - - ]
[ - - ]
73 : : #else
74 : : stack.add< TestU01< TestU01Props< tag::birthdayspacings, CProxy_TestU01Suite,
75 : : sres_poisson, sres_createpoisson,
76 : : sres_deletepoisson,
77 : : long, long, int, long, int, int > > >
78 : : ( proxy, tests, rng, gen, {"birthday spacings"},
79 : : 10l, million / 2, 0, 67108864l, 2, 1 );
80 : : #endif
81 : :
82 : : // Knuth's Collision
83 : : stack.add< TestU01< TestU01Props< tag::Collision, CProxy_TestU01Suite,
84 : : sknuth_Res2, sknuth_CreateRes2,
85 : : sknuth_DeleteRes2,
86 : : long, long, int, long, int > > >
87 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Collision"},
88 [ + - ][ + + ]: 36 : 1L, 5L * MILLION, 0, 65536L, 2 );
[ - + ][ - - ]
[ - - ]
89 : :
90 : : // Knuth's Gap
91 : : stack.add< TestU01< TestU01Props< tag::Gap, CProxy_TestU01Suite,
92 : : sres_Chi2, sres_CreateChi2,
93 : : sres_DeleteChi2,
94 : : long, long, int, double, double > > >
95 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Gap"},
96 [ + - ][ + + ]: 36 : 1L, MILLION / 5, 22, 0.0, 0.00390625 );
[ - + ][ - - ]
[ - - ]
97 : :
98 : : // Knuth's Simple Poker
99 : : stack.add< TestU01< TestU01Props< tag::SimplePoker, CProxy_TestU01Suite,
100 : : sres_Chi2, sres_CreateChi2,
101 : : sres_DeleteChi2,
102 : : long, long, int, int, int > > >
103 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Simplified Poker"},
104 [ + - ][ + + ]: 36 : 1L, 2L * MILLION / 5, 24, 64, 64 );
[ + - ][ - - ]
[ - - ]
105 : :
106 : : // Knuth's Coupon Collector
107 : : stack.add< TestU01< TestU01Props< tag::CouponCollector, CProxy_TestU01Suite,
108 : : sres_Chi2, sres_CreateChi2,
109 : : sres_DeleteChi2,
110 : : long, long, int, int > > >
111 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Coupon Collector"},
112 [ + - ][ + + ]: 36 : 1L, MILLION / 2, 26, 16 );
[ + - ][ - - ]
[ - - ]
113 : :
114 : : // Knuth's Maximum-of-t
115 : : stack.add< TestU01< TestU01Props< tag::MaxOft, CProxy_TestU01Suite,
116 : : sknuth_Res1, sknuth_CreateRes1,
117 : : sknuth_DeleteRes1,
118 : : long, long, int, int, int, int, int > > >
119 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Maximum-of-t",
120 : : "Maximum-of-t Anderson-Darling"},
121 : 24 : 1L, 2L * MILLION, 0, static_cast<int>(MILLION / 10), 6, gofw_Mean,
122 [ + - ][ + + ]: 48 : gofw_Mean );
[ + + ][ - - ]
[ - - ]
123 : :
124 : : // Weight Distribution
125 : : stack.add< TestU01< TestU01Props< tag::WeightDistrib, CProxy_TestU01Suite,
126 : : sres_Chi2, sres_CreateChi2,
127 : : sres_DeleteChi2,
128 : : long, long, int, long, double, double > > >
129 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Weight Distribution"},
130 [ + - ][ + + ]: 36 : 1L, MILLION / 5, 27, 256L, 0.0, 0.125 );
[ + - ][ - - ]
[ - - ]
131 : :
132 : : // Marsaglia's Matrix Rank
133 : : stack.add< TestU01< TestU01Props< tag::MatrixRank, CProxy_TestU01Suite,
134 : : sres_Chi2, sres_CreateChi2,
135 : : sres_DeleteChi2,
136 : : long, long, int, int, int, int > > >
137 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Matrix Rank"},
138 [ + - ][ + + ]: 36 : 1L, 20L * THOUSAND, 20, 10, 60, 60 );
[ - + ][ - - ]
[ - - ]
139 : :
140 : : // Hamming independence
141 : : stack.add< TestU01< TestU01Props< tag::HammingIndep, CProxy_TestU01Suite,
142 : : sstring_Res, sstring_CreateRes,
143 : : sstring_DeleteRes,
144 : : long, long, int, int, int, int > > >
145 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Hamming Independence"},
146 [ + - ][ + + ]: 36 : 1L, MILLION/2, 20, 10, 300, 0 );
[ + - ][ - - ]
[ - - ]
147 : :
148 : : // Random Walk 1
149 : : stack.add< TestU01< TestU01Props< tag::RandomWalk1, CProxy_TestU01Suite,
150 : : swalk_Res, swalk_CreateRes,
151 : : swalk_DeleteRes,
152 : : long, long, int, int, long, long > > >
153 [ + - ]: 12 : ( proxy, tests, rng, gen, {"Random Walk 1 Stat H",
154 : : "Random Walk 1 Stat M",
155 : : "Random Walk 1 Stat J",
156 : : "Random Walk 1 Stat R",
157 : : "Random Walk 1 Stat C"},
158 [ + - ][ + + ]: 84 : 1L, static_cast<long>(MILLION), 0, 30, 150L, 150L );
[ + - ][ - - ]
[ - - ]
159 : 12 : }
|