[Git][cmucl/cmucl][rtoy-xoro-default] 2 commits: Add comments.

Raymond Toy rtoy at common-lisp.net
Fri Dec 29 03:54:08 UTC 2017


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


Commits:
86599903 by Raymond Toy at 2017-12-28T19:53:42-08:00
Add comments.

- - - - -
562752c0 by Raymond Toy at 2017-12-28T19:54:11-08:00
Regenerated from sources

- - - - -


2 changed files:

- src/code/rand-xoroshiro.lisp
- src/i18n/locale/cmucl.pot


Changes:

=====================================
src/code/rand-xoroshiro.lisp
=====================================
--- a/src/code/rand-xoroshiro.lisp
+++ b/src/code/rand-xoroshiro.lisp
@@ -1,6 +1,9 @@
 ;;; -*- Mode: Lisp; Package: Kernel -*-
 ;;;
 ;;; **********************************************************************
+;;; This code was written as part of CMU Common Lisp and has been
+;;; placed in the public domain, and is provided 'as is'.
+;;;
 (ext:file-comment
   "$Header: src/code/rand-xoroshiro.lisp $")
 
@@ -23,6 +26,12 @@
 
 (sys:register-lisp-feature :random-xoroshiro)
 
+
+;;;; Random state hackery:
+
+;; Generate a random seed that can be used for seeding the generator.
+;; If /dev/urandom is available, it is used to generate random data as
+;; the seed.  Otherwise, the current time is used as the seed.
 (defun generate-seed (&optional (nwords 1))
   ;; On some systems (as reported by Ole Rohne on cmucl-imp),
   ;; /dev/urandom isn't what we think it is, so if it doesn't work,
@@ -51,7 +60,7 @@
     (flet ((splitmix64 ()
 	     ;; See http://xoroshiro.di.unimi.it/splitmix64.c for the
 	     ;; definitive reference.  The basic algorithm, where x is
-	     ;; the 64-bit state of the generator,:
+	     ;; the 64-bit state of the generator, is:
 	     ;;
 	     ;;   uint64_t z = (x += 0x9e3779b97f4a7c15);
 	     ;;   z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
@@ -85,10 +94,14 @@
 		 (aref state 1) (make-double s1))
 	   state))))
 
