From 378bedd1e037a872c13415cad4ad89635eec7cf3 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 3 Dec 2008 10:44:41 -0600 Subject: [PATCH] Faster mersenne-twister with specialized-arrays --- .../mersenne-twister/mersenne-twister.factor | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/basis/random/mersenne-twister/mersenne-twister.factor b/basis/random/mersenne-twister/mersenne-twister.factor index 5610ef18c2..90abec68a5 100644 --- a/basis/random/mersenne-twister/mersenne-twister.factor +++ b/basis/random/mersenne-twister/mersenne-twister.factor @@ -2,48 +2,54 @@ ! See http://factorcode.org/license.txt for BSD license. ! mersenne twister based on ! http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c -USING: kernel math namespaces sequences system init -accessors math.ranges random circular math.bitwise -combinators specialized-arrays.uint ; +USING: kernel math namespaces sequences sequences.private system +init accessors math.ranges random math.bitwise combinators +specialized-arrays.uint fry ; IN: random.mersenne-twister > [ - [ (mt-generate) ] [ set-nth ] 2bi - ] curry each - ] [ 0 >>i drop ] bi ; + mt-n swap seq>> '[ + _ [ (mt-generate) ] [ set-wrap-nth ] 2bi + ] each + ] [ 0 >>i drop ] bi ; inline : init-mt-formula ( i seq -- f(seq[i]) ) - dupd nth dup -30 shift bitxor 1812433253 * + 1+ 32 bits ; + dupd wrap-nth dup -30 shift bitxor 1812433253 * + 1+ 32 bits ; inline : init-mt-rest ( seq -- ) mt-n 1- swap [ - [ init-mt-formula ] [ [ 1+ ] dip set-nth ] 2bi - ] curry each ; + [ init-mt-formula ] [ [ 1+ ] dip set-wrap-nth ] 2bi + ] curry each ; inline : init-mt-seq ( seed -- seq ) - 32 bits mt-n + 32 bits mt-n [ set-first ] [ init-mt-rest ] [ ] tri ; : mt-temper ( y -- yt ) @@ -53,7 +59,7 @@ TUPLE: mersenne-twister seq i ; dup -18 shift bitxor ; inline : next-index ( mt -- i ) - dup i>> dup mt-n < [ nip ] [ drop mt-generate 0 ] if ; + dup i>> dup mt-n < [ nip ] [ drop mt-generate 0 ] if ; inline PRIVATE> @@ -66,7 +72,7 @@ M: mersenne-twister seed-random ( mt seed -- ) M: mersenne-twister random-32* ( mt -- r ) [ next-index ] - [ seq>> nth mt-temper ] + [ seq>> wrap-nth mt-temper ] [ [ 1+ ] change-i drop ] tri ; USE: init