[Git][cmucl/cmucl][rtoy-xoro-default] Document the jump function and add test.

Raymond Toy rtoy at common-lisp.net
Thu Dec 21 00:31:42 UTC 2017


Raymond Toy pushed to branch rtoy-xoro-default at cmucl / cmucl


Commits:
9cd66071 by Raymond Toy at 2017-12-20T16:30:41-08:00
Document the jump function and add test.

* rand-xoroshiro.lisp:
  * Rename xoroshiro-jump to random-state-jump
  * Add documentation/comments.
* tests/rng.lisp
  * Add tests for the RNG jump function.

- - - - -


2 changed files:

- src/code/rand-xoroshiro.lisp
- tests/rng.lisp


Changes:

=====================================
src/code/rand-xoroshiro.lisp
=====================================
--- a/src/code/rand-xoroshiro.lisp
+++ b/src/code/rand-xoroshiro.lisp
@@ -18,7 +18,8 @@
 	  make-random-state))
 
 (in-package "KERNEL")
-(export '(%random-single-float %random-double-float random-chunk init-random-state))
+(export '(%random-single-float %random-double-float random-chunk init-random-state
+	  random-state-jump))
 
 (sys:register-lisp-feature :random-xoroshiro)
 
@@ -470,7 +471,12 @@
 	    :format-control (intl:gettext "Argument is not a positive integer or a positive float: ~S")
 	    :format-arguments (list arg)))))
 
-(defun xoroshiro-jump (rng-state)
+;; Jump function for the generator.  See the jump function in
+;; http://xoroshiro.di.unimi.it/xoroshiro128plus.c
+(defun random-state-jump (&optional (rng-state *random-state*))
+  "Jump the RNG-STATE.  This is equivalent to 2^64 calls to the
+  xoroshiro128+ generator.  It can be used to generate 2^64
+  non-overlapping subsequences for parallel computations."
   (declare (type random-state rng-state))
   (let ((state (random-state-state rng-state))
 	(s0-0 0)
@@ -493,7 +499,6 @@
 	      (kernel:double-float-bits (aref state 1))
 	    (setf s1-1 (logxor s1-1 (ldb (byte 32 0) x1))
 		  s1-0 (logxor s1-0 x0))))
-	(format t "jump: ~D s0, s1 = ~X~8,'0X  ~X~8,'0X~%" b s0-1 s0-0 s1-1 s1-0)
 	(xoroshiro-gen state)))
 
     (flet ((convert (x1 x0)
@@ -504,4 +509,3 @@
       (setf (aref state 0) (convert s0-1 s0-0))
       (setf (aref state 1) (convert s1-1 s1-0)))
       rng-state))
-


=====================================
tests/rng.lisp
=====================================
--- a/tests/rng.lisp
+++ b/tests/rng.lisp
@@ -55,3 +55,16 @@
 	item
       (assert-equal value (64-bit-value *test-state*))
       (assert-equal state (multiple-value-list (64-bit-rng-state *test-state*))))))
+
+(define-test rng.jump
+  (setf *test-state*
+	(kernel::make-random-object :state (kernel::init-random-state #x12345678)
+				    :rand 0
+				    :cached-p nil))
+  (dolist (result '((#x291ddf8e6f6a7b67 #x1f9018a12f9e031f)
+		    (#x88a7aa12158558d0 #xe264d785ab1472d9)
+		    (#x207e16f73c51e7ba #x999c8a0a9a8d87c0)
+		    (#x28f8959d3bcf5ff1 #x38091e563ab6eb98)))
+    (kernel:random-state-jump *test-state*)
+    (assert-equal result (multiple-value-list
+			  (64-bit-rng-state *test-state*)))))



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/9cd66071aa0b124404736b746a8eef5bc33d80cd

---
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/9cd66071aa0b124404736b746a8eef5bc33d80cd
You're receiving this email because of your account on gitlab.common-lisp.net.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20171221/2ceac803/attachment-0001.html>


More information about the cmucl-cvs mailing list