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 org.apache.commons.rng.UniformRandomProvider;
20 import org.apache.commons.rng.sampling.RandomAssert;
21 import org.apache.commons.rng.simple.RandomSource;
22 import org.junit.Assert;
23 import org.junit.Test;
24
25
26
27
28 public class GeometricSamplerTest {
29
30
31
32
33 @Test
34 public void testProbabilityOfSuccessIsOneGeneratesZeroForSamples() {
35 final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64);
36 final SharedStateDiscreteSampler sampler = GeometricSampler.of(rng, 1);
37
38 for (int i = 0; i < 10; i++) {
39 Assert.assertEquals("p=1 should have 0 for all samples", 0, sampler.sample());
40 }
41 }
42
43
44
45
46
47 @Test
48 public void testProbabilityOfSuccessUnderOneIsValid() {
49
50
51 final double probabilityOfSuccess = Math.nextAfter(1, -1);
52
53 final double exponentialMean = 1.0 / (-Math.log1p(-probabilityOfSuccess));
54
55 Assert.assertTrue(exponentialMean > 0 && exponentialMean <= Double.MAX_VALUE);
56
57
58 final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64);
59 GeometricSampler.of(rng, probabilityOfSuccess);
60 }
61
62
63
64
65
66 @Test
67 public void testProbabilityOfSuccessIsOneSamplerToString() {
68 final UniformRandomProvider unusedRng = RandomSource.create(RandomSource.SPLIT_MIX_64);
69 final SharedStateDiscreteSampler sampler = GeometricSampler.of(unusedRng, 1);
70 Assert.assertTrue("Missing 'Geometric' from toString",
71 sampler.toString().contains("Geometric"));
72 }
73
74
75
76
77
78
79
80
81
82
83 @Test
84 public void testProbabilityOfSuccessIsAlmostZeroGeneratesMaxValueForSamples() {
85 final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64);
86 final SharedStateDiscreteSampler sampler = GeometricSampler.of(rng, Double.MIN_VALUE);
87
88 for (int i = 0; i < 10; i++) {
89 Assert.assertEquals("p=(almost 0) should have Integer.MAX_VALUE for all samples",
90 Integer.MAX_VALUE, sampler.sample());
91 }
92 }
93
94
95
96
97 @Test(expected = IllegalArgumentException.class)
98 public void testProbabilityOfSuccessAboveOneThrows() {
99 final UniformRandomProvider unusedRng = RandomSource.create(RandomSource.SPLIT_MIX_64);
100 final double probabilityOfSuccess = Math.nextUp(1.0);
101 GeometricSampler.of(unusedRng, probabilityOfSuccess);
102 }
103
104
105
106
107 @Test(expected = IllegalArgumentException.class)
108 public void testProbabilityOfSuccessIsZeroThrows() {
109 final UniformRandomProvider unusedRng = RandomSource.create(RandomSource.SPLIT_MIX_64);
110 final double probabilityOfSuccess = 0;
111 GeometricSampler.of(unusedRng, probabilityOfSuccess);
112 }
113
114
115
116
117 @Test
118 public void testSharedStateSampler() {
119 testSharedStateSampler(0.5);
120 }
121
122
123
124
125
126 @Test
127 public void testSharedStateSamplerWithProbabilityOfSuccessOne() {
128 testSharedStateSampler(1.0);
129 }
130
131
132
133
134
135
136 private static void testSharedStateSampler(double probabilityOfSuccess) {
137 final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
138 final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
139 final SharedStateDiscreteSampler sampler1 =
140 GeometricSampler.of(rng1, probabilityOfSuccess);
141 final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
142 RandomAssert.assertProduceSameSequence(sampler1, sampler2);
143 }
144 }