+;; Initialize from an array.  The KEY is a 2-element array of unsigned
+;; 64-bit integers.  The state is set to the given 64-bit integer
+;; values.
 (defun vec-init-xoro-state (key &optional (state (make-array 2 :element-type 'double-float)))
   (declare (type (array (unsigned-byte 64) (2)) key)
 	   (type (simple-array double-float (2)) state))
   (flet ((make-double (x)
+	   (declare (type (unsigned-byte 64) x))
 	   (let ((hi (ldb (byte 32 32) x))
 		 (lo (ldb (byte 32 0) x)))
 	     (kernel:make-double-float
@@ -99,11 +112,11 @@
     (setf (aref state 0) (make-double (aref key 0))
 	  (aref state 1) (make-double (aref key 1)))
     state))
-  
-  
+
+;; The default seed is the digits of Euler's constant, 0.5772....
 (defun init-random-state (&optional (seed 5772156649015328606) state)
-  "Generate an random state vector from the given SEED.  The seed can be
-  either an integer or a vector of (unsigned-byte 32)"
+  _N"Generate an random state vector from the given SEED.  The seed can be
+  either an integer or a vector of (unsigned-byte 64)"
   (declare (type (or null integer
 		     (array (unsigned-byte 64) (*)))
 		 seed))
@@ -180,6 +193,10 @@
   (make-random-object))
 
 (defun make-random-state (&optional state)
+  _N"Make a random state object.  If STATE is not supplied, return a copy
+  of the default random state.  If STATE is a random state, then return a
+  copy of it.  If STATE is T then return a random state generated from
+  the universal time or /dev/urandom if available."
   (flet ((copy-random-state (state)
 	   (let ((old-state (random-state-state state))
 		 (new-state
@@ -198,7 +215,7 @@
 			       :rand 0
 			       :cached-p nil))
 	  (t
-	   (error "Argument is not a RANDOM-STATE, T, or NIL: ~S" state)))))
+	   (error _"Argument is not a RANDOM-STATE, T, or NIL: ~S" state)))))
 
 (defun rand-initializer ()
   (init-random-state (generate-seed)
@@ -384,7 +401,7 @@
 			  (double-float 0d0))
 		%random-double-float))
 ;;;
-;;; 53bit version.
+;;; 53-bit version.
 ;;;
 (defun %random-double-float (arg state)
   (declare (type (double-float (0d0)) arg)
@@ -452,10 +469,9 @@
       (declare (fixnum count)))))
 
 (defun random (arg &optional (state *random-state*))
-  "Generate a uniformly distributed pseudo-random number between zero
+  _N"Generate a uniformly distributed pseudo-random number between zero
   and Arg.  State, if supplied, is the random state to use."
-  (declare (inline %random-single-float %random-double-float
-		   #+long-float %long-float))
+  (declare (inline %random-single-float %random-double-float))
   (cond
     ((typep arg '(integer 1 #x100000000))
      ;; Let the compiler deftransform take care of this case.
@@ -464,9 +480,6 @@
      (%random-single-float arg state))
     ((and (typep arg 'double-float) (> arg 0.0D0))
      (%random-double-float arg state))
-    #+long-float
-    ((and (typep arg 'long-float) (> arg 0.0L0))
-     (%random-long-float arg state))
     #+double-double
     ((and (typep arg 'double-double-float) (> arg 0.0w0))
      (%random-double-double-float arg state))
@@ -475,13 +488,13 @@
     (t
      (error 'simple-type-error
 	    :expected-type '(or (integer 1) (float (0.0))) :datum arg
-	    :format-control (intl:gettext "Argument is not a positive integer or a positive float: ~S")
+	    :format-control _"Argument is not a positive integer or a positive float: ~S")
 	    :format-arguments (list arg)))))
 
 ;; 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
+  _N"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))


=====================================
src/i18n/locale/cmucl.pot
=====================================
--- a/src/i18n/locale/cmucl.pot
+++ b/src/i18n/locale/cmucl.pot
@@ -33,7 +33,7 @@ msgstr ""
 #: src/code/intl.lisp src/compiler/globaldb.lisp src/code/defstruct.lisp
 #: src/code/remote.lisp src/code/wire.lisp src/code/internet.lisp
 #: src/code/loop.lisp src/code/run-program.lisp src/code/parse-time.lisp
-#: src/code/profile.lisp src/code/ntrace.lisp src/code/rand-mt19937.lisp
+#: src/code/profile.lisp src/code/ntrace.lisp src/code/rand-xoroshiro.lisp
 #: src/code/debug.lisp src/code/debug-int.lisp src/code/debug-info.lisp
 #: src/code/eval.lisp src/code/filesys.lisp src/code/pathname.lisp
 #: src/code/fd-stream.lisp src/code/extfmts.lisp src/code/serve-event.lisp
@@ -12105,13 +12105,13 @@ msgstr ""
 msgid "Type \"yes\" for yes or \"no\" for no. "
 msgstr ""
 
-#: src/code/rand-mt19937.lisp
+#: src/code/rand-xoroshiro.lisp
 msgid ""
 "Generate an random state vector from the given SEED.  The seed can be\n"
-"  either an integer or a vector of (unsigned-byte 32)"
+"  either an integer or a vector of (unsigned-byte 64)"
 msgstr ""
 
-#: src/code/rand-mt19937.lisp
+#: src/code/rand-xoroshiro.lisp
 msgid ""
 "Make a random state object.  If STATE is not supplied, return a copy\n"
 "  of the default random state.  If STATE is a random state, then return a\n"
@@ -12119,20 +12119,27 @@ msgid ""
 "  the universal time or /dev/urandom if available."
 msgstr ""
 
-#: src/code/rand-mt19937.lisp
-msgid "Argument is not a RANDOM-STATE, T or NIL: ~S"
+#: src/code/rand-xoroshiro.lisp
+msgid "Argument is not a RANDOM-STATE, T, or NIL: ~S"
 msgstr ""
 
-#: src/code/rand-mt19937.lisp
+#: src/code/rand-xoroshiro.lisp
 msgid ""
 "Generate a uniformly distributed pseudo-random number between zero\n"
 "  and Arg.  State, if supplied, is the random state to use."
 msgstr ""
 
-#: src/code/rand-mt19937.lisp
+#: src/code/rand-xoroshiro.lisp
 msgid "Argument is not a positive integer or a positive float: ~S"
 msgstr ""
 
+#: src/code/rand-xoroshiro.lisp
+msgid ""
+"Jump the RNG-STATE.  This is equivalent to 2^64 calls to the\n"
+"  xoroshiro128+ generator.  It can be used to generate 2^64\n"
+"  non-overlapping subsequences for parallel computations."
+msgstr ""
+
 #: src/code/ntrace.lisp
 msgid ""
 "This is bound to the returned values when evaluating :BREAK-AFTER and\n"
@@ -18869,10 +18876,6 @@ msgid "use inline (unsigned-byte 32) operations"
 msgstr ""
 
 #: src/compiler/float-tran.lisp
-msgid "Shouldn't happen"
-msgstr ""
-
-#: src/compiler/float-tran.lisp
 msgid "Can't open-code float to rational comparison."
 msgstr ""
 



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/compare/58f107b1c475acf59797b016f0c86ae71ed0847b...562752c001f558613c6504692b98dee3546ef1ba

---
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/compare/58f107b1c475acf59797b016f0c86ae71ed0847b...562752c001f558613c6504692b98dee3546ef1ba
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/20171229/4c7acfd9/attachment-0001.html>


More information about the cmucl-cvs mailing list