You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2021/05/30 13:03:32 UTC

[commons-math] 01/03: Removed dependency on "GaussianRandomGenerator" (unit test).

This is an automated email from the ASF dual-hosted git repository.

erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-math.git

commit 8a756d763d9e2788f2818ff41084ffce091b7850
Author: Gilles Sadowski <gi...@gmail.com>
AuthorDate: Sun May 30 01:10:18 2021 +0200

    Removed dependency on "GaussianRandomGenerator" (unit test).
---
 .../random/CorrelatedRandomVectorGenerator.java    |  4 +--
 .../CorrelatedRandomVectorGeneratorTest.java       | 38 +++++++++++++++-------
 .../GLSMultipleLinearRegressionTest.java           | 28 +++++++++++++---
 3 files changed, 52 insertions(+), 18 deletions(-)

diff --git a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGenerator.java b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGenerator.java
index 753f9c6..0338f5f 100644
--- a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGenerator.java
+++ b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGenerator.java
@@ -36,8 +36,8 @@ import org.apache.commons.math4.legacy.linear.RectangularCholeskyDecomposition;
  * Multivariate Normal Distribution</a>. The approach using a Cholesky
  * decomposition is quite usual in this case. However, it can be extended
  * to other cases as long as the underlying random generator provides
- * {@link NormalizedRandomGenerator normalized values} like {@link
- * GaussianRandomGenerator} or {@link UniformRandomGenerator}.</p>
+ * {@link NormalizedRandomGenerator normalized values} like
+ * {@link UniformRandomGenerator}.</p>
  * <p>Sometimes, the covariance matrix for a given simulation is not
  * strictly positive definite. This means that the correlations are
  * not all independent from each other. In this case, however, the non
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGeneratorTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGeneratorTest.java
index b290c79..273e126 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGeneratorTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/CorrelatedRandomVectorGeneratorTest.java
@@ -23,7 +23,9 @@ import org.apache.commons.math4.legacy.TestUtils;
 import org.apache.commons.math4.legacy.linear.Array2DRowRealMatrix;
 import org.apache.commons.math4.legacy.linear.MatrixUtils;
 import org.apache.commons.math4.legacy.linear.RealMatrix;
+import org.apache.commons.rng.UniformRandomProvider;
 import org.apache.commons.rng.simple.RandomSource;
+import org.apache.commons.rng.sampling.distribution.ZigguratNormalizedGaussianSampler;
 import org.apache.commons.math4.legacy.stat.correlation.StorelessCovariance;
 import org.apache.commons.math4.legacy.stat.descriptive.moment.VectorialCovariance;
 import org.apache.commons.math4.legacy.stat.descriptive.moment.VectorialMean;
@@ -57,11 +59,10 @@ public class CorrelatedRandomVectorGeneratorTest {
             }
         }
 
-        GaussianRandomGenerator rawGenerator = new GaussianRandomGenerator(RandomSource.create(RandomSource.WELL_1024_A, 17399225432l));
         generator = new CorrelatedRandomVectorGenerator(mean,
                                                         covariance,
-                                                        1.0e-12 * covariance.getNorm(),
-                                                        rawGenerator);
+                                                        1e-12 * covariance.getNorm(),
+                                                        gaussianRandom(RandomSource.create(RandomSource.WELL_1024_A)));
     }
 
     @Test
@@ -79,9 +80,9 @@ public class CorrelatedRandomVectorGeneratorTest {
                 { 6, 2, -1, 197 }
         };
         RealMatrix covRM = MatrixUtils.createRealMatrix(cov);
-        NormalizedRandomGenerator rg = new GaussianRandomGenerator(RandomSource.create(RandomSource.WELL_1024_A, 5322145245211l));
         CorrelatedRandomVectorGenerator sg =
-            new CorrelatedRandomVectorGenerator(mean, covRM, 0.00001, rg);
+            new CorrelatedRandomVectorGenerator(mean, covRM, 0.00001,
+                                                gaussianRandom(RandomSource.create(RandomSource.WELL_1024_A)));
 
         double[] min = new double[mean.length];
         Arrays.fill(min, Double.POSITIVE_INFINITY);
