1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.rng.sampling.distribution;
18
19 import java.util.Arrays;
20 import java.util.List;
21 import java.util.ArrayList;
22
23 import org.junit.Assert;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.junit.runners.Parameterized;
27 import org.junit.runners.Parameterized.Parameters;
28
29
30
31
32 @RunWith(value=Parameterized.class)
33 public class ContinuousSamplerParametricTest {
34
35 private final ContinuousSamplerTestData sampler;
36
37
38
39
40
41
42 public ContinuousSamplerParametricTest(ContinuousSamplerTestData data) {
43 sampler = data;
44 }
45
46 @Parameters(name = "{index}: data={0}")
47 public static Iterable<ContinuousSamplerTestData[]> getList() {
48 return ContinuousSamplersList.list();
49 }
50
51 @Test
52 public void testSampling() {
53 check(20000, sampler.getSampler(), sampler.getDeciles());
54 }
55
56
57
58
59
60
61
62
63
64
65
66 private void check(long sampleSize,
67 ContinuousSampler sampler,
68 double[] deciles) {
69 final int numTests = 50;
70
71
72 final int numBins = 10;
73
74
75 int numFailures = 0;
76
77 final double[] expected = new double[numBins];
78 for (int k = 0; k < numBins; k++) {
79 expected[k] = sampleSize / (double) numBins;
80 }
81
82 final long[] observed = new long[numBins];
83
84
85 final double chi2CriticalValue = 21.67;
86
87
88 final List<Double> failedStat = new ArrayList<Double>();
89 try {
90 final int lastDecileIndex = numBins - 1;
91 for (int i = 0; i < numTests; i++) {
92 Arrays.fill(observed, 0);
93 SAMPLE: for (long j = 0; j < sampleSize; j++) {
94 final double value = sampler.sample();
95
96 for (int k = 0; k < lastDecileIndex; k++) {
97 if (value < deciles[k]) {
98 ++observed[k];
99 continue SAMPLE;
100 }
101 }
102 ++observed[lastDecileIndex];
103 }
104
105
106 double chi2 = 0;
107 for (int k = 0; k < numBins; k++) {
108 final double diff = observed[k] - expected[k];
109 chi2 += diff * diff / expected[k];
110
111
112
113 }
114
115
116 if (chi2 > chi2CriticalValue) {
117 failedStat.add(chi2);
118 ++numFailures;
119 }
120 }
121 } catch (Exception e) {
122
123 throw new RuntimeException("Unexpected", e);
124 }
125
126 if ((double) numFailures / (double) numTests > 0.05) {
127 Assert.fail(sampler + ": Too many failures for sample size = " + sampleSize +
128 " (" + numFailures + " out of " + numTests + " tests failed, " +
129 "chi2=" + Arrays.toString(failedStat.toArray(new Double[0])) + ")");
130 }
131 }
132 }