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 2019/08/06 10:42:26 UTC

[commons-rng] 03/07: RNG-85: Add Middle Square Weyl Sequence to RandomSource enum.

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 3b4adc05fc42c3741b6323d96359e4420ba5bd62
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Mon Aug 5 11:46:37 2019 +0100

    RNG-85: Add Middle Square Weyl Sequence to RandomSource enum.
    
    The generator requires a high quality seed is generated using a custom
    seeding routine.
---
 .../commons/rng/examples/jmh/BaselineSources.java     |  1 +
 .../commons/rng/examples/jmh/RandomSourceValues.java  |  1 +
 .../org/apache/commons/rng/simple/RandomSource.java   | 10 +++++++++-
 .../commons/rng/simple/internal/ProviderBuilder.java  | 19 ++++++++++++++++++-
 4 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java
index 9404e1b..b47cb31 100644
--- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java
+++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java
@@ -92,6 +92,7 @@ public abstract class BaselineSources {
             "PCG_RXS_M_XS_64",
             "PCG_MCG_XSH_RR_32",
             "PCG_MCG_XSH_RS_32",
+            "MSWS",
             })
     private String randomSourceName;
 
diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java
index 9b0c6a1..449a4de 100644
--- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java
+++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java
@@ -70,6 +70,7 @@ public class RandomSourceValues {
             "PCG_RXS_M_XS_64",
             "PCG_MCG_XSH_RR_32",
             "PCG_MCG_XSH_RS_32",
+            "MSWS",
             })
     private String randomSourceName;
 
diff --git a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java
index af160b3..06ac923 100644
--- a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java
+++ b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java
@@ -426,7 +426,15 @@ public enum RandomSource {
      *  <li>Native seed size: 1.</li>
      * </ul>
      */
-    PCG_MCG_XSH_RS_32(ProviderBuilder.RandomSourceInternal.PCG_MCG_XSH_RS_32);
+    PCG_MCG_XSH_RS_32(ProviderBuilder.RandomSourceInternal.PCG_MCG_XSH_RS_32),
+    /**
+     * Source of randomness is {@link org.apache.commons.rng.core.source32.MiddleSquareWeylSequence}.
+     * <ul>
+     *  <li>Native seed type: {@code Long}.</li>
+     *  <li>Native seed size: 3.</li>
+     * </ul>
+     */
+    MSWS(ProviderBuilder.RandomSourceInternal.MSWS);
 
     /** Internal identifier. */
     private final ProviderBuilder.RandomSourceInternal internalIdentifier;
diff --git a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java
index d0746d8..0487b82 100644
--- a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java
+++ b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java
@@ -31,6 +31,7 @@ import org.apache.commons.rng.core.source32.Well44497a;
 import org.apache.commons.rng.core.source32.Well44497b;
 import org.apache.commons.rng.core.source32.ISAACRandom;
 import org.apache.commons.rng.core.source32.MersenneTwister;
+import org.apache.commons.rng.core.source32.MiddleSquareWeylSequence;
 import org.apache.commons.rng.core.source32.MultiplyWithCarry256;
 import org.apache.commons.rng.core.source32.KISSRandom;
 import org.apache.commons.rng.core.source32.XoRoShiRo64Star;
@@ -245,7 +246,23 @@ public final class ProviderBuilder {
         /** Source of randomness is {@link PcgMcgXshRs32}. */
         PCG_MCG_XSH_RS_32(PcgMcgXshRs32.class,
                 1,
-                NativeSeedType.LONG);
+                NativeSeedType.LONG),
+        /** Source of randomness is {@link MiddleSquareWeylSequence}. */
+        MSWS(MiddleSquareWeylSequence.class,
+             3,
+             NativeSeedType.LONG_ARRAY) {
+            @Override
+            Object createSeed() {
+                // This generator requires a high quality Weyl increment.
+                final long seed = SeedFactory.createLong();
+                final long increment = SeedUtils.createLongHexPermutation(new SplitMix64(seed));
+                // The initial state should not be low complexity but the Weyl
+                // state can be any number.
+                final long state = increment;
+                final long weylState = seed;
+                return new long[] {state, weylState, increment};
+            }
+        };
 
         /** Source type. */
         private final Class<? extends UniformRandomProvider> rng;