diff --git a/gsll.asd b/gsll.asd index 01c0eab49ea3f69674ed446c5cc497199bc555d4..409bcd63c19dc5881d36397cadc6c69131453a1d 100644 --- a/gsll.asd +++ b/gsll.asd @@ -3,7 +3,7 @@ ; description: Definition of GSLL system ; date: ; author: Liam Healy -; modified: Fri Jul 14 2006 - 17:46 +; modified: Fri Jul 14 2006 - 21:51 ;******************************************************** ;;; $Id: $ @@ -91,5 +91,4 @@ (:module random :depends-on (init) :components - (:file "rng-types")) - )) + ((:file "rng-types"))))) diff --git a/random/rng-types.lisp b/random/rng-types.lisp index 1e6218b9ebf4fc36f188074165c5539499caada4..ebab611b348bd51ca9f9d66a0410746fb13e6b3e 100644 --- a/random/rng-types.lisp +++ b/random/rng-types.lisp @@ -3,7 +3,7 @@ ; description: Random number generation ; date: Tue Jul 11 2006 - 23:39 ; author: Liam M. Healy -; modified: Fri Jul 14 2006 - 10:14 +; modified: Fri Jul 14 2006 - 22:34 ;******************************************************** ;;; $Id: $ @@ -34,6 +34,8 @@ ;;;; Auxiliary functions ;;;;**************************************************************************** +(export '(random-number-generator-state all-random-number-generators)) + (defun-gsl rng-name (rng) "gsl_rng_name" ((rng :pointer)) :c-return :string @@ -63,22 +65,34 @@ :c-return :size :documentation "The size of the generator.") +(defun random-number-generator-state (rng) + "The complete state of a given random number generator, specified + as a vector of bytes." + (let ((ans (make-array (rng-size rng) :element-type '(unsigned-byte 8)))) + (loop for i from 0 below (length ans) + do + (setf (aref ans i) + (mem-aref (rng-state rng) :uint8 i))) + ans)) + (defun-gsl rng-types-setup () "gsl_rng_types_setup" () :c-return :pointer + :export nil :documentation "A pointer to an array of all the available generator types, terminated by a null pointer. The function should be - called once at the start of the program, if needed.") + called once at the start of the program, if needed. + Users should call all-random-number-generators.") -;;; Probably only works for 64 bit hardware; need to generalize -(defun all-rngs () +(defun all-random-number-generators () "A list of all random number generators." (let ((start (rng-types-setup))) (loop for i from 0 - for ptr = (inc-pointer start (* 8 i)) ; (mem-aref ptr :pointer i) - until (null-pointer-p (mem-ref ptr :pointer)) - collect (rng-name (mem-aref ptr 'random-number-generator-type 0))))) + for ptr + = (cffi:inc-pointer start (* (cffi:foreign-type-size :pointer) i)) + until (cffi:null-pointer-p (cffi:mem-ref ptr :pointer)) + collect (cffi:mem-ref ptr 'random-number-generator-type)))) ;;;;**************************************************************************** ;;;; Defining RNGs and default