factor/apps/benchmarks/spectral-norm.factor

52 lines
1.2 KiB
Factor

! Factor port of
! http://shootout.alioth.debian.org/gp4/benchmark.php?test=spectralnorm&lang=all
IN: spectral-norm
USING: arrays kernel math sequences sequences-internals
prettyprint words tools ;
: eval-A ( i j -- n )
[ >float ] 2apply
dupd + dup 1+ * 2 /f truncate + 1+
recip ; inline
: (eval-A-times-u) ( u i j -- x )
tuck eval-A >r swap nth-unsafe r> * ; inline
: eval-A-times-u ( n u -- seq )
over [
pick 0.0 [
swap >r >r 2dup r> (eval-A-times-u) r> +
] reduce nip
] map 2nip ; inline
: (eval-At-times-u) ( u i j -- x )
tuck swap eval-A >r swap nth-unsafe r> * ; inline
: eval-At-times-u ( n u -- seq )
over [
pick 0.0 [
swap >r >r 2dup r> (eval-At-times-u) r> +
] reduce nip
] map 2nip ; inline
: eval-AtA-times-u ( n u -- seq )
dupd eval-A-times-u eval-At-times-u ; inline
: u/v ( n -- u v )
dup 1.0 <array> f
10 [
drop
dupd eval-AtA-times-u
2dup eval-AtA-times-u
swap
] times
rot drop ; inline
: spectral-norm ( n -- norm )
u/v [ v. ] keep norm-sq /f sqrt ;
\ spectral-norm { fixnum } "specializer" set-word-prop
[ 2000 spectral-norm . ] time