From bea4d80a33fb213692fbfe61add0046d862891d7 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 3 Dec 2008 10:11:02 -0600
Subject: [PATCH 1/6] Add specialization hints from old float-arrays. These
 will be replaced with a better facility soon

---
 basis/specialized-arrays/double/double.factor | 68 ++++++++++++++++++-
 1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/basis/specialized-arrays/double/double.factor b/basis/specialized-arrays/double/double.factor
index b7fc3a8143..0501458532 100644
--- a/basis/specialized-arrays/double/double.factor
+++ b/basis/specialized-arrays/double/double.factor
@@ -1,4 +1,70 @@
 USE: specialized-arrays.functor
 IN: specialized-arrays.double
 
-<< "double" define-array >>
\ No newline at end of file
+<< "double" define-array >>
+
+! Specializer hints. These should really be generalized, and placed
+! somewhere else
+USING: hints math.vectors arrays kernel math accessors sequences ;
+
+HINTS: <double-array> { 2 } { 3 } ;
+
+HINTS: vneg { array } { double-array } ;
+HINTS: v*n { array object } { double-array float } ;
+HINTS: n*v { array object } { float double-array } ;
+HINTS: v/n { array object } { double-array float } ;
+HINTS: n/v { object array } { float double-array } ;
+HINTS: v+ { array array } { double-array double-array } ;
+HINTS: v- { array array } { double-array double-array } ;
+HINTS: v* { array array } { double-array double-array } ;
+HINTS: v/ { array array } { double-array double-array } ;
+HINTS: vmax { array array } { double-array double-array } ;
+HINTS: vmin { array array } { double-array double-array } ;
+HINTS: v. { array array } { double-array double-array } ;
+HINTS: norm-sq { array } { double-array } ;
+HINTS: norm { array } { double-array } ;
+HINTS: normalize { array } { double-array } ;
+HINTS: distance { array array } { double-array double-array } ;
+
+! Type functions
+USING: words classes.algebra compiler.tree.propagation.info
+math.intervals ;
+
+{ v+ v- v* v/ vmax vmin } [
+    [
+        [ class>> double-array class<= ] both?
+        double-array object ? <class-info>
+    ] "outputs" set-word-prop
+] each
+
+{ n*v n/v } [
+    [
+        nip class>> double-array class<= double-array object ? <class-info>
+    ] "outputs" set-word-prop
+] each
+
+{ v*n v/n } [
+    [
+        drop class>> double-array class<= double-array object ? <class-info>
+    ] "outputs" set-word-prop
+] each
+
+{ vneg normalize } [
+    [
+        class>> double-array class<= double-array object ? <class-info>
+    ] "outputs" set-word-prop
+] each
+
+\ norm-sq [
+    class>> double-array class<= [ float 0. 1/0. [a,b] <class/interval-info> ] [ object-info ] if
+] "outputs" set-word-prop
+
+\ v. [
+    [ class>> double-array class<= ] both?
+    float object ? <class-info>
+] "outputs" set-word-prop
+
+\ distance [
+    [ class>> double-array class<= ] both?
+    [ float 0. 1/0. [a,b] <class/interval-info> ] [ object-info ] if
+] "outputs" set-word-prop

From e6cb449b1980f5d8770e2707b964e24bcab487bb Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 3 Dec 2008 10:44:21 -0600
Subject: [PATCH 2/6] optimized. now accepts method-specs

---
 basis/compiler/tree/debugger/debugger.factor | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/basis/compiler/tree/debugger/debugger.factor b/basis/compiler/tree/debugger/debugger.factor
index e9bf77b188..8d764a2833 100644
--- a/basis/compiler/tree/debugger/debugger.factor
+++ b/basis/compiler/tree/debugger/debugger.factor
@@ -125,9 +125,13 @@ M: node node>quot drop ;
 : nodes>quot ( node -- quot )
     [ [ node>quot ] each ] [ ] make ;
 
-: optimized. ( quot/word -- )
-    dup word? [ specialized-def ] when
-    build-tree optimize-tree nodes>quot . ;
+GENERIC: optimized. ( quot/word -- )
+
+M: method-spec optimized. first2 method optimized. ;
+
+M: word optimized. specialized-def optimized. ;
+
+M: callable optimized. build-tree optimize-tree nodes>quot . ;
 
 SYMBOL: words-called
 SYMBOL: generics-called

From 378bedd1e037a872c13415cad4ad89635eec7cf3 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 3 Dec 2008 10:44:41 -0600
Subject: [PATCH 3/6] 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
 
 <PRIVATE
 
