1 {-# LANGUAGE ParallelArrays #-}
2 {-# OPTIONS_GHC -fvectorise #-}
3 -- NB: Cannot use any parallel array syntax except the type constructor
5 module Data
.Array.Parallel
.Prelude
.Double (
9 (==), (/=), (<), (<=), (>), (>=), min, max,
11 minimumP
, maximumP
, minIndexP
, maxIndexP
,
14 (+), (-), (*), negate, abs,
22 pi, exp, sqrt, log, (**), logBase,
23 sin, tan, cos, asin, atan, acos,
24 sinh, tanh, cosh, asinh, atanh, acosh,
26 -- RealFrac and similar
29 truncate, round, ceiling, floor,
32 import Data
.Array.Parallel
.VectDepend
() -- see Note [Vectoriser dependencies] in the same module
34 import Data
.Array.Parallel
.PArr
35 import Data
.Array.Parallel
.Prelude
.Int (Int) -- get the vectorised version
36 import Data
.Array.Parallel
.Lifted
.Scalar
37 import Data
.Array.Parallel
.Lifted
.Closure
38 import Data
.Array.Parallel
.Prelude
.Bool
40 import Prelude
(Double)
41 import qualified Prelude
as P
46 infix 4 ==, /=, <, <=, >, >=
48 {-# VECTORISE SCALAR type Double #-}
50 (==), (/=), (<), (<=), (>), (>=) :: Double -> Double -> Bool
52 {-# VECTORISE SCALAR (==) #-}
54 {-# VECTORISE SCALAR (/=) #-}
56 {-# VECTORISE SCALAR (<=) #-}
58 {-# VECTORISE SCALAR (<) #-}
60 {-# VECTORISE SCALAR (>=) #-}
62 {-# VECTORISE SCALAR (>) #-}
64 min, max :: Double -> Double -> Double
66 {-# VECTORISE SCALAR min #-}
68 {-# VECTORISE SCALAR max #-}
70 minimumP
, maximumP
:: [:Double:] -> Double
71 {-# NOINLINE minimumP #-}
72 minimumP a
= a `indexPArr`
0
73 {-# VECTORISE minimumP = minimumP_v #-}
74 {-# NOINLINE maximumP #-}
75 maximumP a
= a `indexPArr`
0
76 {-# VECTORISE maximumP = maximumP_v #-}
78 minimumP_v
, maximumP_v
:: PArray
Double :-> Double
79 {-# INLINE minimumP_v #-}
80 minimumP_v
= closure1
(scalar_fold1 P
.min) (scalar_fold1s P
.min)
81 {-# NOVECTORISE minimumP_v #-}
82 {-# INLINE maximumP_v #-}
83 maximumP_v
= closure1
(scalar_fold1 P
.max) (scalar_fold1s P
.max)
84 {-# NOVECTORISE maximumP_v #-}
86 minIndexP
:: [:Double:] -> Int
87 {-# NOINLINE minIndexP #-}
88 minIndexP _
= 0 -- FIXME: add proper implementation
89 {-# VECTORISE minIndexP = minIndexPA #-}
91 minIndexPA
:: PArray
Double :-> Int
92 {-# INLINE minIndexPA #-}
93 minIndexPA
= closure1
(scalar_fold1Index
min') (scalar_fold1sIndex
min')
94 {-# NOVECTORISE minIndexPA #-}
96 min' (i
,x
) (j
,y
) | x P
.<= y
= (i
,x
)
98 {-# NOVECTORISE min' #-}
100 maxIndexP
:: [:Double:] -> Int
101 {-# NOINLINE maxIndexP #-}
102 maxIndexP _
= 0 -- FIXME: add proper implementation
103 {-# VECTORISE maxIndexP = maxIndexPA #-}
105 maxIndexPA
:: PArray
Double :-> Int
106 {-# INLINE maxIndexPA #-}
107 maxIndexPA
= closure1
(scalar_fold1Index
max') (scalar_fold1sIndex
max')
108 {-# NOVECTORISE maxIndexPA #-}
110 max' (i
,x
) (j
,y
) | x P
.>= y
= (i
,x
)
111 | P
.otherwise = (j
,y
)
112 {-# NOVECTORISE max' #-}
114 (+), (-), (*) :: Double -> Double -> Double
116 {-# VECTORISE SCALAR (+) #-}
118 {-# VECTORISE SCALAR (-) #-}
120 {-# VECTORISE SCALAR (*) #-}
122 negate, abs :: Double -> Double
124 {-# VECTORISE SCALAR negate #-}
126 {-# VECTORISE SCALAR abs #-}
128 sumP
, productP
:: [:Double:] -> Double
129 {-# NOINLINE sumP #-}
130 sumP a
= a `indexPArr`
0
131 {-# VECTORISE sumP = sumP_v #-}
132 {-# NOINLINE productP #-}
133 productP a
= a `indexPArr`
0
134 {-# VECTORISE productP = productP_v #-}
136 sumP_v
, productP_v
:: PArray
Double :-> Double
137 {-# INLINE sumP_v #-}
138 sumP_v
= closure1
(scalar_fold
(+) 0) (scalar_folds
(+) 0)
139 {-# NOVECTORISE sumP_v #-}
140 {-# INLINE productP_v #-}
141 productP_v
= closure1
(scalar_fold
(*) 1) (scalar_folds
(*) 1)
142 {-# NOVECTORISE productP_v #-}
144 (/) :: Double -> Double -> Double
146 {-# VECTORISE SCALAR (/) #-}
148 recip :: Double -> Double
150 {-# VECTORISE SCALAR recip #-}
154 {-# NOVECTORISE pi #-}
156 exp, sqrt, log, sin, tan, cos, asin, atan, acos, sinh, tanh, cosh,
157 asinh, atanh, acosh :: Double -> Double
159 {-# VECTORISE SCALAR exp #-}
161 {-# VECTORISE SCALAR sqrt #-}
163 {-# VECTORISE SCALAR log #-}
165 {-# VECTORISE SCALAR sin #-}
167 {-# VECTORISE SCALAR tan #-}
169 {-# VECTORISE SCALAR cos #-}
171 {-# VECTORISE SCALAR asin #-}
173 {-# VECTORISE SCALAR atan #-}
175 {-# VECTORISE SCALAR acos #-}
177 {-# VECTORISE SCALAR sinh #-}
179 {-# VECTORISE SCALAR tanh #-}
181 {-# VECTORISE SCALAR cosh #-}
183 {-# VECTORISE SCALAR asinh #-}
185 {-# VECTORISE SCALAR atanh #-}
187 {-# VECTORISE SCALAR acosh #-}
189 (**), logBase :: Double -> Double -> Double
191 {-# VECTORISE SCALAR (**) #-}
193 {-# VECTORISE SCALAR logBase #-}
195 fromInt
:: Int -> Double
196 fromInt
= P
.fromIntegral
197 {-# VECTORISE SCALAR fromInt #-}
199 truncate, round, ceiling, floor :: Double -> Int
200 truncate = P
.truncate
201 {-# VECTORISE SCALAR truncate #-}
203 {-# VECTORISE SCALAR round #-}
205 {-# VECTORISE SCALAR ceiling #-}
207 {-# VECTORISE SCALAR floor #-}