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