-TUPLE: mersenne-twister seq i ;
+TUPLE: mersenne-twister { seq uint-array } { i fixnum } ;
 
 : mt-n 624 ; inline
 : mt-m 397 ; inline
 : mt-a HEX: 9908b0df ; inline
 
+: wrap-nth ( n seq -- obj )
+    [ length mod ] keep nth-unsafe ; inline
+
+: set-wrap-nth ( obj n seq -- )
+    [ length mod ] keep set-nth-unsafe ; inline
+
 : calculate-y ( n seq -- y )
-    [ nth 31 mask-bit ]
-    [ [ 1+ ] [ nth ] bi* 31 bits ] 2bi bitor ; inline
+    [ wrap-nth 31 mask-bit ]
+    [ [ 1+ ] [ wrap-nth ] bi* 31 bits ] 2bi bitor ; inline
 
 : (mt-generate) ( n seq -- next-mt )
     [
         calculate-y
         [ 2/ ] [ odd? mt-a 0 ? ] bi bitxor
     ] [
-        [ mt-m + ] [ nth ] bi*
-    ] 2bi bitxor ;
+        [ mt-m + ] [ wrap-nth ] bi*
+    ] 2bi bitxor ; inline
 
 : mt-generate ( mt -- )
     [
-        mt-n swap seq>> [
-            [ (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 <uint-array> <circular>
+    32 bits mt-n <uint-array>
     [ 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

From 4c6af1cc9f370ffc65fe2323b84ca16b8bc3800d Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 3 Dec 2008 10:45:06 -0600
Subject: [PATCH 4/6] Use fry instead of curry

---
 basis/random/mersenne-twister/mersenne-twister.factor | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/basis/random/mersenne-twister/mersenne-twister.factor b/basis/random/mersenne-twister/mersenne-twister.factor
index 90abec68a5..3097eafd15 100644
--- a/basis/random/mersenne-twister/mersenne-twister.factor
+++ b/basis/random/mersenne-twister/mersenne-twister.factor
@@ -44,9 +44,9 @@ TUPLE: mersenne-twister { seq uint-array } { i fixnum } ;
     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-wrap-nth ] 2bi
-    ] curry each ; inline
+    mt-n 1- swap '[
+        _ [ init-mt-formula ] [ [ 1+ ] dip set-wrap-nth ] 2bi
+    ] each ; inline
 
 : init-mt-seq ( seed -- seq )
     32 bits mt-n <uint-array>

From 8956ee0cc55a41d4a880fcefde29a2d4cccbe7a0 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 3 Dec 2008 12:06:16 -0600
Subject: [PATCH 5/6] Fix struct-arrays help lint

---
 basis/struct-arrays/struct-arrays-docs.factor | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/basis/struct-arrays/struct-arrays-docs.factor b/basis/struct-arrays/struct-arrays-docs.factor
index 4a198e723c..0a627f7538 100644
--- a/basis/struct-arrays/struct-arrays-docs.factor
+++ b/basis/struct-arrays/struct-arrays-docs.factor
@@ -7,11 +7,11 @@ $nl
 "The " { $slot "underlying" } " slot holds a " { $link c-ptr } " with the raw data. This pointer can be passed to C functions." } ;
 
 HELP: <struct-array>
-{ $values { "length" integer } { "c-type" string } }
+{ $values { "length" integer } { "c-type" string } { "struct-array" struct-array } }
 { $description "Creates a new array for holding values of the specified C type." } ;
 
 HELP: <direct-struct-array>
-{ $values { "alien" c-ptr } { "length" integer } { "c-type" string } }
+{ $values { "alien" c-ptr } { "length" integer } { "c-type" string } { "struct-array" struct-array } }
 { $description "Creates a new array for holding values of the specified C type, backed by the memory at " { $snippet "alien" } "." } ;
 
 ARTICLE: "struct-arrays" "C struct and union arrays"

From 9354207a5f29f2a7f13a715ad812a7ee4cbf7aff Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 3 Dec 2008 12:51:26 -0600
Subject: [PATCH 6/6] Fix io.mmap.ushort

---
 basis/io/mmap/ushort/ushort.factor | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/basis/io/mmap/ushort/ushort.factor b/basis/io/mmap/ushort/ushort.factor
index e0989aa9d4..6d5ac016cf 100644
--- a/basis/io/mmap/ushort/ushort.factor
+++ b/basis/io/mmap/ushort/ushort.factor
@@ -1,4 +1,4 @@
-USE: specialized-arrays.functor
-IN: specialized-arrays.ushort
+USING: io.mmap.functor specialized-arrays.direct.ushort ;
+IN: io.mmap.ushort
 
-<< "ushort" define-array >>
\ No newline at end of file
+<< "ushort" define-mapped-array >>
\ No newline at end of file