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/10/09 22:17:35 UTC
[commons-rng] branch master updated: Refactor the duplicate code in
the XorShiRo generators to the parent.
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
The following commit(s) were added to refs/heads/master by this push:
new 23983b9 Refactor the duplicate code in the XorShiRo generators to the parent.
23983b9 is described below
commit 23983b9905893935520d5073df9dbc63308012d6
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Wed Oct 9 21:46:18 2019 +0100
Refactor the duplicate code in the XorShiRo generators to the parent.
This implements the common code in the next() generation method in the
abstract parent. Concrete implementations now provide a method to get
the next output value given the current state.
---
.../rng/core/source32/AbstractXoRoShiRo64.java | 24 ++++++++++++++++
.../rng/core/source32/AbstractXoShiRo128.java | 28 +++++++++++++++++++
.../commons/rng/core/source32/XoRoShiRo64Star.java | 12 ++------
.../rng/core/source32/XoRoShiRo64StarStar.java | 12 ++------
.../commons/rng/core/source32/XoShiRo128Plus.java | 17 ++----------
.../rng/core/source32/XoShiRo128PlusPlus.java | 17 ++----------
.../rng/core/source32/XoShiRo128StarStar.java | 17 ++----------
.../rng/core/source64/AbstractXoRoShiRo128.java | 24 ++++++++++++++++
.../rng/core/source64/AbstractXoShiRo256.java | 28 +++++++++++++++++++
.../rng/core/source64/AbstractXoShiRo512.java | 32 ++++++++++++++++++++++
.../rng/core/source64/XoRoShiRo128Plus.java | 12 ++------
.../rng/core/source64/XoRoShiRo128PlusPlus.java | 9 ++++++
.../rng/core/source64/XoRoShiRo128StarStar.java | 12 ++------
.../commons/rng/core/source64/XoShiRo256Plus.java | 17 ++----------
.../rng/core/source64/XoShiRo256PlusPlus.java | 17 ++----------
.../rng/core/source64/XoShiRo256StarStar.java | 17 ++----------
.../commons/rng/core/source64/XoShiRo512Plus.java | 21 ++------------
.../rng/core/source64/XoShiRo512PlusPlus.java | 21 ++------------
.../rng/core/source64/XoShiRo512StarStar.java | 21 ++------------
.../core/source64/XoRoShiRo128PlusPlusTest.java | 10 +++++++
20 files changed, 181 insertions(+), 187 deletions(-)
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
index b3f8b82..03e7582 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
@@ -94,4 +94,28 @@ abstract class AbstractXoRoShiRo64 extends IntProvider {
super.setStateInternal(c[1]);
}
+
+ /** {@inheritDoc} */
+ @Override
+ public int next() {
+ final int result = nextOutput();
+
+ final int s0 = state0;
+ int s1 = state1;
+
+ s1 ^= s0;
+ state0 = Integer.rotateLeft(s0, 26) ^ s1 ^ (s1 << 9); // a, b
+ state1 = Integer.rotateLeft(s1, 13); // c
+
+ return result;
+ }
+
+ /**
+ * Use the current state to compute the next output from the generator.
+ * The output function shall vary with respect to different generators.
+ * This method is called from {@link #next()} before the current state is updated.
+ *
+ * @return the next output
+ */
+ protected abstract int nextOutput();
}
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
index 6bcdf78..8a8c94b 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
@@ -130,6 +130,34 @@ abstract class AbstractXoShiRo128 extends IntProvider implements LongJumpableUni
super.setStateInternal(c[1]);
}
+ /** {@inheritDoc} */
+ @Override
+ public int next() {
+ final int result = nextOutput();
+
+ final int t = state1 << 9;
+
+ state2 ^= state0;
+ state3 ^= state1;
+ state1 ^= state2;
+ state0 ^= state3;
+
+ state2 ^= t;
+
+ state3 = Integer.rotateLeft(state3, 11);
+
+ return result;
+ }
+
+ /**
+ * Use the current state to compute the next output from the generator.
+ * The output function shall vary with respect to different generators.
+ * This method is called from {@link #next()} before the current state is updated.
+ *
+ * @return the next output
+ */
+ protected abstract int nextOutput();
+
/**
* {@inheritDoc}
*
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java
index 762fe0e..72b1211 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java
@@ -55,15 +55,7 @@ public class XoRoShiRo64Star extends AbstractXoRoShiRo64 {
/** {@inheritDoc} */
@Override
- public int next() {
- final int s0 = state0;
- int s1 = state1;
- final int result = s0 * 0x9E3779BB;
-
- s1 ^= s0;
- state0 = Integer.rotateLeft(s0, 26) ^ s1 ^ (s1 << 9); // a, b
- state1 = Integer.rotateLeft(s1, 13); // c
-
- return result;
+ protected int nextOutput() {
+ return state0 * 0x9e3779bb;
}
}
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java
index a7ca604..7c903a1 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java
@@ -55,15 +55,7 @@ public class XoRoShiRo64StarStar extends AbstractXoRoShiRo64 {
/** {@inheritDoc} */
@Override
- public int next() {
- final int s0 = state0;
- int s1 = state1;
- final int result = Integer.rotateLeft(s0 * 0x9E3779BB, 5) * 5;
-
- s1 ^= s0;
- state0 = Integer.rotateLeft(s0, 26) ^ s1 ^ (s1 << 9); // a, b
- state1 = Integer.rotateLeft(s1, 13); // c
-
- return result;
+ protected int nextOutput() {
+ return Integer.rotateLeft(state0 * 0x9e3779bb, 5) * 5;
}
}
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java
index 91a9541..105d5d1 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java
@@ -66,21 +66,8 @@ public class XoShiRo128Plus extends AbstractXoShiRo128 {
/** {@inheritDoc} */
@Override
- public int next() {
- final int result = state0 + state3;
-
- final int t = state1 << 9;
-
- state2 ^= state0;
- state3 ^= state1;
- state1 ^= state2;
- state0 ^= state3;
-
- state2 ^= t;
-
- state3 = Integer.rotateLeft(state3, 11);
-
- return result;
+ protected int nextOutput() {
+ return state0 + state3;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
index 80cfd1e..81e982d 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
@@ -66,21 +66,8 @@ public class XoShiRo128PlusPlus extends AbstractXoShiRo128 {
/** {@inheritDoc} */
@Override
- public int next() {
- final int result = Integer.rotateLeft(state0 + state3, 7) + state0;
-
- final int t = state1 << 9;
-
- state2 ^= state0;
- state3 ^= state1;
- state1 ^= state2;
- state0 ^= state3;
-
- state2 ^= t;
-
- state3 = Integer.rotateLeft(state3, 11);
-
- return result;
+ protected int nextOutput() {
+ return Integer.rotateLeft(state0 + state3, 7) + state0;
}
/**
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java
index 9cb35d6..f636ad3 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java
@@ -66,21 +66,8 @@ public class XoShiRo128StarStar extends AbstractXoShiRo128 {
/** {@inheritDoc} */
@Override
- public int next() {
- final int result = Integer.rotateLeft(state0 * 5, 7) * 9;
-
- final int t = state1 << 9;
-
- state2 ^= state0;
- state3 ^= state1;
- state1 ^= state2;
- state0 ^= state3;
-
- state2 ^= t;
-
- state3 = Integer.rotateLeft(state3, 11);
-
- return result;
+ protected int nextOutput() {
+ return Integer.rotateLeft(state0 * 5, 7) * 9;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
index 6530aeb..794eef6 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
@@ -117,6 +117,30 @@ abstract class AbstractXoRoShiRo128 extends LongProvider implements LongJumpable
super.setStateInternal(c[1]);
}
+ /** {@inheritDoc} */
+ @Override
+ public long next() {
+ final long result = nextOutput();
+
+ final long s0 = state0;
+ long s1 = state1;
+
+ s1 ^= s0;
+ state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
+ state1 = Long.rotateLeft(s1, 37); // c
+
+ return result;
+ }
+
+ /**
+ * Use the current state to compute the next output from the generator.
+ * The output function shall vary with respect to different generators.
+ * This method is called from {@link #next()} before the current state is updated.
+ *
+ * @return the next output
+ */
+ protected abstract long nextOutput();
+
/**
* {@inheritDoc}
*
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
index af603ca..12a292e 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
@@ -130,6 +130,34 @@ abstract class AbstractXoShiRo256 extends LongProvider implements LongJumpableUn
super.setStateInternal(c[1]);
}
+ /** {@inheritDoc} */
+ @Override
+ public long next() {
+ final long result = nextOutput();
+
+ final long t = state1 << 17;
+
+ state2 ^= state0;
+ state3 ^= state1;
+ state1 ^= state2;
+ state0 ^= state3;
+
+ state2 ^= t;
+
+ state3 = Long.rotateLeft(state3, 45);
+
+ return result;
+ }
+
+ /**
+ * Use the current state to compute the next output from the generator.
+ * The output function shall vary with respect to different generators.
+ * This method is called from {@link #next()} before the current state is updated.
+ *
+ * @return the next output
+ */
+ protected abstract long nextOutput();
+
/**
* {@inheritDoc}
*
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
index d4f5be2..d6ebd05 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
@@ -158,6 +158,38 @@ abstract class AbstractXoShiRo512 extends LongProvider implements LongJumpableUn
super.setStateInternal(c[1]);
}
+ /** {@inheritDoc} */
+ @Override
+ public long next() {
+ final long result = nextOutput();
+
+ final long t = state1 << 11;
+
+ state2 ^= state0;
+ state5 ^= state1;
+ state1 ^= state2;
+ state7 ^= state3;
+ state3 ^= state4;
+ state4 ^= state5;
+ state0 ^= state6;
+ state6 ^= state7;
+
+ state6 ^= t;
+
+ state7 = Long.rotateLeft(state7, 21);
+
+ return result;
+ }
+
+ /**
+ * Use the current state to compute the next output from the generator.
+ * The output function shall vary with respect to different generators.
+ * This method is called from {@link #next()} before the current state is updated.
+ *
+ * @return the next output
+ */
+ protected abstract long nextOutput();
+
/**
* {@inheritDoc}
*
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java
index f8386fd..ce7c9b5 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java
@@ -65,16 +65,8 @@ public class XoRoShiRo128Plus extends AbstractXoRoShiRo128 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long s0 = state0;
- long s1 = state1;
- final long result = s0 + s1;
-
- s1 ^= s0;
- state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
- state1 = Long.rotateLeft(s1, 37); // c
-
- return result;
+ protected long nextOutput() {
+ return state0 + state1;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
index d753745..d6c20d9 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
@@ -77,6 +77,9 @@ public class XoRoShiRo128PlusPlus extends AbstractXoRoShiRo128 {
/** {@inheritDoc} */
@Override
public long next() {
+ // Override the abstract class to use a different state update step.
+ // Note: This requires different jump coefficients.
+
final long s0 = state0;
long s1 = state1;
final long result = Long.rotateLeft(s0 + s1, 17) + s0;
@@ -90,6 +93,12 @@ public class XoRoShiRo128PlusPlus extends AbstractXoRoShiRo128 {
/** {@inheritDoc} */
@Override
+ protected long nextOutput() {
+ throw new UnsupportedOperationException("The PlusPlus algorithm redefines the next() method");
+ }
+
+ /** {@inheritDoc} */
+ @Override
public UniformRandomProvider jump() {
// Duplicated from the abstract class to change the jump coefficients
final UniformRandomProvider copy = copy();
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
index c926d17..f115fed 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
@@ -64,16 +64,8 @@ public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long s0 = state0;
- long s1 = state1;
- final long result = Long.rotateLeft(s0 * 5, 7) * 9;
-
- s1 ^= s0;
- state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
- state1 = Long.rotateLeft(s1, 37); // c
-
- return result;
+ protected long nextOutput() {
+ return Long.rotateLeft(state0 * 5, 7) * 9;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java
index 46591af..838a12c 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java
@@ -66,21 +66,8 @@ public class XoShiRo256Plus extends AbstractXoShiRo256 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long result = state0 + state3;
-
- final long t = state1 << 17;
-
- state2 ^= state0;
- state3 ^= state1;
- state1 ^= state2;
- state0 ^= state3;
-
- state2 ^= t;
-
- state3 = Long.rotateLeft(state3, 45);
-
- return result;
+ protected long nextOutput() {
+ return state0 + state3;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
index 4d43e23..4c398f4 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
@@ -65,21 +65,8 @@ public class XoShiRo256PlusPlus extends AbstractXoShiRo256 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long result = Long.rotateLeft(state0 + state3, 23) + state0;
-
- final long t = state1 << 17;
-
- state2 ^= state0;
- state3 ^= state1;
- state1 ^= state2;
- state0 ^= state3;
-
- state2 ^= t;
-
- state3 = Long.rotateLeft(state3, 45);
-
- return result;
+ protected long nextOutput() {
+ return Long.rotateLeft(state0 + state3, 23) + state0;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java
index 2be5ddc..11a4bb5 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java
@@ -65,21 +65,8 @@ public class XoShiRo256StarStar extends AbstractXoShiRo256 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long result = Long.rotateLeft(state1 * 5, 7) * 9;
-
- final long t = state1 << 17;
-
- state2 ^= state0;
- state3 ^= state1;
- state1 ^= state2;
- state0 ^= state3;
-
- state2 ^= t;
-
- state3 = Long.rotateLeft(state3, 45);
-
- return result;
+ protected long nextOutput() {
+ return Long.rotateLeft(state1 * 5, 7) * 9;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java
index f515e4d..678f5d4 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java
@@ -72,25 +72,8 @@ public class XoShiRo512Plus extends AbstractXoShiRo512 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long result = state0 + state2;
-
- final long t = state1 << 11;
-
- state2 ^= state0;
- state5 ^= state1;
- state1 ^= state2;
- state7 ^= state3;
- state3 ^= state4;
- state4 ^= state5;
- state0 ^= state6;
- state6 ^= state7;
-
- state6 ^= t;
-
- state7 = Long.rotateLeft(state7, 21);
-
- return result;
+ protected long nextOutput() {
+ return state0 + state2;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
index 0223944..7989516 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
@@ -71,25 +71,8 @@ public class XoShiRo512PlusPlus extends AbstractXoShiRo512 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long result = Long.rotateLeft(state0 + state2, 17) + state2;
-
- final long t = state1 << 11;
-
- state2 ^= state0;
- state5 ^= state1;
- state1 ^= state2;
- state7 ^= state3;
- state3 ^= state4;
- state4 ^= state5;
- state0 ^= state6;
- state6 ^= state7;
-
- state6 ^= t;
-
- state7 = Long.rotateLeft(state7, 21);
-
- return result;
+ protected long nextOutput() {
+ return Long.rotateLeft(state0 + state2, 17) + state2;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java
index d997afd..756a7fe 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java
@@ -71,25 +71,8 @@ public class XoShiRo512StarStar extends AbstractXoShiRo512 {
/** {@inheritDoc} */
@Override
- public long next() {
- final long result = Long.rotateLeft(state1 * 5, 7) * 9;
-
- final long t = state1 << 11;
-
- state2 ^= state0;
- state5 ^= state1;
- state1 ^= state2;
- state7 ^= state3;
- state3 ^= state4;
- state4 ^= state5;
- state0 ^= state6;
- state6 ^= state7;
-
- state6 ^= t;
-
- state7 = Long.rotateLeft(state7, 21);
-
- return result;
+ protected long nextOutput() {
+ return Long.rotateLeft(state1 * 5, 7) * 9;
}
/** {@inheritDoc} */
diff --git a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
index dd3af12..b75b5c6 100644
--- a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
+++ b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
@@ -109,4 +109,14 @@ public class XoRoShiRo128PlusPlusTest {
public void testLongJump() {
RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoRoShiRo128PlusPlus(SEED));
}
+
+ /**
+ * This PlusPlus algorithm uses a different state update step. It overrides next() directly
+ * and the abstract nextOutput() method should not be used. This test checks the method
+ * throws an exception if used.
+ */
+ @Test(expected = UnsupportedOperationException.class)
+ public void testNextOutputThrows() {
+ new XoRoShiRo128PlusPlus(SEED).nextOutput();
+ }
}