LCG64ShiftRandom.java
001 /*
002  * Java Genetic Algorithm Library (jenetics-3.0.0).
003  * Copyright (c) 2007-2014 Franz Wilhelmstötter
004  *
005  * Licensed under the Apache License, Version 2.0 (the "License");
006  * you may not use this file except in compliance with the License.
007  * You may obtain a copy of the License at
008  *
009  *      http://www.apache.org/licenses/LICENSE-2.0
010  *
011  * Unless required by applicable law or agreed to in writing, software
012  * distributed under the License is distributed on an "AS IS" BASIS,
013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014  * See the License for the specific language governing permissions and
015  * limitations under the License.
016  *
017  * Author:
018  *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmx.at)
019  */
020 package org.jenetics.util;
021 
022 import static java.lang.String.format;
023 import static java.util.Objects.requireNonNull;
024 import static org.jenetics.internal.util.Equality.eq;
025 
026 import java.io.Serializable;
027 
028 import org.jenetics.internal.math.arithmetic;
029 import org.jenetics.internal.math.random;
030 import org.jenetics.internal.util.Equality;
031 import org.jenetics.internal.util.Hash;
032 
033 /**
034  * This class implements a linear congruential PRNG with additional bit-shift
035  * transition. The base recursion
036  <p>
037  <img
038  *     alt="r_{i+1} = (a\cdot r_i + b) \mod 2^{64}"
039  *     src="doc-files/lcg-recursion.gif"
040  * >
041  </p>
042  * is followed by a non-linear transformation
043  <p>
044  <img
045  *     alt="\begin{eqnarray*}
046  *           t &=& r_i                \\
047  *           t &=& t \oplus (t >> 17) \\
048  *           t &=& t \oplus (t << 31) \\
049  *           t &=& t \oplus (t >> 8)
050  *         \end{eqnarray*}"
051  *     src="doc-files/lcg-non-linear.gif"
052  * >
053  </p>
054  * which destroys the lattice structure introduced by the recursion. The period
055  * of this PRNG is 2<sup>64</sup>, {@code iff} <i>b</i> is odd and <i>a</i>
056  * {@code mod} 4 = 1.
057  <p>
058  *
059  <em>
060  * This is an re-implementation of the
061  * <a href="https://github.com/rabauke/trng4/blob/master/src/lcg64_shift.hpp">
062  * trng::lcg64_shift</a> PRNG class of the
063  * <a href="http://numbercrunch.de/trng/">TRNG</a> library created by Heiko
064  * Bauke.</em>
065  *
066  <p>
067  <strong>Not that the base implementation of the {@code LCG64ShiftRandom}
068  * class is not thread-safe.</strong> If multiple threads requests random
069  * numbers from this class, it <i>must</i> be synchronized externally.
070  * Alternatively you can use the thread-safe implementations
071  {@link LCG64ShiftRandom.ThreadSafe} or {@link LCG64ShiftRandom.ThreadLocal}.
072  *
073  @see <a href="http://numbercrunch.de/trng/">TRNG</a>
074  @see RandomRegistry
075  *
076  @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
077  @since 1.1
078  @version 2.0 &mdash; <em>$Date: 2014-12-28 $</em>
079  */
080 public class LCG64ShiftRandom extends Random64 {
081 
082     private static final long serialVersionUID = 1L;
083 
084     /**
085      * This class represents a <i>thread local</i> implementation of the
086      * {@code LCG64ShiftRandom} PRNG.
087      *
088      * It's recommended to initialize the {@code RandomRegistry} the following
089      * way:
090      *
091      * [code]
092      * // Register the PRNG with the default parameters.
093      * RandomRegistry.setRandom(new LCG64ShiftRandom.ThreadLocal());
094      *
095      * // Register the PRNG with the {@code LECUYER3} parameters.
096      * RandomRegistry.setRandom(new LCG64ShiftRandom.ThreadLocal(
097      *     LCG64ShiftRandom.LECUYER3
098      * ));
099      * [/code]
100      *
101      * Be aware, that calls of the {@code setSeed(long)} method will throw an
102      * {@code UnsupportedOperationException} for <i>thread local</i> instances.
103      * [code]
104      * RandomRegistry.setRandom(new LCG64ShiftRandom.ThreadLocal());
105      *
106      * // Will throw 'UnsupportedOperationException'.
107      * RandomRegistry.getRandom().setSeed(1234);
108      * [/code]
109      *
110      @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
111      @since 1.1
112      @version 3.0 &mdash; <em>$Date: 2014-12-28 $</em>
113      */
114     public static final class ThreadLocal
115         extends java.lang.ThreadLocal<LCG64ShiftRandom>
116     {
117         private static final long STEP_BASE = 1L << 56;
118 
119         private int _block = 0;
120         private long _seed = random.seed();
121 
122         private final Param _param;
123 
124         /**
125          * Create a new <i>thread local</i> instance of the
126          * {@code LCG64ShiftRandom} PRNG with the {@code DEFAULT} parameters.
127          */
128         public ThreadLocal() {
129             this(Param.DEFAULT);
130         }
131 
132         /**
133          * Create a new <i>thread local</i> instance of the
134          * {@code LCG64ShiftRandom} PRNG with the given parameters.
135          *
136          @param param the LC parameters.
137          @throws NullPointerException if the given parameters are null.
138          */
139         public ThreadLocal(final Param param) {
140             _param = requireNonNull(param, "PRNG param must not be null.");
141         }
142 
143         /**
144          * Create a new PRNG using <i>block splitting</i> for guaranteeing well
145          * distributed PRN for every thread.
146          *
147          <p>
148          <strong>Tina’s Random Number Generator Library</strong>
149          <br>
150          <em>Chapter 2. Pseudo-random numbers for parallel Monte Carlo
151          *     simulations, Page 7</em>
152          <br>
153          <small>Heiko Bauke</small>
154          <br>
155          * [<a href="http://numbercrunch.de/trng/trng.pdf">
156          *  http://numbercrunch.de/trng/trng.pdf
157          *  </a>].
158          */
159         @Override
160         protected synchronized LCG64ShiftRandom initialValue() {
161             if (_block > 127) {
162                 _block = 0;
163                 _seed = random.seed();
164             }
165 
166             final LCG64ShiftRandom random = new TLLCG64ShiftRandom(_seed, _param);
167             random.jump((_block++)*STEP_BASE);
168             return random;
169         }
170 
171     }
172 
173     private static final class TLLCG64ShiftRandom extends LCG64ShiftRandom {
174 
175         private static final long serialVersionUID = 1L;
176 
177         private final Boolean _sentry = Boolean.TRUE;
178 
179         private TLLCG64ShiftRandom(final long seed, final Param param) {
180             super(param, seed);
181         }
182 
183         @Override
184         public void setSeed(final long seed) {
185             if (_sentry != null) {
186                 throw new UnsupportedOperationException(
187                     "The 'setSeed(long)' method is not supported " +
188                     "for thread local instances."
189                 );
190             }
191         }
192 
193     }
194 
195     /**
196      * This is a <i>thread safe</i> variation of the this PRNG&mdash;by
197      * synchronizing the random number generation.
198      *
199      @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
200      @since 1.1
201      @version 3.0 &mdash; <em>$Date: 2014-12-28 $</em>
202      */
203     public static final class ThreadSafe extends LCG64ShiftRandom {
204         private static final long serialVersionUID = 1L;
205 
206         /**
207          * Create a new PRNG instance with the given parameter and seed.
208          *
209          @param seed the seed of the PRNG.
210          @param param the parameter of the PRNG.
211          @throws NullPointerException if the given {@code param} is null.
212          */
213         public ThreadSafe(final long seed, final Param param) {
214             super(param, seed);
215         }
216 
217         /**
218          * Create a new PRNG instance with {@link Param#DEFAULT} parameter and
219          * the given seed.
220          *
221          @param seed the seed of the PRNG
222          */
223         public ThreadSafe(final long seed) {
224             this(seed, Param.DEFAULT);
225         }
226 
227         /**
228          * Create a new PRNG instance with the given parameter and a safe
229          * default seed.
230          *
231          @param param the PRNG parameter.
232          @throws NullPointerException if the given {@code param} is null.
233          */
234         public ThreadSafe(final Param param) {
235             this(random.seed(), param);
236         }
237 
238         /**
239          * Create a new PRNG instance with {@link Param#DEFAULT} parameter and
240          * a safe seed.
241          */
242         public ThreadSafe() {
243             this(random.seed(), Param.DEFAULT);
244         }
245 
246         @Override
247         public synchronized void setSeed(final long seed) {
248             super.setSeed(seed);
249         }
250 
251         @Override
252         public synchronized long nextLong() {
253             return super.nextLong();
254         }
255 
256         @Override
257         public synchronized void split(final int p, final int s) {
258             super.split(p, s);
259         }
260 
261         @Override
262         public synchronized void jump2(final int s) {
263             super.jump2(s);
264         }
265 
266         @Override
267         public synchronized void jump(final long step) {
268             super.jump(step);
269         }
270 
271     }
272 
273     /**
274      * Parameter class for the {@code LCG64ShiftRandom} generator, for the
275      * parameters <i>a</i> and <i>b</i> of the LC recursion
276      <i>r<sub>i+1</sub> = a · r<sub>i</sub> + b</i> mod <i>2<sup>64</sup></i>.
277      *
278      @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
279      @since 1.1
280      @version 2.0 &mdash; <em>$Date: 2014-12-28 $</em>
281      */
282     public static final class Param implements Serializable {
283 
284         private static final long serialVersionUID = 1L;
285 
286         /**
287          * The default PRNG parameters: a = 0xFBD19FBBC5C07FF5L; b = 1
288          */
289         public static final Param DEFAULT = Param.of(0xFBD19FBBC5C07FF5L1L);
290 
291         /**
292          * LEcuyer 1 parameters: a = 0x27BB2EE687B0B0FDL; b = 1
293          */
294         public static final Param LECUYER1 = Param.of(0x27BB2EE687B0B0FDL1L);
295 
296         /**
297          * LEcuyer 2 parameters: a = 0x2C6FE96EE78B6955L; b = 1
298          */
299         public static final Param LECUYER2 = Param.of(0x2C6FE96EE78B6955L1L);
300 
301         /**
302          * LEcuyer 3 parameters: a = 0x369DEA0F31A53F85L; b = 1
303          */
304         public static final Param LECUYER3 = Param.of(0x369DEA0F31A53F85L1L);
305 
306 
307         /**
308          * The parameter <i>a</i> of the LC recursion.
309          */
310         public final long a;
311 
312         /**
313          * The parameter <i>b</i> of the LC recursion.
314          */
315         public final long b;
316 
317         /**
318          * Create a new parameter object.
319          *
320          @param a the parameter <i>a</i> of the LC recursion.
321          @param b the parameter <i>b</i> of the LC recursion.
322          */
323         private Param(final long a, final long b) {
324             this.a = a;
325             this.b = b;
326         }
327 
328         public static Param of(final long a, final long b) {
329             return new Param(a, b);
330         }
331 
332         @Override
333         public int hashCode() {
334             return 31*(int)(a^(a >>> 32)) 31*(int)(b^(b >>> 32));
335         }
336 
337         @Override
338         public boolean equals(final Object obj) {
339             return Equality.of(this, obj).test(p -> a == p.a && b == p.b);
340         }
341 
342         @Override
343         public String toString() {
344             return format("%s[a=%d, b=%d]", getClass().getName(), a, b);
345         }
346     }
347 
348     /**
349      * Represents the state of this random engine
350      */
351     private final static class State implements Serializable {
352         private static final long serialVersionUID = 1L;
353 
354         long _r;
355 
356         State(final long seed) {
357             setSeed(seed);
358         }
359 
360         void setSeed(final long seed) {
361             _r = seed;
362         }
363 
364         @Override
365         public int hashCode() {
366             return Hash.of(getClass()).and(_r).value();
367         }
368 
369         @Override
370         public boolean equals(final Object obj) {
371             return Equality.of(this, obj).test(state -> state._r == _r);
372         }
373 
374         @Override
375         public String toString() {
376             return format("State[%d]", _r);
377         }
378     }
379 
380 
381     private Param _param;
382     private final State _state;
383 
384     /**
385      * Create a new PRNG instance with the given parameter and seed.
386      *
387      @param param the parameter of the PRNG.
388      @param seed the seed of the PRNG.
389      @throws NullPointerException if the given {@code param} is null.
390      */
391     public LCG64ShiftRandom(final Param param, final long seed) {
392         _param = requireNonNull(param, "PRNG param must not be null.");
393         _state = new State(seed);
394     }
395 
396     /**
397      * Create a new PRNG instance with the given parameter and a safe seed
398      *
399      @param param the PRNG parameter.
400      @throws NullPointerException if the given {@code param} is null.
401      */
402     public LCG64ShiftRandom(final Param param) {
403         this(param, random.seed());
404     }
405 
406     /**
407      * Create a new PRNG instance with {@link Param#DEFAULT} parameter and the
408      * given seed.
409      *
410      @param seed the seed of the PRNG
411      */
412     public LCG64ShiftRandom(final long seed) {
413         this(Param.DEFAULT, seed);
414     }
415 
416     /**
417      * Create a new PRNG instance with {@link Param#DEFAULT} parameter and safe
418      * seed.
419      */
420     public LCG64ShiftRandom() {
421         this(Param.DEFAULT, random.seed());
422     }
423 
424     @Override
425     public long nextLong() {
426         step();
427 
428         long t = _state._r;
429         t ^= t >>> 17;
430         t ^= t << 31;
431         t ^= t >>> 8;
432         return t;
433     }
434 
435     private void step() {
436         _state._r = _param.a*_state._r + _param.b;
437     }
438 
439     @Override
440     public void setSeed(final long seed) {
441         if (_state != null_state.setSeed(seed);
442     }
443 
444     /**
445      * Changes the internal state of the PRNG in a way that future calls to
446      {@link #nextLong()} will generated the s<sup>th</sup> sub-stream of
447      * p<sup>th</sup> sub-streams. <i>s</i> must be within the range of
448      * {@code [0, p-1)}. This method is mainly used for <i>parallelization</i>
449      * via <i>leap-frogging</i>.
450      *
451      @param p the overall number of sub-streams
452      @param s the s<sup>th</sup> sub-stream
453      @throws IllegalArgumentException if {@code p < 1 || s >= p}.
454      */
455     public void split(final int p, final int s) {
456         if (p < 1) {
457             throw new IllegalArgumentException(format(
458                 "p must be >= 1 but was %d.", p
459             ));
460         }
461         if (s >= p) {
462             throw new IllegalArgumentException(format(
463                 "s must be < %d but was %d.", p, s
464             ));
465         }
466 
467         if (p > 1) {
468             jump(s + 1);
469             final long b = _param.b*f(p, _param.a);
470             final long a = arithmetic.pow(_param.a, p);
471             _param = Param.of(a, b);
472             backward();
473         }
474     }
475 
476     /**
477      * Changes the internal state of the PRNG in such a way that the engine
478      <i>jumps</i> 2<sup>s</sup> steps ahead.
479      *
480      @param s the 2<sup>s</sup> steps to jump ahead.
481      @throws IllegalArgumentException if {@code s < 0}.
482      */
483     public void jump2(final int s) {
484         if (s < 0) {
485             throw new IllegalArgumentException(format(
486                 "s must be positive but was %d.", s
487             ));
488         }
489 
490         if (s >= Long.SIZE) {
491             throw new IllegalArgumentException(format(
492                 "The 'jump2' size must be smaller than %d but was %d.",
493                 Long.SIZE, s
494             ));
495         }
496 
497         _state._r = _state._r*arithmetic.pow(_param.a, 1L << s+
498                     f(1L << s, _param.a)*_param.b;
499     }
500 
501     /**
502      * Changes the internal state of the PRNG in such a way that the engine
503      <i>jumps</i> s steps ahead.
504      *
505      @param step the steps to jump ahead.
506      @throws IllegalArgumentException if {@code s < 0}.
507      */
508     public void jump(final long step) {
509         if (step < 0) {
510             throw new IllegalArgumentException(format(
511                 "step must be positive but was %d", step
512             ));
513         }
514 
515         if (step < 16) {
516             for (int i = 0; i < step; ++i) {
517                 step();
518             }
519         else {
520             long s = step;
521             int i = 0;
522             while (s > 0) {
523                 if (s%== 1) {
524                     jump2(i);
525                 }
526                 ++i;
527                 s >>= 1;
528             }
529         }
530     }
531 
532     private void backward() {
533         for (int i = 0; i < Long.SIZE; ++i) {
534             jump2(i);
535         }
536     }
537 
538     public Param getParam() {
539         return _param;
540     }
541 
542     @Override
543     public int hashCode() {
544         return Hash.of(getClass())
545             .and(_param)
546             .and(_state).value();
547     }
548 
549     @Override
550     public boolean equals(final Object obj) {
551         return Equality.of(this, obj).test(random ->
552             eq(_param, random._param&&
553             eq(_state, random._state)
554         );
555     }
556 
557     @Override
558     public String toString() {
559         return format("%s[%s, %s]", getClass().getSimpleName(), _param, _state);
560     }
561 
562 
563 
564     /* *************************************************************************
565      * Some static helper methods
566      ***************************************************************************/
567 
568     /**
569      * Compute prod(1+a^(2^i), i=0..l-1).
570      */
571     private static long g(final int l, final long a) {
572         long p = a;
573         long res = 1;
574         for (int i = 0; i < l; ++i) {
575             res *= + p;
576             p *= p;
577         }
578 
579         return res;
580     }
581 
582     /**
583      * Compute sum(a^i, i=0..s-1).
584      */
585     private static long f(final long s, final long a) {
586         long y = 0;
587 
588         if (s != 0) {
589             long e = log2Floor(s);
590             long p = a;
591 
592             for (int l = 0; l <= e; ++l) {
593                 if (((1L << l& s!= 0) {
594                     y = g(l, a+ p*y;
595                 }
596                 p *= p;
597             }
598         }
599 
600         return y;
601     }
602 
603     private static long log2Floor(final long s) {
604         long x = s;
605         long y = 0;
606 
607         while (x != 0) {
608             x >>>= 1;
609             ++y;
610         }
611 
612         return y - 1;
613     }
614 
615 }
616 
617 /*
618 #=============================================================================#
619 # Testing: org.jenetics.util.LCG64ShiftRandom (2014-12-22 20:06)              #
620 #=============================================================================#
621 #=============================================================================#
622 # Linux 3.16.0-28-generic (amd64)                                             #
623 # java version "1.8.0_25"                                                     #
624 # Java(TM) SE Runtime Environment (build 1.8.0_25-b17)                        #
625 # Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02)                         #
626 #=============================================================================#
627 #=============================================================================#
628 #            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
629 #=============================================================================#
630    rng_name    |rands/second|   Seed   |
631 stdin_input_raw|  3.36e+07  | 995404065|
632 #=============================================================================#
633         test_name   |ntup| tsamples |psamples|  p-value |Assessment
634 #=============================================================================#
635    diehard_birthdays|   0|       100|     100|0.88513397|  PASSED
636       diehard_operm5|   0|   1000000|     100|0.62485774|  PASSED
637   diehard_rank_32x32|   0|     40000|     100|0.25787172|  PASSED
638     diehard_rank_6x8|   0|    100000|     100|0.82310594|  PASSED
639    diehard_bitstream|   0|   2097152|     100|0.25410565|  PASSED
640         diehard_opso|   0|   2097152|     100|0.27994196|  PASSED
641         diehard_oqso|   0|   2097152|     100|0.29423503|  PASSED
642          diehard_dna|   0|   2097152|     100|0.94754044|  PASSED
643 diehard_count_1s_str|   0|    256000|     100|0.54264055|  PASSED
644 diehard_count_1s_byt|   0|    256000|     100|0.22965023|  PASSED
645  diehard_parking_lot|   0|     12000|     100|0.45602493|  PASSED
646     diehard_2dsphere|   2|      8000|     100|0.78207294|  PASSED
647     diehard_3dsphere|   3|      4000|     100|0.04516364|  PASSED
648      diehard_squeeze|   0|    100000|     100|0.90977421|  PASSED
649         diehard_sums|   0|       100|     100|0.00384163|   WEAK
650         diehard_runs|   0|    100000|     100|0.58757856|  PASSED
651         diehard_runs|   0|    100000|     100|0.68126568|  PASSED
652        diehard_craps|   0|    200000|     100|0.98405727|  PASSED
653        diehard_craps|   0|    200000|     100|0.43748297|  PASSED
654  marsaglia_tsang_gcd|   0|  10000000|     100|0.99909354|   WEAK
655  marsaglia_tsang_gcd|   0|  10000000|     100|0.42705390|  PASSED
656          sts_monobit|   1|    100000|     100|0.05277954|  PASSED
657             sts_runs|   2|    100000|     100|0.74724764|  PASSED
658           sts_serial|   1|    100000|     100|0.53431948|  PASSED
659           sts_serial|   2|    100000|     100|0.45235557|  PASSED
660           sts_serial|   3|    100000|     100|0.59547923|  PASSED
661           sts_serial|   3|    100000|     100|0.13653712|  PASSED
662           sts_serial|   4|    100000|     100|0.88745241|  PASSED
663           sts_serial|   4|    100000|     100|0.75849526|  PASSED
664           sts_serial|   5|    100000|     100|0.63956697|  PASSED
665           sts_serial|   5|    100000|     100|0.50638398|  PASSED
666           sts_serial|   6|    100000|     100|0.50970181|  PASSED
667           sts_serial|   6|    100000|     100|0.74301220|  PASSED
668           sts_serial|   7|    100000|     100|0.72536115|  PASSED
669           sts_serial|   7|    100000|     100|0.42918461|  PASSED
670           sts_serial|   8|    100000|     100|0.51745297|  PASSED
671           sts_serial|   8|    100000|     100|0.27665980|  PASSED
672           sts_serial|   9|    100000|     100|0.07219154|  PASSED
673           sts_serial|   9|    100000|     100|0.16007881|  PASSED
674           sts_serial|  10|    100000|     100|0.68864336|  PASSED
675           sts_serial|  10|    100000|     100|0.64663821|  PASSED
676           sts_serial|  11|    100000|     100|0.51544583|  PASSED
677           sts_serial|  11|    100000|     100|0.04750204|  PASSED
678           sts_serial|  12|    100000|     100|0.98324239|  PASSED
679           sts_serial|  12|    100000|     100|0.73888233|  PASSED
680           sts_serial|  13|    100000|     100|0.99796458|   WEAK
681           sts_serial|  13|    100000|     100|0.57405237|  PASSED
682           sts_serial|  14|    100000|     100|0.99820199|   WEAK
683           sts_serial|  14|    100000|     100|0.74966215|  PASSED
684           sts_serial|  15|    100000|     100|0.66130491|  PASSED
685           sts_serial|  15|    100000|     100|0.27502970|  PASSED
686           sts_serial|  16|    100000|     100|0.76403577|  PASSED
687           sts_serial|  16|    100000|     100|0.77906323|  PASSED
688          rgb_bitdist|   1|    100000|     100|0.85986918|  PASSED
689          rgb_bitdist|   2|    100000|     100|0.19194081|  PASSED
690          rgb_bitdist|   3|    100000|     100|0.37765353|  PASSED
691          rgb_bitdist|   4|    100000|     100|0.40284131|  PASSED
692          rgb_bitdist|   5|    100000|     100|0.63742901|  PASSED
693          rgb_bitdist|   6|    100000|     100|0.81457600|  PASSED
694          rgb_bitdist|   7|    100000|     100|0.98271991|  PASSED
695          rgb_bitdist|   8|    100000|     100|0.74518833|  PASSED
696          rgb_bitdist|   9|    100000|     100|0.25408860|  PASSED
697          rgb_bitdist|  10|    100000|     100|0.71098196|  PASSED
698          rgb_bitdist|  11|    100000|     100|0.32293476|  PASSED
699          rgb_bitdist|  12|    100000|     100|0.64350515|  PASSED
700 rgb_minimum_distance|   2|     10000|    1000|0.61947836|  PASSED
701 rgb_minimum_distance|   3|     10000|    1000|0.60592190|  PASSED
702 rgb_minimum_distance|   4|     10000|    1000|0.25531102|  PASSED
703 rgb_minimum_distance|   5|     10000|    1000|0.69122761|  PASSED
704     rgb_permutations|   2|    100000|     100|0.80529402|  PASSED
705     rgb_permutations|   3|    100000|     100|0.02362682|  PASSED
706     rgb_permutations|   4|    100000|     100|0.38540180|  PASSED
707     rgb_permutations|   5|    100000|     100|0.41191808|  PASSED
708       rgb_lagged_sum|   0|   1000000|     100|0.10725403|  PASSED
709       rgb_lagged_sum|   1|   1000000|     100|0.28049411|  PASSED
710       rgb_lagged_sum|   2|   1000000|     100|0.94452071|  PASSED
711       rgb_lagged_sum|   3|   1000000|     100|0.24582457|  PASSED
712       rgb_lagged_sum|   4|   1000000|     100|0.32474902|  PASSED
713       rgb_lagged_sum|   5|   1000000|     100|0.62662596|  PASSED
714       rgb_lagged_sum|   6|   1000000|     100|0.05315903|  PASSED
715       rgb_lagged_sum|   7|   1000000|     100|0.87896717|  PASSED
716       rgb_lagged_sum|   8|   1000000|     100|0.49840401|  PASSED
717       rgb_lagged_sum|   9|   1000000|     100|0.34628462|  PASSED
718       rgb_lagged_sum|  10|   1000000|     100|0.60873298|  PASSED
719       rgb_lagged_sum|  11|   1000000|     100|0.55503249|  PASSED
720       rgb_lagged_sum|  12|   1000000|     100|0.04282574|  PASSED
721       rgb_lagged_sum|  13|   1000000|     100|0.91309214|  PASSED
722       rgb_lagged_sum|  14|   1000000|     100|0.34015015|  PASSED
723       rgb_lagged_sum|  15|   1000000|     100|0.13777151|  PASSED
724       rgb_lagged_sum|  16|   1000000|     100|0.94326616|  PASSED
725       rgb_lagged_sum|  17|   1000000|     100|0.55337305|  PASSED
726       rgb_lagged_sum|  18|   1000000|     100|0.07791838|  PASSED
727       rgb_lagged_sum|  19|   1000000|     100|0.88717640|  PASSED
728       rgb_lagged_sum|  20|   1000000|     100|0.46169416|  PASSED
729       rgb_lagged_sum|  21|   1000000|     100|0.28732211|  PASSED
730       rgb_lagged_sum|  22|   1000000|     100|0.73427824|  PASSED
731       rgb_lagged_sum|  23|   1000000|     100|0.74579333|  PASSED
732       rgb_lagged_sum|  24|   1000000|     100|0.94979002|  PASSED
733       rgb_lagged_sum|  25|   1000000|     100|0.90588183|  PASSED
734       rgb_lagged_sum|  26|   1000000|     100|0.37617442|  PASSED
735       rgb_lagged_sum|  27|   1000000|     100|0.86960028|  PASSED
736       rgb_lagged_sum|  28|   1000000|     100|0.80661374|  PASSED
737       rgb_lagged_sum|  29|   1000000|     100|0.57067702|  PASSED
738       rgb_lagged_sum|  30|   1000000|     100|0.97767659|  PASSED
739       rgb_lagged_sum|  31|   1000000|     100|0.96858026|  PASSED
740       rgb_lagged_sum|  32|   1000000|     100|0.03607615|  PASSED
741      rgb_kstest_test|   0|     10000|    1000|0.07252636|  PASSED
742      dab_bytedistrib|   0|  51200000|       1|0.13820055|  PASSED
743              dab_dct| 256|     50000|       1|0.63195233|  PASSED
744 Preparing to run test 207.  ntuple = 0
745         dab_filltree|  32|  15000000|       1|0.81023471|  PASSED
746         dab_filltree|  32|  15000000|       1|0.64402067|  PASSED
747 Preparing to run test 208.  ntuple = 0
748        dab_filltree2|   0|   5000000|       1|0.94066606|  PASSED
749        dab_filltree2|   1|   5000000|       1|0.06674646|  PASSED
750 Preparing to run test 209.  ntuple = 0
751         dab_monobit2|  12|  65000000|       1|0.49588718|  PASSED
752 #=============================================================================#
753 # Summary: PASSED=110, WEAK=4, FAILED=0                                       #
754 #          235,031.469 MB of random data created with 99.057 MB/sec           #
755 #=============================================================================#
756 #=============================================================================#
757 # Runtime: 0:39:32                                                            #
758 #=============================================================================#
759 */