http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MersenneTwister.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MersenneTwister.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MersenneTwister.java deleted file mode 100644 index baa0793..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MersenneTwister.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -import java.util.Arrays; -import org.apache.commons.rng.internal.util.NumberFactory; - -/** - * This class implements a powerful pseudo-random number generator - * developed by Makoto Matsumoto and Takuji Nishimura during - * 1996-1997. - * - * <p> - * This generator features an extremely long period - * (2<sup>19937</sup>-1) and 623-dimensional equidistribution up to - * 32 bits accuracy. The home page for this generator is located at - * <a href="http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html"> - * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html</a>. - * </p> - * - * <p> - * This generator is described in a paper by Makoto Matsumoto and - * Takuji Nishimura in 1998: - * <a href="http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/ARTICLES/mt.pdf"> - * Mersenne Twister: A 623-Dimensionally Equidistributed Uniform Pseudo-Random - * Number Generator</a>, - * ACM Transactions on Modeling and Computer Simulation, Vol. 8, No. 1, - * January 1998, pp 3--30 - * </p> - * - * <p> - * This class is mainly a Java port of the - * <a href="http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html"> - * 2002-01-26 version of the generator</a> written in C by Makoto Matsumoto - * and Takuji Nishimura. Here is their original copyright: - * </p> - * - * <table border="0" width="80%" cellpadding="10" style="background-color: #E0E0E0" summary="Mersenne Twister licence"> - * <tr><td>Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, - * All rights reserved.</td></tr> - * - * <tr><td>Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * <ol> - * <li>Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer.</li> - * <li>Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution.</li> - * <li>The names of its contributors may not be used to endorse or promote - * products derived from this software without specific prior written - * permission.</li> - * </ol></td></tr> - * - * <tr><td><strong>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE.</strong></td></tr> - * </table> - * - * @see <a href="https://en.wikipedia.org/wiki/Mersenne_Twister">Mersenne Twister (Wikipedia)</a> - * @since 1.0 - */ -public class MersenneTwister extends IntProvider { - /** Mask 32 most significant bits. */ - private static final long INT_MASK_LONG = 0xffffffffL; - /** Most significant w-r bits. */ - private static final long UPPER_MASK_LONG = 0x80000000L; - /** Least significant r bits. */ - private static final long LOWER_MASK_LONG = 0x7fffffffL; - /** Most significant w-r bits. */ - private static final int UPPER_MASK = 0x80000000; - /** Least significant r bits. */ - private static final int LOWER_MASK = 0x7fffffff; - /** Size of the bytes pool. */ - private static final int N = 624; - /** Period second parameter. */ - private static final int M = 397; - /** X * MATRIX_A for X = {0, 1}. */ - private static final int[] MAG01 = { 0x0, 0x9908b0df }; - /** Bytes pool. */ - private int[] mt = new int[N]; - /** Current index in the bytes pool. */ - private int mti; - - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public MersenneTwister(int[] seed) { - setSeedInternal(seed); - } - - /** {@inheritDoc} */ - @Override - protected byte[] getStateInternal() { - final int[] s = Arrays.copyOf(mt, N + 1); - s[N] = mti; - - return NumberFactory.makeByteArray(s); - } - - /** {@inheritDoc} */ - @Override - protected void setStateInternal(byte[] s) { - checkStateSize(s, (N + 1) * 4); - - final int[] tmp = NumberFactory.makeIntArray(s); - System.arraycopy(tmp, 0, mt, 0, N); - mti = tmp[N]; - } - - /** - * Initializes the generator with the given seed. - * - * @param seed Initial seed. - */ - private void setSeedInternal(int[] seed) { - fillStateMersenneTwister(mt, seed); - - // Initial index. - mti = N; - } - - /** - * Utility for wholly filling a {@code state} array with non-zero - * bytes, even if the {@code seed} has a smaller size. - * The procedure is the one defined by the standard implementation - * of the algorithm. - * - * @param state State to be filled (must be allocated). - * @param seed Seed (cannot be {@code null}). - */ - private static void fillStateMersenneTwister(int[] state, - int[] seed) { - if (seed.length == 0) { - // Accept empty seed. - seed = new int[1]; - } - - final int stateSize = state.length; - - long mt = 19650218 & INT_MASK_LONG; - state[0] = (int) mt; - for (int i = 1; i < stateSize; i++) { - mt = (1812433253L * (mt ^ (mt >> 30)) + i) & INT_MASK_LONG; - state[i] = (int) mt; - } - - int i = 1; - int j = 0; - - for (int k = Math.max(stateSize, seed.length); k > 0; k--) { - final long a = (state[i] & LOWER_MASK_LONG) | ((state[i] < 0) ? UPPER_MASK_LONG : 0); - final long b = (state[i - 1] & LOWER_MASK_LONG) | ((state[i - 1] < 0) ? UPPER_MASK_LONG : 0); - final long c = (a ^ ((b ^ (b >> 30)) * 1664525L)) + seed[j] + j; // Non linear. - state[i] = (int) (c & INT_MASK_LONG); - i++; - j++; - if (i >= stateSize) { - state[0] = state[stateSize - 1]; - i = 1; - } - if (j >= seed.length) { - j = 0; - } - } - - for (int k = stateSize - 1; k > 0; k--) { - final long a = (state[i] & LOWER_MASK_LONG) | ((state[i] < 0) ? UPPER_MASK_LONG : 0); - final long b = (state[i - 1] & LOWER_MASK_LONG) | ((state[i - 1] < 0) ? UPPER_MASK_LONG : 0); - final long c = (a ^ ((b ^ (b >> 30)) * 1566083941L)) - i; // Non linear. - state[i] = (int) (c & INT_MASK_LONG); - i++; - if (i >= stateSize) { - state[0] = state[stateSize - 1]; - i = 1; - } - } - - state[0] = (int) UPPER_MASK_LONG; // MSB is 1, ensuring non-zero initial array. - } - - /** {@inheritDoc} */ - @Override - public int next() { - int y; - - if (mti >= N) { // Generate N words at one time. - int mtNext = mt[0]; - for (int k = 0; k < N - M; ++k) { - int mtCurr = mtNext; - mtNext = mt[k + 1]; - y = (mtCurr & UPPER_MASK) | (mtNext & LOWER_MASK); - mt[k] = mt[k + M] ^ (y >>> 1) ^ MAG01[y & 1]; - } - for (int k = N - M; k < N - 1; ++k) { - int mtCurr = mtNext; - mtNext = mt[k + 1]; - y = (mtCurr & UPPER_MASK) | (mtNext & LOWER_MASK); - mt[k] = mt[k + (M - N)] ^ (y >>> 1) ^ MAG01[y & 1]; - } - y = (mtNext & UPPER_MASK) | (mt[0] & LOWER_MASK); - mt[N - 1] = mt[M - 1] ^ (y >>> 1) ^ MAG01[y & 1]; - - mti = 0; - } - - y = mt[mti++]; - - // Tempering. - y ^= y >>> 11; - y ^= (y << 7) & 0x9d2c5680; - y ^= (y << 15) & 0xefc60000; - y ^= y >>> 18; - - return y; - } -}
http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MultiplyWithCarry256.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MultiplyWithCarry256.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MultiplyWithCarry256.java deleted file mode 100644 index 9ac5026..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/MultiplyWithCarry256.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -import java.util.Arrays; -import org.apache.commons.rng.internal.util.NumberFactory; - -/** - * Port from Marsaglia's <a href="https://en.wikipedia.org/wiki/Multiply-with-carry"> - * "Multiply-With-Carry" algorithm</a>. - * - * <p> - * Implementation is based on the (non-portable!) C code reproduced on - * <a href="http://school.anhb.uwa.edu.au/personalpages/kwessen/shared/Marsaglia03.html"> - * that page</a>. - * </p> - * - * @see <a href="https://en.wikipedia.org/wiki/Multiply-with-carry">Multiply with carry (Wikipedia)</a> - * @since 1.0 - */ -public class MultiplyWithCarry256 extends IntProvider { - /** Length of the state array. */ - private static final int Q_SIZE = 256; - /** Size of the seed. */ - private static final int SEED_SIZE = Q_SIZE + 1; - /** Multiply. */ - private static final long A = 809430660; - /** State. */ - private final int[] state = new int[Q_SIZE]; - /** Current index in "state" array. */ - private int index; - /** Carry. */ - private int carry; - - /** - * Creates a new instance. - * - * @param seed Seed. - * If the length is larger than 257, only the first 257 elements will - * be used; if smaller, the remaining elements will be automatically - * set. - */ - public MultiplyWithCarry256(int[] seed) { - setSeedInternal(seed); - } - - /** {@inheritDoc} */ - @Override - protected byte[] getStateInternal() { - final int[] s = Arrays.copyOf(state, SEED_SIZE + 1); - s[SEED_SIZE - 1] = carry; - s[SEED_SIZE] = index; - - return NumberFactory.makeByteArray(s); - } - - /** {@inheritDoc} */ - @Override - protected void setStateInternal(byte[] s) { - checkStateSize(s, (SEED_SIZE + 1) * 4); - - final int[] tmp = NumberFactory.makeIntArray(s); - - System.arraycopy(tmp, 0, state, 0, Q_SIZE); - carry = tmp[SEED_SIZE - 1]; - index = tmp[SEED_SIZE]; - } - - /** - * Seeds the RNG. - * - * @param seed Seed. - */ - private void setSeedInternal(int[] seed) { - // Reset the whole state of this RNG (i.e. "state" and "index"). - // Filling procedure is not part of the reference code. - final int[] tmp = new int[SEED_SIZE]; - fillState(tmp, seed); - - // First element of the "seed" is the initial "carry". - final int c = tmp[0]; - // Marsaglia's recommendation: 0 <= carry < A. - carry = (int) ((c < 0 ? -c : c) % A); - - // Initial state. - System.arraycopy(tmp, 1, state, 0, Q_SIZE); - - // Initial index. - index = Q_SIZE; - } - - /** {@inheritDoc} */ - @Override - public int next() { - if (index == Q_SIZE) { // Whole state used up. - // Refill. - for (int i = 0; i < Q_SIZE; i++) { - final long t = A * (state[i] & 0xffffffffL) + carry; - carry = (int) (t >> 32); - state[i] = (int) t; - } - - // Reset current index. - index = 0; - } - - return state[index++]; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/RandomIntSource.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/RandomIntSource.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/RandomIntSource.java deleted file mode 100644 index fe5a853..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/RandomIntSource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.rng.internal.source32; - -/** - * Source of randomness that generates values of type {@code int}. - * - * @since 1.0 - */ -public interface RandomIntSource { - /** - * @return the next random value. - */ - int next(); -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well1024a.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well1024a.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well1024a.java deleted file mode 100644 index f465212..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well1024a.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -/** - * This class implements the WELL1024a pseudo-random number generator - * from François Panneton, Pierre L'Ecuyer and Makoto Matsumoto. - * <p> - * This generator is described in a paper by François Panneton, - * Pierre L'Ecuyer and Makoto Matsumoto - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf"> - * Improved Long-Period Generators Based on Linear Recurrences Modulo 2</a> - * ACM Transactions on Mathematical Software, 32, 1 (2006). - * The errata for the paper are in - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng-errata.txt">wellrng-errata.txt</a>. - * </p> - * - * @see <a href="http://www.iro.umontreal.ca/~panneton/WELLRNG.html">WELL Random number generator</a> - * @since 1.0 - */ -public class Well1024a extends AbstractWell { - /** Number of bits in the pool. */ - private static final int K = 1024; - /** First parameter of the algorithm. */ - private static final int M1 = 3; - /** Second parameter of the algorithm. */ - private static final int M2 = 24; - /** Third parameter of the algorithm. */ - private static final int M3 = 10; - /** The indirection index table. */ - private static final IndexTable TABLE = new IndexTable(K, M1, M2, M3); - - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public Well1024a(int[] seed) { - super(K, seed); - } - - /** {@inheritDoc} */ - @Override - public int next() { - final int indexRm1 = TABLE.getIndexPred(index); - - final int v0 = v[index]; - final int vM1 = v[TABLE.getIndexM1(index)]; - final int vM2 = v[TABLE.getIndexM2(index)]; - final int vM3 = v[TABLE.getIndexM3(index)]; - - final int z0 = v[indexRm1]; - final int z1 = v0 ^ (vM1 ^ (vM1 >>> 8)); - final int z2 = (vM2 ^ (vM2 << 19)) ^ (vM3 ^ (vM3 << 14)); - final int z3 = z1 ^ z2; - final int z4 = (z0 ^ (z0 << 11)) ^ (z1 ^ (z1 << 7)) ^ (z2 ^ (z2 << 13)); - - v[index] = z3; - v[indexRm1] = z4; - index = indexRm1; - - return z4; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937a.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937a.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937a.java deleted file mode 100644 index 866f43e..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937a.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -/** - * This class implements the WELL19937a pseudo-random number generator - * from François Panneton, Pierre L'Ecuyer and Makoto Matsumoto. - * <p> - * This generator is described in a paper by François Panneton, - * Pierre L'Ecuyer and Makoto Matsumoto - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf"> - * Improved Long-Period Generators Based on Linear Recurrences Modulo 2</a> - * ACM Transactions on Mathematical Software, 32, 1 (2006). - * The errata for the paper are in - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng-errata.txt">wellrng-errata.txt</a>. - * </p> - * - * @see <a href="http://www.iro.umontreal.ca/~panneton/WELLRNG.html">WELL Random number generator</a> - * @since 1.0 - */ -public class Well19937a extends AbstractWell { - /** Number of bits in the pool. */ - private static final int K = 19937; - /** First parameter of the algorithm. */ - private static final int M1 = 70; - /** Second parameter of the algorithm. */ - private static final int M2 = 179; - /** Third parameter of the algorithm. */ - private static final int M3 = 449; - /** The indirection index table. */ - private static final IndexTable TABLE = new IndexTable(K, M1, M2, M3); - - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public Well19937a(int[] seed) { - super(K, seed); - } - - /** {@inheritDoc} */ - @Override - public int next() { - final int indexRm1 = TABLE.getIndexPred(index); - final int indexRm2 = TABLE.getIndexPred2(index); - - final int v0 = v[index]; - final int vM1 = v[TABLE.getIndexM1(index)]; - final int vM2 = v[TABLE.getIndexM2(index)]; - final int vM3 = v[TABLE.getIndexM3(index)]; - - final int z0 = (0x80000000 & v[indexRm1]) ^ (0x7FFFFFFF & v[indexRm2]); - final int z1 = (v0 ^ (v0 << 25)) ^ (vM1 ^ (vM1 >>> 27)); - final int z2 = (vM2 >>> 9) ^ (vM3 ^ (vM3 >>> 1)); - final int z3 = z1 ^ z2; - final int z4 = z0 ^ (z1 ^ (z1 << 9)) ^ (z2 ^ (z2 << 21)) ^ (z3 ^ (z3 >>> 21)); - - v[index] = z3; - v[indexRm1] = z4; - v[indexRm2] &= 0x80000000; - index = indexRm1; - - return z4; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937c.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937c.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937c.java deleted file mode 100644 index ca0783f..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well19937c.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -/** - * This class implements the WELL19937c pseudo-random number generator - * from François Panneton, Pierre L'Ecuyer and Makoto Matsumoto. - * <p> - * This generator is described in a paper by François Panneton, - * Pierre L'Ecuyer and Makoto Matsumoto - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf"> - * Improved Long-Period Generators Based on Linear Recurrences Modulo 2</a> - * ACM Transactions on Mathematical Software, 32, 1 (2006). - * The errata for the paper are in - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng-errata.txt">wellrng-errata.txt</a>. - * </p> - * - * @see <a href="http://www.iro.umontreal.ca/~panneton/WELLRNG.html">WELL Random number generator</a> - * @since 1.0 - */ -public class Well19937c extends Well19937a { - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public Well19937c(int[] seed) { - super(seed); - } - - /** {@inheritDoc} */ - @Override - public int next() { - int z4 = super.next(); - - // Matsumoto-Kurita tempering to get a maximally equidistributed generator. - z4 ^= (z4 << 7) & 0xe46e1700; - z4 ^= (z4 << 15) & 0x9b868000; - - return z4; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497a.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497a.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497a.java deleted file mode 100644 index 8cef728..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497a.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -/** - * This class implements the WELL44497a pseudo-random number generator - * from François Panneton, Pierre L'Ecuyer and Makoto Matsumoto. - * <p> - * This generator is described in a paper by François Panneton, - * Pierre L'Ecuyer and Makoto Matsumoto - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf"> - * Improved Long-Period Generators Based on Linear Recurrences Modulo 2</a> - * ACM Transactions on Mathematical Software, 32, 1 (2006). - * The errata for the paper are in - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng-errata.txt">wellrng-errata.txt</a>. - * </p> - * - * @see <a href="http://www.iro.umontreal.ca/~panneton/WELLRNG.html">WELL Random number generator</a> - * @since 1.0 - */ -public class Well44497a extends AbstractWell { - /** Number of bits in the pool. */ - private static final int K = 44497; - /** First parameter of the algorithm. */ - private static final int M1 = 23; - /** Second parameter of the algorithm. */ - private static final int M2 = 481; - /** Third parameter of the algorithm. */ - private static final int M3 = 229; - /** The indirection index table. */ - private static final IndexTable TABLE = new IndexTable(K, M1, M2, M3); - - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public Well44497a(int[] seed) { - super(K, seed); - } - - /** {@inheritDoc} */ - @Override - public int next() { - final int indexRm1 = TABLE.getIndexPred(index); - final int indexRm2 = TABLE.getIndexPred2(index); - - final int v0 = v[index]; - final int vM1 = v[TABLE.getIndexM1(index)]; - final int vM2 = v[TABLE.getIndexM2(index)]; - final int vM3 = v[TABLE.getIndexM3(index)]; - - // the values below include the errata of the original article - final int z0 = (0xFFFF8000 & v[indexRm1]) ^ (0x00007FFF & v[indexRm2]); - final int z1 = (v0 ^ (v0 << 24)) ^ (vM1 ^ (vM1 >>> 30)); - final int z2 = (vM2 ^ (vM2 << 10)) ^ (vM3 << 26); - final int z3 = z1 ^ z2; - final int z2Prime = ((z2 << 9) ^ (z2 >>> 23)) & 0xfbffffff; - final int z2Second = ((z2 & 0x00020000) != 0) ? (z2Prime ^ 0xb729fcec) : z2Prime; - final int z4 = z0 ^ (z1 ^ (z1 >>> 20)) ^ z2Second ^ z3; - - v[index] = z3; - v[indexRm1] = z4; - v[indexRm2] &= 0xFFFF8000; - index = indexRm1; - - return z4; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497b.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497b.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497b.java deleted file mode 100644 index 983b0d2..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well44497b.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -/** - * This class implements the WELL44497b pseudo-random number generator - * from François Panneton, Pierre L'Ecuyer and Makoto Matsumoto. - * <p> - * This generator is described in a paper by François Panneton, - * Pierre L'Ecuyer and Makoto Matsumoto - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf"> - * Improved Long-Period Generators Based on Linear Recurrences Modulo 2</a> - * ACM Transactions on Mathematical Software, 32, 1 (2006). - * The errata for the paper are in - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng-errata.txt">wellrng-errata.txt</a>. - * </p> - * - * @see <a href="http://www.iro.umontreal.ca/~panneton/WELLRNG.html">WELL Random number generator</a> - * @since 1.0 - */ -public class Well44497b extends Well44497a { - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public Well44497b(int[] seed) { - super(seed); - } - - /** {@inheritDoc} */ - @Override - public int next() { - int z4 = super.next(); - - // Matsumoto-Kurita tempering to get a maximally equidistributed generator. - z4 ^= (z4 << 7) & 0x93dd1400; - z4 ^= (z4 << 15) & 0xfa118000; - - return z4; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well512a.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well512a.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well512a.java deleted file mode 100644 index ed01735..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/Well512a.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source32; - -/** - * This class implements the WELL512a pseudo-random number generator - * from François Panneton, Pierre L'Ecuyer and Makoto Matsumoto. - * <p> - * This generator is described in a paper by François Panneton, - * Pierre L'Ecuyer and Makoto Matsumoto - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf"> - * Improved Long-Period Generators Based on Linear Recurrences Modulo 2</a> - * ACM Transactions on Mathematical Software, 32, 1 (2006). - * The errata for the paper are in - * <a href="http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng-errata.txt">wellrng-errata.txt</a>. - * </p> - * - * @see <a href="http://www.iro.umontreal.ca/~panneton/WELLRNG.html">WELL Random number generator</a> - * @since 1.0 - */ -public class Well512a extends AbstractWell { - /** Number of bits in the pool. */ - private static final int K = 512; - /** First parameter of the algorithm. */ - private static final int M1 = 13; - /** Second parameter of the algorithm. */ - private static final int M2 = 9; - /** Third parameter of the algorithm. */ - private static final int M3 = 5; - /** The indirection index table. */ - private static final IndexTable TABLE = new IndexTable(K, M1, M2, M3); - - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public Well512a(int[] seed) { - super(K, seed); - } - - /** {@inheritDoc} */ - @Override - public int next() { - final int indexRm1 = TABLE.getIndexPred(index); - - final int vi = v[index]; - final int vi1 = v[TABLE.getIndexM1(index)]; - final int vi2 = v[TABLE.getIndexM2(index)]; - final int z0 = v[indexRm1]; - - // the values below include the errata of the original article - final int z1 = (vi ^ (vi << 16)) ^ (vi1 ^ (vi1 << 15)); - final int z2 = vi2 ^ (vi2 >>> 11); - final int z3 = z1 ^ z2; - final int z4 = (z0 ^ (z0 << 2)) ^ (z1 ^ (z1 << 18)) ^ (z2 << 28) ^ (z3 ^ ((z3 << 5) & 0xda442d24)); - - v[index] = z3; - v[indexRm1] = z4; - index = indexRm1; - - return z4; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/package-info.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/package-info.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/package-info.java deleted file mode 100644 index e814765..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source32/package-info.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * <h3> - * Concrete algorithms for {@code int}-based sources of randomness - * </h3> - * - * <p> - * <b>For internal use only:</b> Direct access to classes in this package - * is discouraged, as they could be modified without notice. - * </p> - * - * <p><b>Notes for developers</b></p> - * - * <ul> - * <li> - * A source of randomness must inherit from - * {@link org.apache.commons.rng.internal.source32.IntProvider} - * </li> - * <li> - * The "provider" must specify <em>one</em> way for setting the seed. - * For a given seed, the generated sequence must always be the same. - * </li> - * <li> - * The "provider" must implement methods {@code getStateInternal} and - * {@code setStateInternal} in order to save and restore the state of an - * instance (cf. {@link org.apache.commons.rng.internal.BaseProvider}). - * </li> - * <li> - * When a new class is implemented here, user-access to it must be provided - * through associated {@link org.apache.commons.rng.RandomSource - * factory methods}. - * </li> - * </ul> - */ - -package org.apache.commons.rng.internal.source32; http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/LongProvider.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/LongProvider.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/LongProvider.java deleted file mode 100644 index 1fb096d..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/LongProvider.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.rng.internal.source64; - -import org.apache.commons.rng.internal.util.NumberFactory; -import org.apache.commons.rng.internal.BaseProvider; - -/** - * Base class for all implementations that provide a {@code long}-based - * source randomness. - */ -public abstract class LongProvider - extends BaseProvider - implements RandomLongSource { - - /** {@inheritDoc} */ - @Override - public abstract long next(); - - /** {@inheritDoc} */ - @Override - public long nextLong() { - return next(); - } - - /** {@inheritDoc} */ - @Override - public int nextInt() { - return NumberFactory.makeInt(nextLong()); - } - - /** {@inheritDoc} */ - @Override - public double nextDouble() { - return NumberFactory.makeDouble(nextLong()); - } - - /** {@inheritDoc} */ - @Override - public boolean nextBoolean() { - return NumberFactory.makeBoolean(nextLong()); - } - - /** {@inheritDoc} */ - @Override - public float nextFloat() { - return NumberFactory.makeFloat(nextInt()); - } - - /** {@inheritDoc} */ - @Override - public void nextBytes(byte[] bytes) { - nextBytesFill(this, bytes, 0, bytes.length); - } - - /** {@inheritDoc} */ - @Override - public void nextBytes(byte[] bytes, - int start, - int len) { - checkIndex(0, bytes.length - 1, start); - checkIndex(0, bytes.length - start, len); - - nextBytesFill(this, bytes, start, len); - } - - /** - * Generates random bytes and places them into a user-supplied array. - * - * <p> - * The array is filled with bytes extracted from random {@code long} values. - * This implies that the number of random bytes generated may be larger than - * the length of the byte array. - * </p> - * - * @param source Source of randomness. - * @param bytes Array in which to put the generated bytes. Cannot be null. - * @param start Index at which to start inserting the generated bytes. - * @param len Number of bytes to insert. - */ - static void nextBytesFill(RandomLongSource source, - byte[] bytes, - int start, - int len) { - int index = start; // Index of first insertion. - - // Index of first insertion plus multiple of 8 part of length - // (i.e. length with 3 least significant bits unset). - final int indexLoopLimit = index + (len & 0x7ffffff8); - - // Start filling in the byte array, 8 bytes at a time. - while (index < indexLoopLimit) { - final long random = source.next(); - bytes[index++] = (byte) random; - bytes[index++] = (byte) (random >>> 8); - bytes[index++] = (byte) (random >>> 16); - bytes[index++] = (byte) (random >>> 24); - bytes[index++] = (byte) (random >>> 32); - bytes[index++] = (byte) (random >>> 40); - bytes[index++] = (byte) (random >>> 48); - bytes[index++] = (byte) (random >>> 56); - } - - final int indexLimit = start + len; // Index of last insertion + 1. - - // Fill in the remaining bytes. - if (index < indexLimit) { - long random = source.next(); - while (true) { - bytes[index++] = (byte) random; - if (index < indexLimit) { - random >>>= 8; - } else { - break; - } - } - } - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/MersenneTwister64.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/MersenneTwister64.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/MersenneTwister64.java deleted file mode 100644 index 45a70d3..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/MersenneTwister64.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.source64; - -import java.util.Arrays; -import org.apache.commons.rng.internal.util.NumberFactory; - -/** - * This class provides the 64-bits version of the originally 32-bits - * {@link org.apache.commons.rng.internal.source32.MersenneTwister - * Mersenne Twister}. - * - * <p> - * This class is mainly a Java port of - * <a href="http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt64.html"> - * the 2014/2/23 version of the generator - * </a> written in C by Takuji Nishimura and Makoto Matsumoto. - * </p> - * - * <p> - * Here is their original copyright: - * </p> - * - * <table border="0" width="80%" cellpadding="10" style="background-color: #E0E0E0" summary="Mersenne Twister licence"> - * <tr><td>Copyright (C) 2004, Makoto Matsumoto and Takuji Nishimura, - * All rights reserved.</td></tr> - * - * <tr><td>Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * <ol> - * <li>Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer.</li> - * <li>Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution.</li> - * <li>The names of its contributors may not be used to endorse or promote - * products derived from this software without specific prior written - * permission.</li> - * </ol></td></tr> - * - * <tr><td><strong>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE.</strong></td></tr> - * </table> - * - * @see <a href="https://en.wikipedia.org/wiki/Mersenne_Twister">Mersenne Twister (Wikipedia)</a> - * @since 1.0 - */ -public class MersenneTwister64 extends LongProvider { - /** Size of the bytes pool. */ - private static final int NN = 312; - /** Period second parameter. */ - private static final int MM = 156; - /** X * MATRIX_A for X = {0, 1}. */ - private static final long[] MAG01 = { 0x0, 0xb5026f5aa96619e9L }; - /** Most significant 33 bits. */ - private static final long UM = 0xffffffff80000000L; - /** Least significant 31 bits. */ - private static final long LM = 0x7fffffffL; - /** Bytes pool. */ - private long[] mt = new long[NN]; - /** Current index in the bytes pool. */ - private int mti; - - /** - * Creates a new random number generator. - * - * @param seed Initial seed. - */ - public MersenneTwister64(long[] seed) { - setSeedInternal(seed); - } - - /** {@inheritDoc} */ - @Override - protected byte[] getStateInternal() { - final long[] s = Arrays.copyOf(mt, NN + 1); - s[NN] = mti; - - return NumberFactory.makeByteArray(s); - } - - /** {@inheritDoc} */ - @Override - protected void setStateInternal(byte[] s) { - checkStateSize(s, (NN + 1) * 8); - - final long[] tmp = NumberFactory.makeLongArray(s); - System.arraycopy(tmp, 0, mt, 0, NN); - mti = (int) tmp[NN]; - } - - /** - * Initializes the generator with the given seed. - * - * @param seed Initial seed. - */ - private void setSeedInternal(long[] seed) { - if (seed.length == 0) { - // Accept empty seed. - seed = new long[1]; - } - - initState(19650218L); - int i = 1; - int j = 0; - - for (int k = Math.max(NN, seed.length); k != 0; k--) { - final long mm1 = mt[i - 1]; - mt[i] = (mt[i] ^ ((mm1 ^ (mm1 >>> 62)) * 0x369dea0f31a53f85L)) + seed[j] + j; // non linear - i++; - j++; - if (i >= NN) { - mt[0] = mt[NN - 1]; - i = 1; - } - if (j >= seed.length) { - j = 0; - } - } - for (int k = NN - 1; k != 0; k--) { - final long mm1 = mt[i - 1]; - mt[i] = (mt[i] ^ ((mm1 ^ (mm1 >>> 62)) * 0x27bb2ee687b0b0fdL)) - i; // non linear - i++; - if (i >= NN) { - mt[0] = mt[NN - 1]; - i = 1; - } - } - - mt[0] = 0x8000000000000000L; // MSB is 1; assuring non-zero initial array - } - - /** - * Initialize the internal state of this instance. - * - * @param seed Seed. - */ - private void initState(long seed) { - mt[0] = seed; - for (mti = 1; mti < NN; mti++) { - final long mm1 = mt[mti - 1]; - mt[mti] = 0x5851f42d4c957f2dL * (mm1 ^ (mm1 >>> 62)) + mti; - } - } - - /** {@inheritDoc} */ - @Override - public long next() { - long x; - - if (mti >= NN) { // generate NN words at one time - for (int i = 0; i < NN - MM; i++) { - x = (mt[i] & UM) | (mt[i + 1] & LM); - mt[i] = mt[i + MM] ^ (x >>> 1) ^ MAG01[(int)(x & 0x1L)]; - } - for (int i = NN - MM; i < NN - 1; i++) { - x = (mt[i] & UM) | (mt[i + 1] & LM); - mt[i] = mt[ i + (MM - NN)] ^ (x >>> 1) ^ MAG01[(int)(x & 0x1L)]; - } - - x = (mt[NN - 1] & UM) | (mt[0] & LM); - mt[NN - 1] = mt[MM - 1] ^ (x >>> 1) ^ MAG01[(int)(x & 0x1L)]; - - mti = 0; - } - - x = mt[mti++]; - - x ^= (x >>> 29) & 0x5555555555555555L; - x ^= (x << 17) & 0x71d67fffeda60000L; - x ^= (x << 37) & 0xfff7eee000000000L; - x ^= x >>> 43; - - return x; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/RandomLongSource.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/RandomLongSource.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/RandomLongSource.java deleted file mode 100644 index e00730d..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/RandomLongSource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.rng.internal.source64; - -/** - * Source of randomness that generates values of type {@code long}. - * - * @since 1.0 - */ -public interface RandomLongSource { - /** - * @return the next random value. - */ - long next(); -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/SplitMix64.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/SplitMix64.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/SplitMix64.java deleted file mode 100644 index 4992a4b..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/SplitMix64.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.rng.internal.source64; - -import org.apache.commons.rng.internal.util.NumberFactory; - -/** - * A fast RNG, with 64 bits of state, that can be used to initialize the - * state of other generators. - * - * @see <a href="http://xorshift.di.unimi.it/splitmix64.c"> - * Original source code</a> - * - * @since 1.0 - */ -public class SplitMix64 extends LongProvider { - /** State. */ - private long state; - - /** - * Creates a new instance. - * - * @param seed Initial seed. - */ - public SplitMix64(Long seed) { - setSeedInternal(seed); - } - - /** - * Seeds the RNG. - * - * @param seed Seed. - */ - private void setSeedInternal(Long seed) { - state = seed; - } - - /** {@inheritDoc} */ - @Override - public long next() { - long z = state += 0x9e3779b97f4a7c15L; - z = (z ^ (z >>> 30)) * 0xbf58476d1ce4e5b9L; - z = (z ^ (z >>> 27)) * 0x94d049bb133111ebL; - return z ^ (z >>> 31); - } - - /** {@inheritDoc} */ - @Override - protected byte[] getStateInternal() { - return NumberFactory.makeByteArray(state); - } - - /** {@inheritDoc} */ - @Override - protected void setStateInternal(byte[] s) { - checkStateSize(s, 8); - - state = NumberFactory.makeLong(s); - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/TwoCmres.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/TwoCmres.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/TwoCmres.java deleted file mode 100644 index 1e5eabc..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/TwoCmres.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.rng.internal.source64; - -import java.util.List; -import java.util.ArrayList; -import org.apache.commons.rng.internal.util.NumberFactory; - -/** - * Random number generator designed by Mark D. Overton. - * - * <p>It is one of the many generators described by the author in the following article series:</p> - * <ul> - * <li><a href="http://www.drdobbs.com/tools/fast-high-quality-parallel-random-number/229625477">Part one</a></li> - * <li><a href="http://www.drdobbs.com/tools/fast-high-quality-parallel-random-number/231000484">Part two</a></li> - * </ul> - * - * @since 1.0 - */ -public class TwoCmres extends LongProvider { - /** Error message. */ - private static final String INTERNAL_ERROR_MSG = "Internal error: Please file a bug report"; - /** A small positive integer. */ - private static final byte SEED_GUARD = 9; - /** Factory of instances of this class. Singleton. */ - private static final Cmres.Factory FACTORY = new Cmres.Factory(); - /** First subcycle generator. */ - private final Cmres x; - /** Second subcycle generator. */ - private final Cmres y; - /** State of first subcycle generator. */ - private long xx; - /** State of second subcycle generator. */ - private long yy; - - /** - * Creates a new instance. - * - * @param seed Initial seed. - * @param x First subcycle generator. - * @param y Second subcycle generator. - * @throws IllegalArgumentException if {@code x == y}. - */ - private TwoCmres(int seed, - Cmres x, - Cmres y) { - if (x == y) { - throw new IllegalArgumentException("Subcycle generators must be different"); - } - this.x = x; - this.y = y; - setSeedInternal(seed); - } - - /** - * Creates a new instance. - * - * @param seed Seed. - */ - public TwoCmres(Integer seed) { - this(seed, 0, 1); - } - - /** - * Creates a new instance. - * - * @param seed Seed. - * @param i Table entry for first subcycle generator. - * @param j Table entry for second subcycle generator. - * @throws IllegalArgumentException if {@code i == j}. - * @throws IndexOutOfBoundsException if {@code i < 0} or - * {@code i >= numberOfSubcycleGenerators()}. - * @throws IndexOutOfBoundsException if {@code j < 0} or - * {@code j >= numberOfSubcycleGenerators()}. - */ - public TwoCmres(Integer seed, - int i, - int j) { - this(seed, FACTORY.get(i), FACTORY.get(j)); - } - - /** {@inheritDoc} */ - @Override - public long next() { - xx = x.transform(xx); - yy = y.transform(yy); - - return xx + yy; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return super.toString() + " (" + x + " + " + y + ")"; - } - - /** - * @return the number of subcycle generators. - */ - public static int numberOfSubcycleGenerators() { - return FACTORY.numberOfSubcycleGenerators(); - } - - /** {@inheritDoc} */ - @Override - protected byte[] getStateInternal() { - return NumberFactory.makeByteArray(new long[] { xx, yy }); - } - - /** {@inheritDoc} */ - @Override - protected void setStateInternal(byte[] s) { - checkStateSize(s, 16); - - final long[] state = NumberFactory.makeLongArray(s); - xx = state[0]; - yy = state[1]; - } - - /** - * @param seed Seed. - */ - private void setSeedInternal(int seed) { - // The seeding procedure consists in going away from some - // point known to be in the cycle. - // The total number of calls to the "transform" method will - // not exceed about 130,000 (which is negligible as seeding - // will not occur more than once in normal usage). - - // Make two positive 16-bits integers. - final long s = NumberFactory.makeLong(0, seed); // s >= 0 - final int xMax = (int) (s & 0xffff + SEED_GUARD); - final int yMax = (int) ((s >> 16) + SEED_GUARD); - - if (xMax < 0 || - yMax < 0) { - throw new IllegalStateException(INTERNAL_ERROR_MSG); - } - - xx = x.getStart(); - for (int i = xMax; i > 0; i--) { - xx = x.transform(xx); - } - - yy = y.getStart(); - for (int i = yMax; i > 0; i--) { - yy = y.transform(yy); - } - } - - /** - * Subcycle generator. - * Class is immutable. - */ - static class Cmres { - /** Cycle start. */ - private final int start; - /** Multiplier. */ - private final long multiply; - /** Rotation. */ - private final int rotate; - - /** - * @param multiply Multiplier. - * @param rotate Positive number. Must be in {@code [0, 64]}. - * @param start Cycle start. - */ - Cmres(long multiply, - int rotate, - int start) { - this.multiply = multiply; - this.rotate = rotate; - this.start = start; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - final String sep = ", "; - // Use hexadecimal for "multiplier" field. - final String m = String.format((java.util.Locale) null, "0x%016xL", multiply); - return "Cmres: [" + m + sep + rotate + sep + start + "]"; - } - - /** - * @return the multiplier. - */ - public long getMultiply() { - return multiply; - } - - /** - * @return the cycle start. - */ - public int getStart() { - return start; - } - - /** - * @param state Current state. - * @return the new state. - */ - long transform(long state) { - long s = state; - s *= multiply; - s = rotl(s); - s -= state; - return s; - } - - /** - * @param state State. - * @return the rotated state. - */ - private long rotl(long state) { - return (state << rotate) | (state >>> (64 - rotate)); - } - - /** Factory. */ - static class Factory { - /** List of good "Cmres" subcycle generators. */ - private static final List<Cmres> TABLE = new ArrayList<Cmres>(); - - /** - * Populates the table. - * It lists parameters known to be good (provided in - * the article referred to above). - * To maintain compatibility, new entries must be added - * only at the end of the table. - */ - static { - add(0xedce446814d3b3d9L, 33, 0x13b572e7); - add(0xc5b3cf786c806df7L, 33, 0x13c8e18a); - add(0xdd91bbb8ab9e0e65L, 31, 0x06dd03a6); - add(0x7b69342c0790221dL, 31, 0x1646bb8b); - add(0x0c72c0d18614c32bL, 33, 0x06014a3d); - add(0xd8d98c13bebe26c9L, 33, 0x014e8475); - add(0xcb039dc328bbc40fL, 31, 0x008684bd); - add(0x858c5ef3c021ed2fL, 32, 0x0dc8d622); - add(0x4c8be96bfc23b127L, 33, 0x0b6b20cc); - add(0x11eab77f808cf641L, 32, 0x06534421); - add(0xbc9bd78810fd28fdL, 31, 0x1d9ba40d); - add(0x0f1505c780688cb5L, 33, 0x0b7b7b67); - add(0xadc174babc2053afL, 31, 0x267f4197); - add(0x900b6b82b31686d9L, 31, 0x023c6985); - // Add new entries here. - } - - /** - * @return the number of subcycle generators. - */ - int numberOfSubcycleGenerators() { - return TABLE.size(); - } - - /** - * @param index Index into the list of available generators. - * @return the subcycle generator entry at index {@code index}. - */ - Cmres get(int index) { - if (index < 0 || - index >= TABLE.size()) { - throw new IndexOutOfBoundsException("Out of interval [0, " + - (TABLE.size() - 1) + "]"); - } - - return TABLE.get(index); - } - - /** - * Adds an entry to the {@link Factory#TABLE}. - * - * @param multiply Multiplier. - * @param rotate Rotate. - * @param start Cycle start. - */ - private static void add(long multiply, - int rotate, - int start) { - // Sanity check: if there are duplicates, the class initialization - // will fail (and the JVM will report "NoClassDefFoundError"). - for (Cmres sg : TABLE) { - if (multiply == sg.getMultiply()) { - throw new IllegalStateException(INTERNAL_ERROR_MSG); - } - } - - TABLE.add(new Cmres(multiply, rotate, start)); - } - } - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/XorShift1024Star.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/XorShift1024Star.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/XorShift1024Star.java deleted file mode 100644 index 940593d..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/XorShift1024Star.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.rng.internal.source64; - -import java.util.Arrays; -import org.apache.commons.rng.internal.util.NumberFactory; - -/** - * A fast RNG. - * - * @see <a href="http://xorshift.di.unimi.it/xorshift1024star.c"> - * Original source code</a> - * - * @see <a href="https://en.wikipedia.org/wiki/Xorshift">Xorshift (Wikipedia)</a> - * @since 1.0 - */ -public class XorShift1024Star extends LongProvider { - /** Size of the state vector. */ - private static final int SEED_SIZE = 16; - /** State. */ - private final long[] state = new long[SEED_SIZE]; - /** Index in "state" array. */ - private int index; - - /** - * Creates a new instance. - * - * @param seed Initial seed. - * If the length is larger than 16, only the first 16 elements will - * be used; if smaller, the remaining elements will be automatically - * set. - */ - public XorShift1024Star(long[] seed) { - setSeedInternal(seed); - } - - /** {@inheritDoc} */ - @Override - protected byte[] getStateInternal() { - final long[] s = Arrays.copyOf(state, SEED_SIZE + 1); - s[SEED_SIZE] = index; - - return NumberFactory.makeByteArray(s); - } - - /** {@inheritDoc} */ - @Override - protected void setStateInternal(byte[] s) { - checkStateSize(s, (SEED_SIZE + 1) * 8); - - final long[] tmp = NumberFactory.makeLongArray(s); - - System.arraycopy(tmp, 0, state, 0, SEED_SIZE); - index = (int) tmp[SEED_SIZE]; - } - - /** - * Seeds the RNG. - * - * @param seed Seed. - */ - private void setSeedInternal(long[] seed) { - // Reset the whole state of this RNG (i.e. "state" and "index"). - // Filling procedure is not part of the reference code. - fillState(state, seed); - index = 0; - } - - /** {@inheritDoc} */ - @Override - public long next() { - final long s0 = state[index]; - long s1 = state[index = (index + 1) & 15]; - s1 ^= s1 << 31; // a - state[index] = s1 ^ s0 ^ (s1 >>> 11) ^ (s0 >>> 30); // b,c - return state[index] * 1181783497276652981L; - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/package-info.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/package-info.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/package-info.java deleted file mode 100644 index 41639f3..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/source64/package-info.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * <h3> - * Concrete algorithms for {@code long}-based sources of randomness - * </h3> - * - * <p> - * <b>For internal use only:</b> Direct access to classes in this package - * is discouraged, as they could be modified without notice. - * </p> - * - * <p><b>Notes for developers</b></p> - * - * <ul> - * <li> - * A source of randomness must inherit from - * {@link org.apache.commons.rng.internal.source64.LongProvider} - * </li> - * <li> - * The "provider" must specify <em>one</em> way for setting the seed. - * For a given seed, the generated sequence must always be the same. - * </li> - * <li> - * The "provider" must implement methods {@code getStateInternal} and - * {@code setStateInternal} in order to save and restore the state of an - * instance (cf. {@link org.apache.commons.rng.internal.BaseProvider}). - * </li> - * <li> - * When a new class is implemented here, user-access to it must be provided - * through associated {@link org.apache.commons.rng.RandomSource - * factory methods}. - * </li> - * </ul> - */ - -package org.apache.commons.rng.internal.source64; http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/main/java/org/apache/commons/rng/internal/util/NumberFactory.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/util/NumberFactory.java b/commons-rng-core/src/main/java/org/apache/commons/rng/internal/util/NumberFactory.java deleted file mode 100644 index 039decf..0000000 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/internal/util/NumberFactory.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.rng.internal.util; - -import java.util.Arrays; - -/** - * Utility for creating number types from one or two {@code int} values - * or one {@code long} value, or a sequence of bytes. - */ -public final class NumberFactory { - /** See {@link #makeDouble(long)}. */ - private static final long DOUBLE_HIGH_BITS = 0x3ffL << 52; - /** See {@link #makeFloat(int)}. */ - private static final float FLOAT_MULTIPLIER = 0x1.0p-23f; - /** See {@link #makeDouble(int, int)}. */ - private static final double DOUBLE_MULTIPLIER = 0x1.0p-52d; - /** Lowest byte mask. */ - private static final long LONG_LOWEST_BYTE_MASK = 0xffL; - /** Number of bytes in a {@code long}. */ - private static final int LONG_SIZE = 8; - /** Lowest byte mask. */ - private static final int INT_LOWEST_BYTE_MASK = 0xff; - /** Number of bytes in a {@code int}. */ - private static final int INT_SIZE = 4; - - /** - * Class contains only static methods. - */ - private NumberFactory() {} - - /** - * @param v Number. - * @return a boolean. - */ - public static boolean makeBoolean(int v) { - return (v >>> 31) != 0; - } - - /** - * @param v Number. - * @return a boolean. - */ - public static boolean makeBoolean(long v) { - return (v >>> 63) != 0; - } - - /** - * @param v Number. - * @return a {@code double} value in the interval {@code [0, 1]}. - */ - public static double makeDouble(long v) { - // http://xorshift.di.unimi.it - return Double.longBitsToDouble(DOUBLE_HIGH_BITS | v >>> 12) - 1d; - } - - /** - * @param v Number (high order bits). - * @param w Number (low order bits). - * @return a {@code double} value in the interval {@code [0, 1]}. - */ - public static double makeDouble(int v, - int w) { - final long high = ((long) (v >>> 6)) << 26; - final int low = w >>> 6; - return (high | low) * DOUBLE_MULTIPLIER; - } - - /** - * @param v Number. - * @return a {@code float} value in the interval {@code [0, 1]}. - */ - public static float makeFloat(int v) { - return (v >>> 9) * FLOAT_MULTIPLIER; - } - - /** - * @param v Number (high order bits). - * @param w Number (low order bits). - * @return a {@code long} value. - */ - public static long makeLong(int v, - int w) { - return (((long) v) << 32) | (w & 0xffffffffL); - } - - /** - * Creates an {@code int} from a {@code long}. - * - * @param v Number. - * @return an {@code int} value made from the "xor" of the - * {@link #extractHi(long) high order bits} and - * {@link #extractLo(long) low order bits} of {@code v}. - */ - public static int makeInt(long v) { - return extractHi(v) ^ extractLo(v); - } - - /** - * Creates an {@code int} from a {@code long}, using the high order bits. - * - * <p>The returned value is such that if</p> - * <pre><code> - * vL = extractLo(v); - * vH = extractHi(v); - * </code></pre> - * - * <p>then {@code v} is equal to {@link #makeLong(int,int) makeLong(vH, vL)}.</p> - * - * @param v Number. - * @return an {@code int} value made from the most significant bits - * of {@code v}. - */ - public static int extractHi(long v) { - return (int) (v >>> 32); - } - - /** - * Creates an {@code int} from a {@code long}, using the low order bits. - * - * <p>The returned value is such that if</p> - * - * <pre><code> - * vL = extractLo(v); - * vH = extractHi(v); - * </code></pre> - * - * <p>then {@code v} is equal to {@link #makeLong(int,int) makeLong(vH, vL)}.</p> - * - * @param v Number. - * @return an {@code int} value made from the least significant bits - * of {@code v}. - */ - public static int extractLo(long v) { - return (int) v; - } - - /** - * Splits a {@code long} into 8 bytes. - * - * @param v Value. - * @return the bytes that compose the given value (least-significant - * byte first). - */ - public static byte[] makeByteArray(long v) { - final byte[] b = new byte[LONG_SIZE]; - - for (int i = 0; i < LONG_SIZE; i++) { - final int shift = i * 8; - b[i] = (byte) ((v >>> shift) & LONG_LOWEST_BYTE_MASK); - } - - return b; - } - - /** - * Creates a {@code long} from 8 bytes. - * - * @param input Input. - * @return the value that correspond to the given bytes assuming - * that the is ordered in increasing byte significance (i.e. the - * first byte in the array is the least-siginficant). - * @throws IllegalArgumentException if {@code input.length != 8}. - */ - public static long makeLong(byte[] input) { - checkSize(LONG_SIZE, input.length); - - long v = 0; - for (int i = 0; i < LONG_SIZE; i++) { - final int shift = i * 8; - v |= (((long) input[i]) & LONG_LOWEST_BYTE_MASK) << shift; - } - - return v; - } - - /** - * Splits an array of {@code long} values into a sequence of bytes. - * This method calls {@link #makeByteArray(long)} for each element of - * the {@code input}. - * - * @param input Input. - * @return an array of bytes. - */ - public static byte[] makeByteArray(long[] input) { - final int size = input.length * LONG_SIZE; - final byte[] b = new byte[size]; - - for (int i = 0; i < input.length; i++) { - final byte[] current = makeByteArray(input[i]); - System.arraycopy(current, 0, b, i * LONG_SIZE, LONG_SIZE); - } - - return b; - } - - /** - * Creates an array of {@code long} values from a sequence of bytes. - * This method calls {@link #makeLong(byte[])} for each subsequence - * of 8 bytes. - * - * @param input Input. - * @return an array of {@code long}. - * @throws IllegalArgumentException if {@code input.length} is not - * a multiple of 8. - */ - public static long[] makeLongArray(byte[] input) { - final int size = input.length; - final int num = size / LONG_SIZE; - checkSize(num * LONG_SIZE, size); - - final long[] output = new long[num]; - for (int i = 0; i < num; i++) { - final int from = i * LONG_SIZE; - final byte[] current = Arrays.copyOfRange(input, from, from + LONG_SIZE); - output[i] = makeLong(current); - } - - return output; - } - - /** - * Splits an {@code int} into 4 bytes. - * - * @param v Value. - * @return the bytes that compose the given value (least-significant - * byte first). - */ - public static byte[] makeByteArray(int v) { - final byte[] b = new byte[INT_SIZE]; - - for (int i = 0; i < INT_SIZE; i++) { - final int shift = i * 8; - b[i] = (byte) ((v >>> shift) & INT_LOWEST_BYTE_MASK); - } - - return b; - } - - /** - * Creates an {@code int} from 4 bytes. - * - * @param input Input. - * @return the value that correspond to the given bytes assuming - * that the is ordered in increasing byte significance (i.e. the - * first byte in the array is the least-siginficant). - * @throws IllegalArgumentException if {@code input.length != 4}. - */ - public static int makeInt(byte[] input) { - checkSize(INT_SIZE, input.length); - - int v = 0; - for (int i = 0; i < INT_SIZE; i++) { - final int shift = i * 8; - v |= (((int) input[i]) & INT_LOWEST_BYTE_MASK) << shift; - } - - return v; - } - - /** - * Splits an array of {@code int} values into a sequence of bytes. - * This method calls {@link #makeByteArray(int)} for each element of - * the {@code input}. - * - * @param input Input. - * @return an array of bytes. - */ - public static byte[] makeByteArray(int[] input) { - final int size = input.length * INT_SIZE; - final byte[] b = new byte[size]; - - for (int i = 0; i < input.length; i++) { - final byte[] current = makeByteArray(input[i]); - System.arraycopy(current, 0, b, i * INT_SIZE, INT_SIZE); - } - - return b; - } - - /** - * Creates an array of {@code int} values from a sequence of bytes. - * This method calls {@link #makeInt(byte[])} for each subsequence - * of 4 bytes. - * - * @param input Input. Length must be a multiple of 4. - * @return an array of {@code int}. - * @throws IllegalArgumentException if {@code input.length} is not - * a multiple of 4. - */ - public static int[] makeIntArray(byte[] input) { - final int size = input.length; - final int num = size / INT_SIZE; - checkSize(num * INT_SIZE, size); - - final int[] output = new int[num]; - for (int i = 0; i < num; i++) { - final int from = i * INT_SIZE; - final byte[] current = Arrays.copyOfRange(input, from, from + INT_SIZE); - output[i] = makeInt(current); - } - - return output; - } - - /** - * @param expected Expected value. - * @param actual Actual value. - * @throw IllegalArgumentException if {@code expected != actual}. - */ - private static void checkSize(int expected, - int actual) { - if (expected != actual) { - throw new IllegalArgumentException("Array size: Expected " + expected + - " but was " + actual); - } - } -} http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java b/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java index 014574d..6adc820 100644 --- a/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java +++ b/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersCommonParametricTest.java @@ -34,7 +34,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; -import org.apache.commons.rng.internal.RandomProviderDefaultState; +import org.apache.commons.rng.core.RandomProviderDefaultState; /** * Tests which all generators must pass. @@ -593,7 +593,7 @@ public class ProvidersCommonParametricTest { /** * Dummy class for checking that restoring fails when an invalid state is used. */ -class DummyGenerator extends org.apache.commons.rng.internal.source32.IntProvider { +class DummyGenerator extends org.apache.commons.rng.core.source32.IntProvider { /** {@inheritDoc} */ @Override public int next() { http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ec3720f2/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersList.java ---------------------------------------------------------------------- diff --git a/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersList.java b/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersList.java index c604cfc..e5e364f 100644 --- a/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersList.java +++ b/commons-rng-core/src/test/java/org/apache/commons/rng/ProvidersList.java @@ -21,21 +21,21 @@ import java.util.List; import java.util.ArrayList; import java.util.Collections; -import org.apache.commons.rng.internal.source32.JDKRandom; -import org.apache.commons.rng.internal.source32.Well512a; -import org.apache.commons.rng.internal.source32.Well1024a; -import org.apache.commons.rng.internal.source32.Well19937a; -import org.apache.commons.rng.internal.source32.Well19937c; -import org.apache.commons.rng.internal.source32.Well44497a; -import org.apache.commons.rng.internal.source32.Well44497b; -import org.apache.commons.rng.internal.source32.ISAACRandom; -import org.apache.commons.rng.internal.source32.MersenneTwister; -import org.apache.commons.rng.internal.source32.MultiplyWithCarry256; -import org.apache.commons.rng.internal.source32.KISSRandom; -import org.apache.commons.rng.internal.source64.SplitMix64; -import org.apache.commons.rng.internal.source64.XorShift1024Star; -import org.apache.commons.rng.internal.source64.TwoCmres; -import org.apache.commons.rng.internal.source64.MersenneTwister64; +import org.apache.commons.rng.core.source32.JDKRandom; +import org.apache.commons.rng.core.source32.Well512a; +import org.apache.commons.rng.core.source32.Well1024a; +import org.apache.commons.rng.core.source32.Well19937a; +import org.apache.commons.rng.core.source32.Well19937c; +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.MultiplyWithCarry256; +import org.apache.commons.rng.core.source32.KISSRandom; +import org.apache.commons.rng.core.source64.SplitMix64; +import org.apache.commons.rng.core.source64.XorShift1024Star; +import org.apache.commons.rng.core.source64.TwoCmres; +import org.apache.commons.rng.core.source64.MersenneTwister64; /** * The purpose of this class is to provide the list of all generators
