summaryrefslogtreecommitdiff
path: root/testsuite/tests/array/should_run/arr017.hs
blob: 18314b8e28a57833ea5ca88c0098269c31c9949a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- Caused a crash in GHC 6.4 when optimising, due to inlining of runST too early.

-- Spectral Norm benchmark

import Data.Array
import System.Environment (getArgs)

main = do
        --[arg] <- getArgs
        --let n = (read arg) - 1 
        let n = 80
        let init = listArray (0,n) (repeat 1.0)
        let (v:u:rest) = drop 19 $ iterate (eval_AtA_times_u n) init
        let vBv = sum [(u!i)*(v!i) |i<-[0..n]]
        let vv  = sum [(v!i)*(v!i) |i<-[0..n]]
        print $ sqrt (vBv/vv)

eval_AtA_times_u n u = eval_At_times_u n v
    where v = eval_A_times_u n u

eval_A x y = 1.0/((i+j)*(i+j+1)/2+i+1)
    where i = fromIntegral x
          j = fromIntegral y

eval_A_times_u n u = accumArray (+) 0 (0,n)
                     [(i,(eval_A i j) * u!j)|i<-[0..n], j<-[0..n]]

eval_At_times_u n u = accumArray (+) 0 (0,n)
                      [(i,(eval_A j i) * u!j)|i<-[0..n], j<-[0..n]]