refactor math.blas.vectors a bit

db4
Joe Groff 2008-07-03 21:16:09 -07:00
parent f3bcb7b77b
commit bd2841deea
3 changed files with 39 additions and 28 deletions

View File

@ -1,4 +1,4 @@
USING: kernel math.blas.vectors parser prettyprint.backend ;
USING: kernel math.blas.vectors parser ;
IN: math.blas.syntax
: svector{ ( accum -- accum )

View File

@ -1 +1 @@
Basic Linear Algebra words for accelerated vector and matrix math
BLAS level 1 vector operations

View File

@ -1,5 +1,5 @@
USING: accessors alien alien.c-types arrays byte-arrays fry
kernel macros math math.blas.cblas math.complex math.functions
USING: accessors alien alien.c-types arrays byte-arrays combinators
fry kernel macros math math.blas.cblas math.complex math.functions
math.order multi-methods qualified sequences sequences.private
shuffle ;
QUALIFIED: syntax
@ -21,8 +21,6 @@ C: <double-blas-vector> double-blas-vector
C: <float-complex-blas-vector> float-complex-blas-vector
C: <double-complex-blas-vector> double-complex-blas-vector
GENERIC: zero-vector ( v -- zero )
GENERIC: n*V+V-in-place ( n v1 v2 -- v2=n*v1+v2 )
GENERIC: n*V-in-place ( n v -- v=n*v )
@ -34,18 +32,29 @@ GENERIC: Vswap ( v1 v2 -- v1=v2 v2=v1 )
GENERIC: Viamax ( v -- abs-max-index )
GENERIC: element-type ( v -- type )
METHOD: element-type { float-blas-vector }
drop "float" ;
METHOD: element-type { double-blas-vector }
drop "double" ;
METHOD: element-type { float-complex-blas-vector }
drop "CBLAS_C" ;
METHOD: element-type { double-complex-blas-vector }
drop "CBLAS_Z" ;
<PRIVATE
GENERIC: (vector-c-type) ( v -- type )
GENERIC: (blas-vector-like) ( data length inc exemplar -- vector )
METHOD: (vector-c-type) { float-blas-vector }
drop "float" ;
METHOD: (vector-c-type) { double-blas-vector }
drop "double" ;
METHOD: (vector-c-type) { float-complex-blas-vector }
drop "CBLAS_C" ;
METHOD: (vector-c-type) { double-complex-blas-vector }
drop "CBLAS_Z" ;
METHOD: (blas-vector-like) { object object object float-blas-vector }
drop <float-blas-vector> ;
METHOD: (blas-vector-like) { object object object double-blas-vector }
drop <double-blas-vector> ;
METHOD: (blas-vector-like) { object object object float-complex-blas-vector }
drop <float-complex-blas-vector> ;
METHOD: (blas-vector-like) { object object object double-complex-blas-vector }
drop <double-complex-blas-vector> ;
: (prepare-copy) ( v element-size -- length v-data v-inc v-dest-data v-dest-inc )
[ [ length>> ] [ data>> ] [ inc>> ] tri ] dip
@ -121,14 +130,15 @@ MACRO: (set-complex-nth) ( set-nth-quot -- )
PRIVATE>
METHOD: zero-vector { float-blas-vector }
length>> 0.0 <float> swap 0 <float-blas-vector> ;
METHOD: zero-vector { double-blas-vector }
length>> 0.0 <double> swap 0 <double-blas-vector> ;
METHOD: zero-vector { float-complex-blas-vector }
length>> "CBLAS_C" <c-object> swap 0 <float-complex-blas-vector> ;
METHOD: zero-vector { double-complex-blas-vector }
length>> "CBLAS_Z" <c-object> swap 0 <double-complex-blas-vector> ;
: zero-vector ( exemplar -- zero )
[ element-type <c-object> ]
[ length>> 0 ]
[ (blas-vector-like) ] tri ;
: empty-vector ( exemplar -- empty-vector )
[ [ length>> ] [ element-type ] bi <c-array> ]
[ length>> 1 ]
[ (blas-vector-like) ] tri ;
syntax:M: blas-vector-base length
length>> ;
@ -158,9 +168,11 @@ syntax:M: double-complex-blas-vector set-nth-unsafe
: >double-blas-vector ( seq -- v )
[ >c-double-array ] [ length ] bi 1 <double-blas-vector> ;
: >float-complex-blas-vector ( seq -- v )
[ (flatten-complex-sequence) >c-float-array ] [ length ] bi 1 <float-complex-blas-vector> ;
[ (flatten-complex-sequence) >c-float-array ] [ length ] bi
1 <float-complex-blas-vector> ;
: >double-complex-blas-vector ( seq -- v )
[ (flatten-complex-sequence) >c-double-array ] [ length ] bi 1 <double-complex-blas-vector> ;
[ (flatten-complex-sequence) >c-double-array ] [ length ] bi
1 <double-complex-blas-vector> ;
syntax:M: float-blas-vector clone
"float" heap-size (prepare-copy)
@ -206,14 +218,13 @@ METHOD: n*V-in-place { number double-complex-blas-vector }
[ (>z-complex) ] dip
(prepare-scal) [ cblas_zscal ] dip ;
: n*V+V ( n v1 v2 -- n*v1+v2 ) clone n*V+V-in-place ;
: n*V ( n v1 -- n*v1 ) clone n*V-in-place ;
! : n*V ( n v1 -- n*v1 ) dup empty-vector n*V+V-in-place ; ! XXX which is faster?
: V+ ( v1 v2 -- v1+v2 )
1.0 -rot n*V+V ;
: V- ( v1 v2 -- v1+v2 )
: V- ( v1 v2 -- v1-v2 )
-1.0 spin n*V+V ;
: Vneg ( v1 -- -v1 )