2 ! http://shootout.alioth.debian.org/gp4/benchmark.php?test=spectralnorm&lang=all
3 USING: specialized-arrays kernel math math.functions
4 math.vectors sequences sequences.private prettyprint words hints
6 SPECIALIZED-ARRAY: double
7 IN: benchmark.spectral-norm
9 :: inner-loop ( u n quot -- seq )
14 ] double-array{ } map-as ; inline
18 [ drop ] [ + [ ] [ 1 + ] bi * 0.5 * ] 2bi
21 : (eval-A-times-u) ( u i j -- x )
22 tuck [ swap nth-unsafe ] [ eval-A ] 2bi* * ; inline
24 : eval-A-times-u ( n u -- seq )
25 [ (eval-A-times-u) ] inner-loop ; inline
27 : (eval-At-times-u) ( u i j -- x )
28 tuck [ swap nth-unsafe ] [ swap eval-A ] 2bi* * ; inline
30 : eval-At-times-u ( u n -- seq )
31 [ (eval-At-times-u) ] inner-loop ; inline
33 : eval-AtA-times-u ( u n -- seq )
34 [ eval-A-times-u ] [ eval-At-times-u ] bi ; inline
36 : ones ( n -- seq ) [ 1.0 ] double-array{ } replicate-as ; inline
43 [ n eval-AtA-times-u ] keep
46 : spectral-norm ( n -- norm )
47 u/v [ v. ] [ norm-sq ] bi /f sqrt ;
49 HINTS: spectral-norm fixnum ;
51 : spectral-norm-main ( -- )
52 2000 spectral-norm . ;
54 MAIN: spectral-norm-main