@@ -168,12 +169,11 @@ public class CorrelatedRandomVectorGeneratorTest {
 
     private CorrelatedRandomVectorGenerator createSampler(double[][] cov) {
         RealMatrix matrix = new Array2DRowRealMatrix(cov);
-        double small = 10e-12 * matrix.getNorm();
-        return new CorrelatedRandomVectorGenerator(
-                new double[cov.length],
-                matrix,
-                small,
-                new GaussianRandomGenerator(RandomSource.create(RandomSource.WELL_1024_A, 0x366a26b94e520f41l)));
+        double small = 1e-12 * matrix.getNorm();
+        return new CorrelatedRandomVectorGenerator(new double[cov.length],
+                                                   matrix,
+                                                   small,
+                                                   gaussianRandom(RandomSource.create(RandomSource.WELL_1024_A)));
     }
 
     private void testSampler(final double[][] covMatrix, int samples, double epsilon) {
@@ -189,4 +189,20 @@ public class CorrelatedRandomVectorGeneratorTest {
             TestUtils.assertEquals(covMatrix[r], sampleCov[r], epsilon);
         }
     }
+
+    /**
+     * @param rng RNG.
+     * @return a N(0,1) sampler.
+     */
+    private NormalizedRandomGenerator gaussianRandom(final UniformRandomProvider rng) {
+        final ZigguratNormalizedGaussianSampler n = new ZigguratNormalizedGaussianSampler(rng);
+
+        return new NormalizedRandomGenerator() {
+            /** {@inheritDoc} */
+            @Override
+            public double nextNormalizedDouble() {
+                return n.sample();
+            }
+        };
+    }
 }
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/stat/regression/GLSMultipleLinearRegressionTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/stat/regression/GLSMultipleLinearRegressionTest.java
index 6eeab71..f507be2 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/stat/regression/GLSMultipleLinearRegressionTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/stat/regression/GLSMultipleLinearRegressionTest.java
@@ -25,10 +25,11 @@ import org.apache.commons.math4.legacy.exception.NullArgumentException;
 import org.apache.commons.math4.legacy.linear.MatrixUtils;
 import org.apache.commons.math4.legacy.linear.RealMatrix;
 import org.apache.commons.math4.legacy.linear.RealVector;
+import org.apache.commons.math4.legacy.random.NormalizedRandomGenerator;
 import org.apache.commons.math4.legacy.random.CorrelatedRandomVectorGenerator;
-import org.apache.commons.math4.legacy.random.GaussianRandomGenerator;
 import org.apache.commons.rng.UniformRandomProvider;
 import org.apache.commons.rng.simple.RandomSource;
+import org.apache.commons.rng.sampling.distribution.ZigguratNormalizedGaussianSampler;
 import org.apache.commons.statistics.distribution.ContinuousDistribution;
 import org.apache.commons.statistics.distribution.NormalDistribution;
 import org.apache.commons.math4.legacy.stat.correlation.Covariance;
@@ -220,7 +221,7 @@ public class GLSMultipleLinearRegressionTest extends MultipleLinearRegressionAbs
      */
     @Test
     public void testGLSEfficiency() {
-        final UniformRandomProvider rg = RandomSource.create(RandomSource.MT, 123456789L);
+        final UniformRandomProvider rg = RandomSource.create(RandomSource.MT);
         final ContinuousDistribution.Sampler gauss = new NormalDistribution(0, 1).createSampler(rg);
 
         // Assume model has 16 observations (will use Longley data).  Start by generating
@@ -245,10 +246,11 @@ public class GLSMultipleLinearRegressionTest extends MultipleLinearRegressionAbs
         RealMatrix cov = (new Covariance(errorSeeds)).getCovarianceMatrix();
 
         // Create a CorrelatedRandomVectorGenerator to use to generate correlated errors
-        GaussianRandomGenerator rawGenerator = new GaussianRandomGenerator(rg);
         double[] errorMeans = new double[nObs];  // Counting on init to 0 here
-        CorrelatedRandomVectorGenerator gen = new CorrelatedRandomVectorGenerator(errorMeans, cov,
-         1.0e-12 * cov.getNorm(), rawGenerator);
+        CorrelatedRandomVectorGenerator gen
+            = new CorrelatedRandomVectorGenerator(errorMeans, cov,
+                                                  1e-12 * cov.getNorm(),
+                                                  gaussianRandom(rg));
 
         // Now start generating models.  Use Longley X matrix on LHS
         // and Longley OLS beta vector as "true" beta.  Generate
@@ -297,4 +299,20 @@ public class GLSMultipleLinearRegressionTest extends MultipleLinearRegressionAbs
         assert(olsBetaStats.getMean() > 1.5 * glsBetaStats.getMean());
         assert(olsBetaStats.getStandardDeviation() > glsBetaStats.getStandardDeviation());
     }
+
+    /**
+     * @param rng RNG.
+     * @return a N(0,1) sampler.
+     */
+    private NormalizedRandomGenerator gaussianRandom(final UniformRandomProvider rng) {
+        final ZigguratNormalizedGaussianSampler n = new ZigguratNormalizedGaussianSampler(rng);
+
+        return new NormalizedRandomGenerator() {
+            /** {@inheritDoc} */
+            @Override
+            public double nextNormalizedDouble() {
+                return n.sample();
+            }
+        };
+    }
 }