15 #include "absl/random/internal/chi_square.h"
24 #include "gtest/gtest.h"
25 #include "absl/base/macros.h"
42 {__LINE__, 0, 0, 0.01},
43 {__LINE__, 0.00016, 1, 0.01},
44 {__LINE__, 1.64650, 8, 0.01},
45 {__LINE__, 5.81221, 16, 0.01},
46 {__LINE__, 156.4319, 200, 0.01},
47 {__LINE__, 1121.3784, 1234, 0.01},
48 {__LINE__, 53557.1629, 54321, 0.01},
49 {__LINE__, 651662.6647, 654321, 0.01},
52 {__LINE__, 0, 0, 0.99},
53 {__LINE__, 6.635, 1, 0.99},
54 {__LINE__, 20.090, 8, 0.99},
55 {__LINE__, 32.000, 16, 0.99},
56 {__LINE__, 249.4456, 200, 0.99},
57 {__LINE__, 1131.1573, 1023, 0.99},
58 {__LINE__, 1352.5038, 1234, 0.99},
59 {__LINE__, 55090.7356, 54321, 0.99},
60 {__LINE__, 656985.1514, 654321, 0.99},
63 {__LINE__, 16.2659, 3, 0.999},
64 {__LINE__, 22.4580, 6, 0.999},
65 {__LINE__, 267.5409, 200, 0.999},
66 {__LINE__, 1168.5033, 1023, 0.999},
67 {__LINE__, 55345.1741, 54321, 0.999},
68 {__LINE__, 657861.7284, 654321, 0.999},
69 {__LINE__, 51.1772, 24, 0.999},
70 {__LINE__, 59.7003, 30, 0.999},
71 {__LINE__, 37.6984, 15, 0.999},
72 {__LINE__, 29.5898, 10, 0.999},
73 {__LINE__, 27.8776, 9, 0.999},
76 {__LINE__, 0.000157088, 1, 0.01},
77 {__LINE__, 5.31852, 2, 0.93},
78 {__LINE__, 1.92256, 4, 0.25},
79 {__LINE__, 10.7709, 13, 0.37},
80 {__LINE__, 26.2514, 17, 0.93},
81 {__LINE__, 36.4799, 29, 0.84},
82 {__LINE__, 25.818, 31, 0.27},
83 {__LINE__, 63.3346, 64, 0.50},
84 {__LINE__, 196.211, 128, 0.9999},
85 {__LINE__, 215.21, 243, 0.10},
86 {__LINE__, 285.393, 256, 0.90},
87 {__LINE__, 984.504, 1024, 0.1923},
88 {__LINE__, 2043.85, 2048, 0.4783},
89 {__LINE__, 48004.6, 48273, 0.194},
91 for (
const auto&
spec : specs) {
113 TEST(ChiSquareTest, PValue) {
119 }
static const specs[] = {
121 {__LINE__, 0, 0.001, 0},
122 {__LINE__, 1.000, 0, 453},
123 {__LINE__, 0.134471, 7972.52, 7834},
124 {__LINE__, 0.203922, 28.32, 23},
125 {__LINE__, 0.737171, 48274, 48472},
126 {__LINE__, 0.444146, 583.1234, 579},
127 {__LINE__, 0.294814, 138.2, 130},
128 {__LINE__, 0.0816532, 12.63, 7},
129 {__LINE__, 0, 682.32, 67},
130 {__LINE__, 0.49405, 999, 999},
131 {__LINE__, 1.000, 0, 9999},
132 {__LINE__, 0.997477, 0.00001, 1},
133 {__LINE__, 0, 5823.21, 5040},
135 for (
const auto&
spec : specs) {
142 TEST(ChiSquareTest, CalcChiSquare) {
145 std::vector<int> expected;
146 std::vector<int> actual;
149 {56, 234, 76, 1, 546, 1, 87, 345, 1, 234},
150 {2, 132, 4, 43, 234, 8, 345, 8, 236, 56}},
152 {123, 36, 234, 367, 345, 2, 456, 567, 234, 567},
153 {123, 56, 2345, 8, 345, 8, 2345, 23, 48, 267}},
155 {123, 234, 345, 456, 567, 678, 789, 890, 98, 76},
156 {123, 234, 345, 456, 567, 678, 789, 890, 98, 76}},
157 {__LINE__, {3, 675, 23, 86, 2, 8, 2}, {456, 675, 23, 86, 23, 65, 2}},
158 {__LINE__, {1}, {23}},
160 for (
const auto&
spec : specs) {
162 double chi_square = 0;
163 for (
int i = 0;
i <
spec.expected.size(); ++
i) {
174 TEST(ChiSquareTest, CalcChiSquareInt64) {
175 const int64_t data[3] = {910293487, 910292491, 910216780};
190 TEST(ChiSquareTest, TableData) {
194 const double data[100][5] = {
195 {2.706, 3.841, 5.024, 6.635, 10.828},
196 {4.605, 5.991, 7.378, 9.210, 13.816},
197 {6.251, 7.815, 9.348, 11.345, 16.266},
198 {7.779, 9.488, 11.143, 13.277, 18.467},
199 {9.236, 11.070, 12.833, 15.086, 20.515},
200 {10.645, 12.592, 14.449, 16.812, 22.458},
201 {12.017, 14.067, 16.013, 18.475, 24.322},
202 {13.362, 15.507, 17.535, 20.090, 26.125},
203 {14.684, 16.919, 19.023, 21.666, 27.877},
204 {15.987, 18.307, 20.483, 23.209, 29.588},
205 {17.275, 19.675, 21.920, 24.725, 31.264},
206 {18.549, 21.026, 23.337, 26.217, 32.910},
207 {19.812, 22.362, 24.736, 27.688, 34.528},
208 {21.064, 23.685, 26.119, 29.141, 36.123},
209 {22.307, 24.996, 27.488, 30.578, 37.697},
210 {23.542, 26.296, 28.845, 32.000, 39.252},
211 {24.769, 27.587, 30.191, 33.409, 40.790},
212 {25.989, 28.869, 31.526, 34.805, 42.312},
213 {27.204, 30.144, 32.852, 36.191, 43.820},
214 {28.412, 31.410, 34.170, 37.566, 45.315},
215 {29.615, 32.671, 35.479, 38.932, 46.797},
216 {30.813, 33.924, 36.781, 40.289, 48.268},
217 {32.007, 35.172, 38.076, 41.638, 49.728},
218 {33.196, 36.415, 39.364, 42.980, 51.179},
219 {34.382, 37.652, 40.646, 44.314, 52.620},
220 {35.563, 38.885, 41.923, 45.642, 54.052},
221 {36.741, 40.113, 43.195, 46.963, 55.476},
222 {37.916, 41.337, 44.461, 48.278, 56.892},
223 {39.087, 42.557, 45.722, 49.588, 58.301},
224 {40.256, 43.773, 46.979, 50.892, 59.703},
225 {41.422, 44.985, 48.232, 52.191, 61.098},
226 {42.585, 46.194, 49.480, 53.486, 62.487},
227 {43.745, 47.400, 50.725, 54.776, 63.870},
228 {44.903, 48.602, 51.966, 56.061, 65.247},
229 {46.059, 49.802, 53.203, 57.342, 66.619},
230 {47.212, 50.998, 54.437, 58.619, 67.985},
231 {48.363, 52.192, 55.668, 59.893, 69.347},
232 {49.513, 53.384, 56.896, 61.162, 70.703},
233 {50.660, 54.572, 58.120, 62.428, 72.055},
234 {51.805, 55.758, 59.342, 63.691, 73.402},
235 {52.949, 56.942, 60.561, 64.950, 74.745},
236 {54.090, 58.124, 61.777, 66.206, 76.084},
237 {55.230, 59.304, 62.990, 67.459, 77.419},
238 {56.369, 60.481, 64.201, 68.710, 78.750},
239 {57.505, 61.656, 65.410, 69.957, 80.077},
240 {58.641, 62.830, 66.617, 71.201, 81.400},
241 {59.774, 64.001, 67.821, 72.443, 82.720},
242 {60.907, 65.171, 69.023, 73.683, 84.037},
243 {62.038, 66.339, 70.222, 74.919, 85.351},
244 {63.167, 67.505, 71.420, 76.154, 86.661},
245 {64.295, 68.669, 72.616, 77.386, 87.968},
246 {65.422, 69.832, 73.810, 78.616, 89.272},
247 {66.548, 70.993, 75.002, 79.843, 90.573},
248 {67.673, 72.153, 76.192, 81.069, 91.872},
249 {68.796, 73.311, 77.380, 82.292, 93.168},
250 {69.919, 74.468, 78.567, 83.513, 94.461},
251 {71.040, 75.624, 79.752, 84.733, 95.751},
252 {72.160, 76.778, 80.936, 85.950, 97.039},
253 {73.279, 77.931, 82.117, 87.166, 98.324},
254 {74.397, 79.082, 83.298, 88.379, 99.607},
255 {75.514, 80.232, 84.476, 89.591, 100.888},
256 {76.630, 81.381, 85.654, 90.802, 102.166},
257 {77.745, 82.529, 86.830, 92.010, 103.442},
258 {78.860, 83.675, 88.004, 93.217, 104.716},
259 {79.973, 84.821, 89.177, 94.422, 105.988},
260 {81.085, 85.965, 90.349, 95.626, 107.258},
261 {82.197, 87.108, 91.519, 96.828, 108.526},
262 {83.308, 88.250, 92.689, 98.028, 109.791},
263 {84.418, 89.391, 93.856, 99.228, 111.055},
264 {85.527, 90.531, 95.023, 100.425, 112.317},
265 {86.635, 91.670, 96.189, 101.621, 113.577},
266 {87.743, 92.808, 97.353, 102.816, 114.835},
267 {88.850, 93.945, 98.516, 104.010, 116.092},
268 {89.956, 95.081, 99.678, 105.202, 117.346},
269 {91.061, 96.217, 100.839, 106.393, 118.599},
270 {92.166, 97.351, 101.999, 107.583, 119.850},
271 {93.270, 98.484, 103.158, 108.771, 121.100},
272 {94.374, 99.617, 104.316, 109.958, 122.348},
273 {95.476, 100.749, 105.473, 111.144, 123.594},
274 {96.578, 101.879, 106.629, 112.329, 124.839},
275 {97.680, 103.010, 107.783, 113.512, 126.083},
276 {98.780, 104.139, 108.937, 114.695, 127.324},
277 {99.880, 105.267, 110.090, 115.876, 128.565},
278 {100.980, 106.395, 111.242, 117.057, 129.804},
279 {102.079, 107.522, 112.393, 118.236, 131.041},
280 {103.177, 108.648, 113.544, 119.414, 132.277},
281 {104.275, 109.773, 114.693, 120.591, 133.512},
282 {105.372, 110.898, 115.841, 121.767, 134.746},
283 {106.469, 112.022, 116.989, 122.942, 135.978},
284 {107.565, 113.145, 118.136, 124.116, 137.208},
285 {108.661, 114.268, 119.282, 125.289, 138.438},
286 {109.756, 115.390, 120.427, 126.462, 139.666},
287 {110.850, 116.511, 121.571, 127.633, 140.893},
288 {111.944, 117.632, 122.715, 128.803, 142.119},
289 {113.038, 118.752, 123.858, 129.973, 143.344},
290 {114.131, 119.871, 125.000, 131.141, 144.567},
291 {115.223, 120.990, 126.141, 132.309, 145.789},
292 {116.315, 122.108, 127.282, 133.476, 147.010},
293 {117.407, 123.225, 128.422, 134.642, 148.230},
294 {118.498, 124.342, 129.561, 135.807, 149.449}
299 const double E = 0.0001;
301 <<
i <<
" " <<
data[
i][0];
303 <<
i <<
" " <<
data[
i][1];
305 <<
i <<
" " <<
data[
i][2];
307 <<
i <<
" " <<
data[
i][3];
309 <<
i <<
" " <<
data[
i][4];
311 const double F = 0.1;
320 TEST(ChiSquareTest, ChiSquareTwoIterator) {
323 const int counts[10] = {6, 6, 18, 33, 38, 38, 28, 21, 9, 3};
324 const double expected[10] = {4.6, 8.8, 18.4, 30.0, 38.2,
325 38.2, 30.0, 18.4, 8.8, 4.6};
340 TEST(ChiSquareTest, DiceRolls) {
346 const int rolls[6] = {22, 11, 17, 14, 20, 18};