arrays.shaped: Inefficient iteration with indices.

Add upper,lower,strict-upper/lower map operations and array constructions.
db4
Doug Coleman 2013-07-24 10:03:06 -07:00
parent 6ca2fec6cd
commit 232287b3fc
2 changed files with 97 additions and 4 deletions

View File

@ -1,6 +1,6 @@
! Copyright (C) 2012 Doug Coleman. ! Copyright (C) 2012 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays.shaped kernel tools.test ; USING: accessors arrays.shaped kernel tools.test math ;
IN: arrays.shaped.tests IN: arrays.shaped.tests
[ t ] [ [ t ] [
@ -41,3 +41,12 @@ IN: arrays.shaped.tests
{ sa{ 0 } } [ { 1 } zeros ] unit-test { sa{ 0 } } [ { 1 } zeros ] unit-test
! Error on 0, negative shapes ! Error on 0, negative shapes
[
sa{ { 1 3 3 } { 4 1 3 } { 4 4 1 } }
] [
{ 3 3 } 2 strict-lower
[ drop 3 ] map-strict-upper
[ drop 1 ] map-diagonal
[ sq ] map-strict-lower
] unit-test

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays combinators.short-circuit constructors USING: accessors arrays combinators.short-circuit constructors
fry grouping kernel math math.vectors sequences sequences.deep fry grouping kernel math math.vectors sequences sequences.deep
math.order parser ; math.order parser assocs math.combinatorics ;
IN: arrays.shaped IN: arrays.shaped
: flat? ( array -- ? ) [ sequence? ] any? not ; inline : flat? ( array -- ? ) [ sequence? ] any? not ; inline
@ -72,7 +72,7 @@ M: abnormal-shape check-underlying-shape
M: uniform-shape check-underlying-shape M: uniform-shape check-underlying-shape
shape>> check-underlying-shape ; shape>> check-underlying-shape ;
M: sequence check-underlying-shape M: sequence check-underlying-shape
2dup [ length ] [ shape-capacity ] bi* 2dup [ length ] [ shape-capacity ] bi*
= [ underlying-shape-mismatch ] unless ; inline = [ underlying-shape-mismatch ] unless ; inline
@ -133,7 +133,7 @@ M: sequence >col-array
dup [ zero? ] any? [ dup [ zero? ] any? [
2drop { } 2drop { }
] [ ] [
[ rest-slice [ group ] each ] unless-empty [ rest-slice reverse [ group ] each ] unless-empty
] if ; ] if ;
: reshape ( shaped-array shape -- array ) : reshape ( shaped-array shape -- array )
@ -183,9 +183,42 @@ M: shaped-array >pprint-sequence shaped-array>array ;
M: shaped-array pprint* pprint-object ; M: shaped-array pprint* pprint-object ;
M: shaped-array pprint-narrow? drop f ; M: shaped-array pprint-narrow? drop f ;
ERROR: shaped-bounds-error seq shape ;
: shaped-bounds-check ( seq shaped -- seq shaped )
2dup shape [ < ] 2all? [ shaped-bounds-error ] unless ;
! Inefficient
: calculate-row-major-index ( seq shape -- i )
1 [ * ] accumulate nip reverse v* sum ;
: calculate-column-major-index ( seq shape -- i )
1 [ * ] accumulate nip v* sum ;
: set-shaped-row-major ( obj seq shaped -- )
shaped-bounds-check [ shape calculate-row-major-index ] [ underlying>> ] bi set-nth ;
: set-shaped-column-major ( obj seq shaped -- )
shaped-bounds-check [ shape calculate-column-major-index ] [ underlying>> ] bi set-nth ;
! Matrices
: 2d? ( shape -- ? ) length 2 = ;
ERROR: 2d-expected shaped ;
: check-2d ( shaped -- shaped ) dup shape>> 2d? [ 2d-expected ] unless ;
: diagonal? ( coord -- ? ) { [ 2d? ] [ first2 = ] } 1&& ;
! : definite? ( sa -- ? )
: shaped-each ( .. sa quot -- ) : shaped-each ( .. sa quot -- )
[ underlying>> ] dip each ; inline [ underlying>> ] dip each ; inline
! : set-shaped-where ( .. elt sa quot -- )
! [
! [ underlying>> [ length iota ] keep zip ]
! [ ] bi
! ] dip '[ _ [ _ set- ] @ ] assoc-each ; inline
: shaped-map! ( .. sa quot -- sa ) : shaped-map! ( .. sa quot -- sa )
'[ _ map ] change-underlying ; inline '[ _ map ] change-underlying ; inline
@ -211,3 +244,54 @@ M: shaped-array pprint-narrow? drop f ;
pad-shapes pad-shapes
[ [ shape>> ] bi@ ] [ output-shape ] 2bi [ [ shape>> ] bi@ ] [ output-shape ] 2bi
'[ _ broadcast-shape-matches? ] both? ; '[ _ broadcast-shape-matches? ] both? ;
TUPLE: block-array shaped shape ;
: <block-array> ( underlying shape -- obj )
block-array boa ;
: iteration-indices ( shaped -- seq )
[ iota ] [
cartesian-product concat
[ dup first array? [ first2 suffix ] when ] map
] map-reduce ;
: map-shaped-index ( shaped quot -- shaped )
over [
[ [ underlying>> ] [ shape>> iteration-indices ] bi zip ] dip map
] dip swap >>underlying ; inline
: identity-matrix ( n -- shaped )
dup 2array zeros [ second first2 = 1 0 ? ] map-shaped-index ;
: map-strict-lower ( shaped quot -- shaped )
[ check-2d ] dip
'[ first2 first2 > _ when ] map-shaped-index ; inline
: map-lower ( shaped quot -- shaped )
[ check-2d ] dip
'[ first2 first2 >= _ when ] map-shaped-index ; inline
: map-strict-upper ( shaped quot -- shaped )
[ check-2d ] dip
'[ first2 first2 < _ when ] map-shaped-index ; inline
: map-upper ( shaped quot -- shaped )
[ check-2d ] dip
'[ first2 first2 <= _ when ] map-shaped-index ; inline
: map-diagonal ( shaped quot -- shaped )
[ check-2d ] dip
'[ first2 first2 = _ when ] map-shaped-index ; inline
: upper ( shape obj -- shaped )
[ zeros check-2d ] dip '[ drop _ ] map-upper ;
: strict-upper ( shape obj -- shaped )
[ zeros check-2d ] dip '[ drop _ ] map-strict-upper ;
: lower ( shape obj -- shaped )
[ zeros check-2d ] dip '[ drop _ ] map-lower ;
: strict-lower ( shape obj -- shaped )
[ zeros check-2d ] dip '[ drop _ ] map-strict-lower ;