1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
5 ! https://shootout.alioth.debian.org/gp4/benchmark.php?test=spectralnorm&lang=all
6 USING: alien.c-types io kernel math math.functions math.parser
7 math.vectors sequences sequences.private specialized-arrays
9 SPECIALIZED-ARRAY: double
10 IN: benchmark.spectral-norm
12 :: inner-loop ( u n quot -- seq )
17 ] double-array{ } map-as ; inline
21 [ drop ] [ + [ ] [ 1 + ] bi * 0.5 * ] 2bi
24 : (eval-A-times-u) ( u i j -- x )
25 [ swap nth-unsafe ] [ eval-A ] bi-curry bi* * ; inline
27 : eval-A-times-u ( n u -- seq )
28 [ (eval-A-times-u) ] inner-loop ; inline
30 : (eval-At-times-u) ( u i j -- x )
31 [ swap nth-unsafe ] [ swap eval-A ] bi-curry bi* * ; inline
33 : eval-At-times-u ( u n -- seq )
34 [ (eval-At-times-u) ] inner-loop ; inline
36 : eval-AtA-times-u ( u n -- seq )
37 [ eval-A-times-u ] [ eval-At-times-u ] bi ; inline
39 : ones ( n -- seq ) [ 1.0 ] double-array{ } replicate-as ; inline
46 [ n eval-AtA-times-u ] keep
49 TYPED: spectral-norm ( n: fixnum -- norm )
50 u/v [ vdot ] [ norm-sq ] bi /f sqrt ;
52 : spectral-norm-benchmark ( -- )
53 2000 spectral-norm number>string print ;
55 MAIN: spectral-norm-benchmark