Ticket #7078: Handy.hs

File Handy.hs, 1.3 KB (added by NeilJ, 21 months ago)
Line 
1-----------------------------------------------------------------------------
2--
3-- Module      :  Handy
4-- Copyright   :
5-- License     :  AllRightsReserved
6--
7-- Maintainer  :
8-- Stability   :
9-- Portability :
10--
11-- |
12--
13-----------------------------------------------------------------------------
14
15{-# LANGUAGE ParallelArrays #-}
16{-# OPTIONS_GHC -fvectorise #-}
17
18
19module Handy where
20
21import qualified Prelude as P
22import Data.Array.Parallel
23import Data.Array.Parallel.PArray
24import Data.Array.Parallel.Prelude.Double as D
25
26
27maxEltDiagMMult :: PArray(PArray Double) -> PArray(PArray Double) -> Double
28maxEltDiagMMult a b = maxE (diag (mmultP a b))
29
30mmultP :: PArray (PArray Double) -> PArray (PArray Double) -> [:[:Double:]:]
31mmultP a b = mmultUA (fromNestedPArrayP a) (fromNestedPArrayP b)
32
33mmultUA :: [:[:Double:]:] -> [:[:Double:]:] -> [:[:Double:]:]
34mmultUA a b = [:[:(sumP (zipWithP (D.*) ra rtb)) | ra <- a :] | rtb <- tb :]
35    where tb = transposeP b
36
37diag :: [:[:Double:]:] -> [:Double:]
38diag a = [: a !: i !: i | i <- [:0..l:] :]
39    where l = lengthP (a !: 0)
40
41maxE :: [:Double:] -> Double
42maxE a = maximumP a
43
44transposeP :: [:[:Double:]:] -> [:[:Double:]:]
45transposeP [::]             = [::]
46transposeP ([::]   : xss)   = transposeP xss
47transposeP ((x:xs) : xss)   = (x : [:h | (h:_) <- xss:]) : transposeP (xs : [:t | (_:t) <- xss:])
48
49