]> gitweb.factorcode.org Git - factor.git/commitdiff
arrays.shaped: Deal with 0s in shape.
authorDoug Coleman <doug.coleman@gmail.com>
Thu, 11 Apr 2013 22:29:09 +0000 (15:29 -0700)
committerDoug Coleman <doug.coleman@gmail.com>
Thu, 11 Apr 2013 23:22:01 +0000 (16:22 -0700)
Fix prettyprinting, introduce sa{ } syntax.
Add broadcastable? check for binary operations.
Add shape of output array for broadcasts.
Check for negative integers in shape.

extra/arrays/shaped/shaped-tests.factor
extra/arrays/shaped/shaped.factor

index 2e76543537bb2f65bcdb9f1deff9de5eb136285a..ddc0a48909256a3ac6eccaa992d95d8d6454b3c7 100644 (file)
@@ -33,3 +33,11 @@ IN: arrays.shaped.tests
         { 20 21 22 23 24 }
     } >shaped-array shape
 ] unit-test
+
+{ sa{ 1 } } [ { } ones ] unit-test
+{ sa{ 1 } } [ { 1 } ones ] unit-test
+
+{ sa{ 0 } } [ { } zeros ] unit-test
+{ sa{ 0 } } [ { 1 } zeros ] unit-test
+
+! Error on 0, negative shapes
index 67eab6d3361f9f56fb9c489eb3c1cafd4764d7d7..82b6e73fd81891d6edfcc9ece60cf3845b0c80e1 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2012 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays constructors grouping kernel math
-sequences math.vectors sequences.deep ;
+USING: accessors arrays combinators.short-circuit constructors
+fry grouping kernel math math.vectors sequences sequences.deep
+math.order parser ;
 IN: arrays.shaped
 
 : flat? ( array -- ? ) [ sequence? ] any? not ; inline
@@ -28,7 +29,7 @@ C: <abnormal-shape> abnormal-shape
 GENERIC: wrap-shape ( object -- shape )
 
 M: integer wrap-shape
-    0 2array <uniform-shape> ;
+    1array <uniform-shape> ;
 
 M: sequence wrap-shape
     dup all-equal? [
@@ -41,11 +42,19 @@ GENERIC: shape ( array -- shape )
 
 M: sequence shape array-replace wrap-shape ;
 
+: ndim ( array -- n ) shape length ;
+
+ERROR: no-negative-shape-components shape ;
+
+: check-shape-domain ( seq -- seq )
+    dup [ 0 < ] any? [ no-negative-shape-components ] when ;
+
 GENERIC: shape-capacity ( shape -- n )
 
-M: sequence shape-capacity product ;
+M: sequence shape-capacity check-shape-domain product ;
 
-M: uniform-shape shape-capacity shape>> product ;
+M: uniform-shape shape-capacity
+    shape>> product ;
 
 M: abnormal-shape shape-capacity
     shape>> 0 swap [
@@ -101,7 +110,7 @@ GENERIC: >row-array ( array -- shaped-array )
 GENERIC: >col-array ( array -- shaped-array )
 
 M: sequence >shaped-array
-    [ flatten ] [ shape ] bi <shaped-array> ;
+    [ { } flatten-as ] [ shape ] bi <shaped-array> ;
 
 M: shaped-array >shaped-array ;
 
@@ -120,7 +129,12 @@ M: sequence >col-array
     [ drop shape>> clone ] 2bi shaped-array boa ;
 
 : shaped-array>array ( shaped-array -- array )
-    [ underlying>> ] [ shape>> ] bi rest-slice [ group ] each ;
+    [ underlying>> ] [ shape>> ] bi
+    dup [ zero? ] any? [
+        2drop { }
+    ] [
+        [ rest-slice [ group ] each ] unless-empty
+    ] if ;
 
 : reshape ( shaped-array shape -- array )
     check-underlying-shape >>shape ;
@@ -129,7 +143,8 @@ M: sequence >col-array
     [ underlying>> clone ] dip <shaped-array> ;
 
 : repeated-shaped ( shape element -- shaped-array )
-    [ [ shape-capacity ] dip <array> ] [ drop ] 2bi <shaped-array> ;
+    [ [ shape-capacity ] dip <array> ]
+    [ drop 1 1 pad-head ] 2bi <shaped-array> ;
 
 : zeros ( shape -- shaped-array ) 0 repeated-shaped ;
 
@@ -158,7 +173,41 @@ TUPLE: row-traverser shaped-array index ;
 
 GENERIC: next-index ( object -- index )
 
+SYNTAX: sa{ \ } [ >shaped-array ] parse-literal ;
+
 USE: prettyprint.custom
-M: shaped-array pprint* shaped-array>array pprint* ;
-M: row-array pprint* shaped-array>array pprint* ;
-M: col-array pprint* shaped-array>array flip pprint* ;
+! M: row-array pprint* shaped-array>array pprint* ;
+! M: col-array pprint* shaped-array>array flip pprint* ;
+M: shaped-array pprint-delims drop \ sa{ \ } ;
+M: shaped-array >pprint-sequence shaped-array>array ;
+M: shaped-array pprint* pprint-object ;
+M: shaped-array pprint-narrow? drop f ;
+
+: shaped-each ( .. sa quot -- )
+    [ underlying>> ] dip each ; inline
+
+: shaped-map! ( .. sa quot -- sa )
+    '[ _ map ] change-underlying ; inline
+
+: shaped-map ( .. sa quot -- sa' )
+    [ [ underlying>> ] dip map ]
+    [ drop shape>> ] 2bi <shaped-array> ; inline
+
+: pad-shapes ( sa0 sa1 -- sa0' sa1' )
+    2dup [ shape>> ] bi@
+    2dup longer length '[ _ 1 pad-head ] bi@
+    [ shaped-like ] bi-curry@ bi* ;
+
+: output-shape ( sa0 sa1 -- shape )
+    [ shape>> ] bi@
+    [ 2dup [ zero? ] either? [ max ] [ 2drop 0 ] if ] 2map ;
+
+: broadcast-shape-matches? ( sa broadcast-shape -- ? )
+    [
+        { [ drop 1 = ] [ = ] } 2||
+    ] 2all? ;
+
+: broadcastable? ( sa0 sa1 -- ? )
+    pad-shapes
+    [ [ shape>> ] bi@ ] [ output-shape ] 2bi
+    '[ _ broadcast-shape-matches? ] both? ;