2010-05-30 19:58:30 -04:00
|
|
|
! Copyright (C) 2008, 2010 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
!
|
2007-09-20 18:09:08 -04:00
|
|
|
! Factor port of
|
|
|
|
! http://shootout.alioth.debian.org/gp4/benchmark.php?test=spectralnorm&lang=all
|
2010-05-29 04:12:49 -04:00
|
|
|
USING: alien.c-types io kernel math math.functions math.parser
|
|
|
|
math.vectors sequences sequences.private specialized-arrays
|
|
|
|
typed locals ;
|
2009-09-09 23:33:34 -04:00
|
|
|
SPECIALIZED-ARRAY: double
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: benchmark.spectral-norm
|
|
|
|
|
2008-04-20 07:15:24 -04:00
|
|
|
:: inner-loop ( u n quot -- seq )
|
2010-01-14 13:08:22 -05:00
|
|
|
n iota [| i |
|
|
|
|
n iota 0.0 [| j |
|
2008-04-20 07:15:24 -04:00
|
|
|
u i j quot call +
|
|
|
|
] reduce
|
2008-12-03 01:05:54 -05:00
|
|
|
] double-array{ } map-as ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: eval-A ( i j -- n )
|
2008-03-29 21:36:58 -04:00
|
|
|
[ >float ] bi@
|
2008-04-20 07:15:24 -04:00
|
|
|
[ drop ] [ + [ ] [ 1 + ] bi * 0.5 * ] 2bi
|
|
|
|
+ 1 + recip ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: (eval-A-times-u) ( u i j -- x )
|
2010-04-15 00:50:17 -04:00
|
|
|
[ swap nth-unsafe ] [ eval-A ] bi-curry bi* * ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: eval-A-times-u ( n u -- seq )
|
2008-04-20 07:15:24 -04:00
|
|
|
[ (eval-A-times-u) ] inner-loop ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: (eval-At-times-u) ( u i j -- x )
|
2010-04-15 00:50:17 -04:00
|
|
|
[ swap nth-unsafe ] [ swap eval-A ] bi-curry bi* * ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-04-20 07:15:24 -04:00
|
|
|
: eval-At-times-u ( u n -- seq )
|
|
|
|
[ (eval-At-times-u) ] inner-loop ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-04-20 07:15:24 -04:00
|
|
|
: eval-AtA-times-u ( u n -- seq )
|
|
|
|
[ eval-A-times-u ] [ eval-At-times-u ] bi ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-12-03 01:05:54 -05:00
|
|
|
: ones ( n -- seq ) [ 1.0 ] double-array{ } replicate-as ; inline
|
2008-09-13 07:13:49 -04:00
|
|
|
|
2008-04-20 07:15:24 -04:00
|
|
|
:: u/v ( n -- u v )
|
2008-09-13 07:13:49 -04:00
|
|
|
n ones dup
|
2007-09-20 18:09:08 -04:00
|
|
|
10 [
|
|
|
|
drop
|
2008-04-20 07:15:24 -04:00
|
|
|
n eval-AtA-times-u
|
|
|
|
[ n eval-AtA-times-u ] keep
|
|
|
|
] times ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2010-04-15 00:50:17 -04:00
|
|
|
TYPED: spectral-norm ( n: fixnum -- norm )
|
2008-09-12 19:15:26 -04:00
|
|
|
u/v [ v. ] [ norm-sq ] bi /f sqrt ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2012-07-19 20:35:47 -04:00
|
|
|
: spectral-norm-benchmark ( -- )
|
2010-05-29 04:12:49 -04:00
|
|
|
2000 spectral-norm number>string print ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2012-07-19 20:35:47 -04:00
|
|
|
MAIN: spectral-norm-benchmark
|