You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2021/08/13 19:32:04 UTC
[commons-rng] 04/12: Use JDK 8 Double.isFinite and Math.nextUp/Down
This is an automated email from the ASF dual-hosted git repository.
aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-rng.git
commit d04082e8e1091fb3da0f892ad28576098ac20332
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Fri Aug 13 19:31:42 2021 +0100
Use JDK 8 Double.isFinite and Math.nextUp/Down
---
.../rng/sampling/distribution/GaussianSampler.java | 3 +-
.../sampling/distribution/PoissonSamplerCache.java | 2 +-
.../rng/sampling/distribution/StableSampler.java | 3 +-
.../commons/rng/sampling/shape/Coordinates.java | 13 +--
.../rng/sampling/UnitSphereSamplerTest.java | 2 +-
.../distribution/ContinuousUniformSamplerTest.java | 10 +--
.../distribution/GeometricSamplerTest.java | 2 +-
.../distribution/LargeMeanPoissonSamplerTest.java | 2 +-
.../MarsagliaTsangWangDiscreteSamplerTest.java | 4 +-
.../distribution/PoissonSamplerCacheTest.java | 18 ++--
.../sampling/distribution/StableSamplerTest.java | 98 +++++++---------------
11 files changed, 54 insertions(+), 103 deletions(-)
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java
index 38e0537..7601993 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java
@@ -54,8 +54,7 @@ public class GaussianSampler implements SharedStateContinuousSampler {
throw new IllegalArgumentException(
"standard deviation is not strictly positive and finite: " + standardDeviation);
}
- // To be replaced by JDK 1.8 Double.isFinite. This will detect NaN values.
- if (!(Math.abs(mean) <= Double.MAX_VALUE)) {
+ if (!Double.isFinite(mean)) {
throw new IllegalArgumentException("mean is not finite: " + mean);
}
this.normalized = normalized;
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java
index e935d2b..d918e7d 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java
@@ -301,7 +301,7 @@ public class PoissonSamplerCache {
*/
public double getMaxMean() {
if (isValidRange()) {
- return Math.nextAfter(maxN + 1.0, -1);
+ return Math.nextDown(maxN + 1.0);
}
return 0;
}
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/StableSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/StableSampler.java
index bbf6600..feb86ec 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/StableSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/StableSampler.java
@@ -1483,8 +1483,7 @@ public abstract class StableSampler implements SharedStateContinuousSampler {
if (!(0 < gamma && gamma <= Double.MAX_VALUE)) {
throw new IllegalArgumentException("gamma is not strictly positive and finite: " + gamma);
}
- // To be replaced by !Double.isFinite(double) from JDK 1.8.
- if (!(Math.abs(delta) <= Double.MAX_VALUE)) {
+ if (!Double.isFinite(delta)) {
throw new IllegalArgumentException("delta is not finite: " + delta);
}
}
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/Coordinates.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/Coordinates.java
index a1f1fc2..e9a73d9 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/Coordinates.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/Coordinates.java
@@ -45,7 +45,7 @@ final class Coordinates {
*/
static double[] requireFinite(double[] values, String message) {
for (final double value : values) {
- if (!isFinite(value)) {
+ if (!Double.isFinite(value)) {
throw new IllegalArgumentException(message + " contains non-finite value: " + value);
}
}
@@ -53,17 +53,6 @@ final class Coordinates {
}
/**
- * Checks if the value is finite.
- * To be replaced by {@code Double.isFinite(double)} when source requires Java 8.
- *
- * @param value the value
- * @return true if finite
- */
- private static boolean isFinite(double value) {
- return Math.abs(value) <= Double.MAX_VALUE;
- }
-
- /**
* Check that the values is the specified length. This method is primarily for
* parameter validation in methods and constructors, for example:
*
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/UnitSphereSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/UnitSphereSamplerTest.java
index 2a304e8..d731a98 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/UnitSphereSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/UnitSphereSamplerTest.java
@@ -443,7 +443,7 @@ public class UnitSphereSamplerTest {
public void testNextNormSquaredAfterZeroIsValid() {
// The sampler explicitly handles length == 0 using recursion.
// Anything above zero should be valid.
- final double normSq = Math.nextAfter(0.0, 1);
+ final double normSq = Math.nextUp(0.0);
// Map to the scaling factor
final double f = 1 / Math.sqrt(normSq);
// As long as this is finite positive then the sampler is valid
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java
index 76d56a4..9db2c6e 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java
@@ -105,10 +105,10 @@ public class ContinuousUniformSamplerTest {
{-Double.MIN_VALUE, Double.MIN_VALUE},
// Same signs. Requires one double inside the range.
// Same exponent
- {1.23, Math.nextAfter(1.23, Double.POSITIVE_INFINITY)},
- {1.23, Math.nextAfter(1.23, Double.NEGATIVE_INFINITY)},
+ {1.23, Math.nextUp(1.23)},
+ {1.23, Math.nextUp(1.23)},
// Different exponent
- {2.0, Math.nextAfter(2.0, Double.NEGATIVE_INFINITY)},
+ {2.0, Math.nextDown(2.0)},
}) {
final double low = interval[0];
final double high = interval[1];
@@ -145,8 +145,8 @@ public class ContinuousUniformSamplerTest {
for (final double expected : new double[] {
1.23, 2, 56787.7893, 3 * x, 2 * x, x
}) {
- final double low = Math.nextAfter(expected, Double.POSITIVE_INFINITY);
- final double high = Math.nextAfter(expected, Double.NEGATIVE_INFINITY);
+ final double low = Math.nextUp(expected);
+ final double high = Math.nextDown(expected);
Assert.assertEquals(expected, ContinuousUniformSampler.of(rng, low, high, true).sample(), 0.0);
Assert.assertEquals(expected, ContinuousUniformSampler.of(rng, high, low, true).sample(), 0.0);
Assert.assertEquals(-expected, ContinuousUniformSampler.of(rng, -low, -high, true).sample(), 0.0);
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java
index a04d841..53f0585 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java
@@ -48,7 +48,7 @@ public class GeometricSamplerTest {
public void testProbabilityOfSuccessUnderOneIsValid() {
// The sampler explicitly handles probabilityOfSuccess == 1 as an edge case.
// Anything under it should be valid for sampling from an ExponentialDistribution.
- final double probabilityOfSuccess = Math.nextAfter(1, -1);
+ final double probabilityOfSuccess = Math.nextDown(1);
// Map to the mean
final double exponentialMean = 1.0 / (-Math.log1p(-probabilityOfSuccess));
// As long as this is finite positive then the sampler is valid
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java
index c56ae8e..dbdfa6b 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java
@@ -51,7 +51,7 @@ public class LargeMeanPoissonSamplerTest {
public void testConstructorThrowsWithMeanBelow1() {
final RestorableUniformRandomProvider rng =
RandomSource.SPLIT_MIX_64.create(0L);
- final double mean = Math.nextAfter(1, -1);
+ final double mean = Math.nextDown(1);
LargeMeanPoissonSampler.of(rng, mean);
}
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java
index e2e2b9e..8e3573c 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java
@@ -467,7 +467,7 @@ public class MarsagliaTsangWangDiscreteSamplerTest {
// Validate set-up
Assert.assertEquals("Invalid test set-up for p(0)", Double.MIN_VALUE, getBinomialP0(trials, p), 0);
- // Search for larger p until Math.nextAfter(p, 1) produces 0
+ // Search for larger p until Math.nextUp(p) produces 0
double upper = p * 2;
Assert.assertEquals("Invalid test set-up for p(0)", 0, getBinomialP0(trials, upper), 0);
@@ -484,7 +484,7 @@ public class MarsagliaTsangWangDiscreteSamplerTest {
// Re-validate
Assert.assertEquals("Invalid test set-up for p(0)", Double.MIN_VALUE, getBinomialP0(trials, p), 0);
- Assert.assertEquals("Invalid test set-up for p(0)", 0, getBinomialP0(trials, Math.nextAfter(p, 1)), 0);
+ Assert.assertEquals("Invalid test set-up for p(0)", 0, getBinomialP0(trials, Math.nextUp(p)), 0);
final DiscreteSampler sampler = MarsagliaTsangWangDiscreteSampler.Binomial.of(rng, trials, p);
// This will throw if the table does not sum to 2^30
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java
index 7ce5c00..85490e9 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java
@@ -75,7 +75,7 @@ public class PoissonSamplerCacheTest {
final PoissonSamplerCache cache = createPoissonSamplerCache(min, max);
Assert.assertTrue(cache.isValidRange());
Assert.assertEquals(min, cache.getMinMean(), 0);
- Assert.assertEquals(Math.nextAfter(Math.floor(max) + 1, -1),
+ Assert.assertEquals(Math.nextDown(Math.floor(max) + 1),
cache.getMaxMean(), 0);
}
@@ -91,7 +91,7 @@ public class PoissonSamplerCacheTest {
final PoissonSamplerCache cache = createPoissonSamplerCache(min, max);
Assert.assertTrue(cache.isValidRange());
Assert.assertEquals(min, cache.getMinMean(), 0);
- Assert.assertEquals(Math.nextAfter(Math.floor(max) + 1, -1),
+ Assert.assertEquals(Math.nextDown(Math.floor(max) + 1),
cache.getMaxMean(), 0);
}
@@ -101,7 +101,7 @@ public class PoissonSamplerCacheTest {
@Test(expected = IllegalArgumentException.class)
public void testConstructorThrowsWhenMaxIsLessThanMin() {
final double min = PoissonSampler.PIVOT;
- final double max = Math.nextAfter(min, -1);
+ final double max = Math.nextDown(min);
createPoissonSamplerCache(min, max);
}
@@ -116,7 +116,7 @@ public class PoissonSamplerCacheTest {
final PoissonSamplerCache cache = createPoissonSamplerCache(min, max);
Assert.assertTrue(cache.isValidRange());
Assert.assertEquals(PoissonSampler.PIVOT, cache.getMinMean(), 0);
- Assert.assertEquals(Math.nextAfter(Math.floor(max) + 1, -1),
+ Assert.assertEquals(Math.nextDown(Math.floor(max) + 1),
cache.getMaxMean(), 0);
}
@@ -161,7 +161,7 @@ public class PoissonSamplerCacheTest {
final PoissonSamplerCache cache = createPoissonSamplerCache().withRange(min, max);
Assert.assertTrue(cache.isValidRange());
Assert.assertEquals(min, cache.getMinMean(), 0);
- Assert.assertEquals(Math.nextAfter(Math.floor(max) + 1, -1),
+ Assert.assertEquals(Math.nextDown(Math.floor(max) + 1),
cache.getMaxMean(), 0);
}
@@ -177,7 +177,7 @@ public class PoissonSamplerCacheTest {
final PoissonSamplerCache cache = createPoissonSamplerCache().withRange(min, max);
Assert.assertTrue(cache.isValidRange());
Assert.assertEquals(min, cache.getMinMean(), 0);
- Assert.assertEquals(Math.nextAfter(Math.floor(max) + 1, -1),
+ Assert.assertEquals(Math.nextDown(Math.floor(max) + 1),
cache.getMaxMean(), 0);
}
@@ -187,7 +187,7 @@ public class PoissonSamplerCacheTest {
@Test(expected = IllegalArgumentException.class)
public void testWithRangeConstructorThrowsWhenMaxIsLessThanMin() {
final double min = PoissonSampler.PIVOT;
- final double max = Math.nextAfter(min, -1);
+ final double max = Math.nextDown(min);
createPoissonSamplerCache().withRange(min, max);
}
@@ -202,7 +202,7 @@ public class PoissonSamplerCacheTest {
final PoissonSamplerCache cache = createPoissonSamplerCache().withRange(min, max);
Assert.assertTrue(cache.isValidRange());
Assert.assertEquals(PoissonSampler.PIVOT, cache.getMinMean(), 0);
- Assert.assertEquals(Math.nextAfter(Math.floor(max) + 1, -1),
+ Assert.assertEquals(Math.nextDown(Math.floor(max) + 1),
cache.getMaxMean(), 0);
}
@@ -216,7 +216,7 @@ public class PoissonSamplerCacheTest {
final PoissonSamplerCache cache = createPoissonSamplerCache(0, 0).withRange(min, max);
Assert.assertTrue(cache.isValidRange());
Assert.assertEquals(min, cache.getMinMean(), 0);
- Assert.assertEquals(Math.nextAfter(Math.floor(max) + 1, -1),
+ Assert.assertEquals(Math.nextDown(Math.floor(max) + 1),
cache.getMaxMean(), 0);
}
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/StableSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/StableSamplerTest.java
index f56dbc7..efe2c02 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/StableSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/StableSamplerTest.java
@@ -65,7 +65,7 @@ public class StableSamplerTest {
/** A largest sample from the ZigguratSampler.Exponential after 4 recursions of the sample method. */
private static final double LARGE_W = 4 * TAIL_W;
/** The smallest value for alpha where 1 - (1-alpha) = alpha. */
- private static final double SMALLEST_ALPHA = 1.0 - nextDown(1.0);
+ private static final double SMALLEST_ALPHA = 1.0 - Math.nextDown(1.0);
private static final double VALID_ALPHA = 1.23;
private static final double VALID_BETA = 0.23;
@@ -79,7 +79,7 @@ public class StableSamplerTest {
@Test(expected = IllegalArgumentException.class)
public void testAlphaBelowZeroThrows() {
- createStableSampler(nextDown(0.0), VALID_BETA, VALID_GAMMA, VALID_DELTA);
+ createStableSampler(Math.nextDown(0.0), VALID_BETA, VALID_GAMMA, VALID_DELTA);
}
@Test(expected = IllegalArgumentException.class)
@@ -101,7 +101,7 @@ public class StableSamplerTest {
@Test(expected = IllegalArgumentException.class)
public void testAlphaAboveTwoThrows() {
- createStableSampler(nextUp(2.0), VALID_BETA, VALID_GAMMA, VALID_DELTA);
+ createStableSampler(Math.nextUp(2.0), VALID_BETA, VALID_GAMMA, VALID_DELTA);
}
@Test(expected = IllegalArgumentException.class)
@@ -111,12 +111,12 @@ public class StableSamplerTest {
@Test(expected = IllegalArgumentException.class)
public void testBetaBelowMinusOneThrows() {
- createStableSampler(VALID_ALPHA, nextDown(-1.0), VALID_GAMMA, VALID_DELTA);
+ createStableSampler(VALID_ALPHA, Math.nextDown(-1.0), VALID_GAMMA, VALID_DELTA);
}
@Test(expected = IllegalArgumentException.class)
public void testBetaAboveOneThrows() {
- createStableSampler(VALID_ALPHA, nextUp(1.0), VALID_GAMMA, VALID_DELTA);
+ createStableSampler(VALID_ALPHA, Math.nextUp(1.0), VALID_GAMMA, VALID_DELTA);
}
@Test(expected = IllegalArgumentException.class)
@@ -224,15 +224,15 @@ public class StableSamplerTest {
Assert.assertEquals(-0.5, CMSStableSampler.getTau(0.5, -beta), 0.0);
// Check monototic at the transition point to switch to a different computation.
- final double tau1 = CMSStableSampler.getTau(nextDown(1.5), 1);
+ final double tau1 = CMSStableSampler.getTau(Math.nextDown(1.5), 1);
final double tau2 = CMSStableSampler.getTau(1.5, 1);
- final double tau3 = CMSStableSampler.getTau(nextUp(1.5), 1);
+ final double tau3 = CMSStableSampler.getTau(Math.nextUp(1.5), 1);
Assert.assertTrue(tau1 > tau2);
Assert.assertTrue(tau2 > tau3);
// Test symmetry at the transition
- Assert.assertEquals(tau1, CMSStableSampler.getTau(2 - nextDown(1.5), 1), 0.0);
+ Assert.assertEquals(tau1, CMSStableSampler.getTau(2 - Math.nextDown(1.5), 1), 0.0);
Assert.assertEquals(tau2, CMSStableSampler.getTau(0.5, 1), 0.0);
- Assert.assertEquals(tau3, CMSStableSampler.getTau(2 - nextUp(1.5), 1), 0.0);
+ Assert.assertEquals(tau3, CMSStableSampler.getTau(2 - Math.nextUp(1.5), 1), 0.0);
}
/**
@@ -292,7 +292,7 @@ public class StableSamplerTest {
// phiby2 in (-pi/4, pi/4)
// a in (-1, 1)
final double a = phiby2 * SpecialMath.tan2(phiby2);
- Assert.assertEquals(Math.copySign(nextDown(1.0), phiby2), a, 0.0);
+ Assert.assertEquals(Math.copySign(Math.nextDown(1.0), phiby2), a, 0.0);
final double da = a * a;
final double a2 = 1 - da;
// The number is close to but not equal to zero
@@ -388,8 +388,8 @@ public class StableSamplerTest {
Assert.assertEquals(0.0, computeNumerator(2, beta, x00), 0.0);
Assert.assertTrue(0.0 < computeNumerator(2, beta, x0));
Assert.assertTrue(0.0 < computeNumerator(2, beta, x1));
- Assert.assertTrue(0.0 < computeNumerator(nextDown(2), beta, x0));
- Assert.assertTrue(0.0 < computeNumerator(nextDown(2), beta, x1));
+ Assert.assertTrue(0.0 < computeNumerator(Math.nextDown(2), beta, x0));
+ Assert.assertTrue(0.0 < computeNumerator(Math.nextDown(2), beta, x1));
// alpha=1 case the numerator reduces to:
// 1 + 2 * phi/2 * tau
@@ -409,7 +409,7 @@ public class StableSamplerTest {
// beta < 1 => u < 0
// beta > -1 => u > 1
// z=0 not possible with any other beta
- Assert.assertTrue(0.0 < computeNumerator(alpha, nextUp(-1), x00));
+ Assert.assertTrue(0.0 < computeNumerator(alpha, Math.nextUp(-1), x00));
}
/**
@@ -539,7 +539,7 @@ public class StableSamplerTest {
final UniformRandomProvider rng = RandomSource.XO_SHI_RO_256_SS.create();
// The term is mirrored around 1 so use extremes between 1 and 0
- final double[] alphas = {1, nextDown(1), 0.99, 0.5, 0.1, 0.05, 0.01, DU};
+ final double[] alphas = {1, Math.nextDown(1), 0.99, 0.5, 0.1, 0.05, 0.01, DU};
// Longs to generate extremes for the angle phi. This is mirrored
// by negation is the assert method so use values to create phi in [0, pi/2).
final long[] xs = {0, 1 << 10, Long.MIN_VALUE >>> 1, Long.MAX_VALUE};
@@ -668,13 +668,13 @@ public class StableSamplerTest {
// Test monotonic at the switch point
Assert.assertEquals(d2(0.5), d2b(0.5), 0.0);
// When positive x -> 0 the value smaller bigger.
- Assert.assertTrue(d2(nextDown(0.5)) <= d2b(0.5));
+ Assert.assertTrue(d2(Math.nextDown(0.5)) <= d2b(0.5));
Assert.assertEquals(d2(-0.5), d2b(-0.5), 0.0);
// When negative x -> 0 the value gets bigger.
- Assert.assertTrue(d2(-nextDown(0.5)) >= d2b(-0.5));
+ Assert.assertTrue(d2(-Math.nextDown(0.5)) >= d2b(-0.5));
// Potentially the next power of 2 could be used based on ULP errors but
// the switch is not monotonic.
- Assert.assertFalse(d2(nextDown(0.25)) <= d2b(0.25));
+ Assert.assertFalse(d2(Math.nextDown(0.25)) <= d2b(0.25));
}
/**
@@ -899,9 +899,9 @@ public class StableSamplerTest {
Assert.assertEquals(1.0, PI_4 * SpecialMath.tan2(PI_4), Math.ulp(1.0));
// If this is above 1 then the sampler will break. Test at the switch point pi/4.
Assert.assertTrue(1.0 >= PI_4 * SpecialMath.tan2(PI_4));
- Assert.assertTrue(1.0 >= PI_4 * SpecialMath.tan2(nextDown(PI_4)));
+ Assert.assertTrue(1.0 >= PI_4 * SpecialMath.tan2(Math.nextDown(PI_4)));
// Monotonic function at the transition
- Assert.assertTrue(SpecialMath.tan2(nextUp(PI_4)) >= SpecialMath.tan2(PI_4));
+ Assert.assertTrue(SpecialMath.tan2(Math.nextUp(PI_4)) >= SpecialMath.tan2(PI_4));
}
/**
@@ -991,7 +991,7 @@ public class StableSamplerTest {
for (final double u : us) {
// CMS formulas
double x0 = sampleCMS(1, beta, w, u);
- Assert.assertTrue("Target must be finite", isFinite(x0));
+ Assert.assertTrue("Target must be finite", Double.isFinite(x0));
// Sample should approach x0 as alpha approaches 1
double delta = deltaStart;
@@ -1007,7 +1007,7 @@ public class StableSamplerTest {
// Weron formulas
x0 = sampleWeronAlpha1(beta, w, u);
- Assert.assertTrue("Target must be finite", isFinite(x0));
+ Assert.assertTrue("Target must be finite", Double.isFinite(x0));
// Sample should approach x0 as alpha approaches 1
delta = deltaStart;
@@ -1042,11 +1042,11 @@ public class StableSamplerTest {
public void testExtremeInputsToSample() {
// Demonstrate instability when w = 0
Assert.assertEquals(Double.NaN, sampleCMS(1.3, 0.7, 0, 0.25), 0.0);
- Assert.assertTrue(isFinite(sampleCMS(1.3, 0.7, SMALL_W, 0.25)));
+ Assert.assertTrue(Double.isFinite(sampleCMS(1.3, 0.7, SMALL_W, 0.25)));
// Demonstrate instability when u -> 0 or 1, and |beta| = 1
Assert.assertEquals(Double.NaN, sampleCMS(1.1, 1.0, 0.1, 0), 0.0);
- Assert.assertTrue(isFinite(sampleCMS(1.1, 1.0, 0.1, DU)));
+ Assert.assertTrue(Double.isFinite(sampleCMS(1.1, 1.0, 0.1, DU)));
// Demonstrate instability when alpha -> 0
@@ -1058,7 +1058,7 @@ public class StableSamplerTest {
Assert.assertEquals(Double.NaN, sampleCMS(1e-5, 0.7, 1.0, 1e-4), 0.0);
Assert.assertEquals(Double.NaN, sampleCMS(1e-5, -0.7, 1.0, 1 - 1e-4), 0.0);
- final double[] alphas = {nextDown(2), 1.3, 1.1, nextUp(1), 1, nextDown(1), 0.7, 0.1, 0.05, 0.01, 0x1.0p-16};
+ final double[] alphas = {Math.nextDown(2), 1.3, 1.1, Math.nextUp(1), 1, Math.nextDown(1), 0.7, 0.1, 0.05, 0.01, 0x1.0p-16};
final double[] betas = {1, 0.9, 0.001, 0};
// Avoid zero for the exponential sample.
// Test the smallest non-zero sample from the ArhensDieter exponential sampler,
@@ -1375,7 +1375,7 @@ public class StableSamplerTest {
final StableSampler sampler = StableSampler.of(createRngWithSequence(longs), alpha, beta);
// It should not be NaN or infinite
- Assert.assertTrue("Sampler did not recover", isFinite(sampler.sample()));
+ Assert.assertTrue("Sampler did not recover", Double.isFinite(sampler.sample()));
}
/**
@@ -1510,7 +1510,7 @@ public class StableSamplerTest {
}, longs1);
final StableSampler sampler1 = StableSampler.of(createRngWithSequence(longs1), 1.0, 1.0);
final double x1 = sampler1.sample();
- Assert.assertTrue("Sampler did not recover", isFinite(x1));
+ Assert.assertTrue("Sampler did not recover", Double.isFinite(x1));
// u -> pi/4
final long[] longs2 = {Long.MAX_VALUE, 1446480648965178882L};
@@ -1519,7 +1519,7 @@ public class StableSamplerTest {
}, longs2);
final StableSampler sampler2 = StableSampler.of(createRngWithSequence(longs2), 1.0, -1.0);
final double x2 = sampler2.sample();
- Assert.assertTrue("Sampler did not recover", isFinite(x2));
+ Assert.assertTrue("Sampler did not recover", Double.isFinite(x2));
// Sample should be a reflection
Assert.assertEquals(x1, -x2, 0.0);
@@ -1562,7 +1562,7 @@ public class StableSamplerTest {
*/
private static void testSupport(double gamma, double delta) {
// When alpha is small (<=0.1) the computation becomes limited by floating-point precision.
- final double[] alphas = {2.0, 1.5, 1.0, nextDown(1), 0.99, 0.75, 0.5, 0.25, 0.1, 0.01};
+ final double[] alphas = {2.0, 1.5, 1.0, Math.nextDown(1), 0.99, 0.75, 0.5, 0.25, 0.1, 0.01};
for (final double alpha : alphas) {
testSupport(alpha, 1, gamma, delta);
testSupport(alpha, -1, gamma, delta);
@@ -1689,7 +1689,7 @@ public class StableSamplerTest {
if (alpha > 1) {
mu = beta * Math.tan((2 - meps1) * PI_2);
} else {
- // Special case where tan(pi/4) is not 1 (it is nextDown(1.0)).
+ // Special case where tan(pi/4) is not 1 (it is Math.nextDown(1.0)).
// This is needed when testing the Levy case during sampling.
if (alpha == 0.5) {
mu = -beta;
@@ -2004,7 +2004,7 @@ public class StableSamplerTest {
// Alpha 1 case
testSharedStateSampler(1.0, 0.23);
// Alpha close to 1
- testSharedStateSampler(nextUp(1.0), 0.23);
+ testSharedStateSampler(Math.nextUp(1.0), 0.23);
// General case
testSharedStateSampler(1.3, 0.1);
// Small alpha cases
@@ -2053,7 +2053,7 @@ public class StableSamplerTest {
// Alpha 1 case
testTransformedSampler(1.0, 0.23);
// Alpha close to 1
- testTransformedSampler(nextUp(1.0), 0.23);
+ testTransformedSampler(Math.nextUp(1.0), 0.23);
// General case
testTransformedSampler(1.3, 0.1);
// Small alpha case
@@ -2428,40 +2428,4 @@ public class StableSamplerTest {
Assert.assertEquals(zeta, sampler.sample(), 0.0);
Assert.assertEquals(zeta, sampler.sample(), 0.0);
}
-
- /**
- * Checks if the value is finite.
- *
- * <p>To be replaced by {@code Double.isFinite(double)} from JDK 1.8.
- *
- * @param value the value
- * @return true if finite
- */
- private static boolean isFinite(double value) {
- return Math.abs(value) <= Double.MAX_VALUE;
- }
-
- /**
- * Return the next value after {@code x} in the direction of positive infinity.
- *
- * <p>To be replaced by Math.nextUp(double) from JDK 1.8.
- *
- * @param x the x
- * @return the next value up
- */
- private static double nextUp(double x) {
- return Math.nextAfter(x, Double.POSITIVE_INFINITY);
- }
-
- /**
- * Return the next value after {@code x} in the direction of negative infinity.
- *
- * <p>To be replaced by Math.nextDown(double) from JDK 1.8.
- *
- * @param x the x
- * @return the next value down
- */
- private static double nextDown(double x) {
- return Math.nextAfter(x, Double.NEGATIVE_INFINITY);
- }
}