dph-lifted-copy-0.6.0.1: Data/Array/Parallel/Prelude/Int.hs
{-# OPTIONS_GHC -fvectorise #-}
module Data.Array.Parallel.Prelude.Int (
Int,
-- Ord
(==), (/=), (<), (<=), (>), (>=), min, max,
minimumP, maximumP, minIndexP, maxIndexP,
-- Num
(+), (-), (*), negate, abs,
sumP, productP,
-- Integral
div, mod, sqrt,
-- Enum
enumFromToP
) where
import Data.Array.Parallel.Prim () -- dependency required by the vectoriser
import Data.Array.Parallel.Prelude.Base
import Data.Array.Parallel.PArr
import Data.Array.Parallel.Lifted.Combinators
import Data.Array.Parallel.Lifted.Scalar
import Data.Array.Parallel.Lifted.Closure
import qualified Prelude as P
infixl 7 *
infixl 6 +, -
infix 4 ==, /=, <, <=, >, >=
infixl 7 `div`, `mod`
(==), (/=), (<), (<=), (>), (>=) :: Int -> Int -> Bool
(==) = (P.==)
{-# VECTORISE SCALAR (==) #-}
(/=) = (P./=)
{-# VECTORISE SCALAR (/=) #-}
(<=) = (P.<=)
{-# VECTORISE SCALAR (<=) #-}
(<) = (P.<)
{-# VECTORISE SCALAR (<) #-}
(>=) = (P.>=)
{-# VECTORISE SCALAR (>=) #-}
(>) = (P.>)
{-# VECTORISE SCALAR (>) #-}
min, max :: Int -> Int -> Int
min = P.min
{-# VECTORISE SCALAR min #-}
max = P.max
{-# VECTORISE SCALAR max #-}
minimumP, maximumP :: PArr Int -> Int
{-# NOINLINE minimumP #-}
minimumP a = a `indexPArr` 0
{-# VECTORISE minimumP = minimumP_v #-}
{-# NOINLINE maximumP #-}
maximumP a = a `indexPArr` 0
{-# VECTORISE maximumP = maximumP_v #-}
minimumP_v, maximumP_v:: PArray Int :-> Int
{-# INLINE minimumP_v #-}
minimumP_v = closure1 (scalar_fold1 P.min) (scalar_fold1s P.min)
{-# NOVECTORISE minimumP_v #-}
{-# INLINE maximumP_v #-}
maximumP_v = closure1 (scalar_fold1 P.max) (scalar_fold1s P.max)
{-# NOVECTORISE maximumP_v #-}
minIndexP :: PArr Int -> Int
{-# NOINLINE minIndexP #-}
minIndexP _ = 0 -- FIXME: add proper implementation
{-# VECTORISE minIndexP = minIndexPA #-}
minIndexPA :: PArray Int :-> Int
{-# INLINE minIndexPA #-}
minIndexPA = closure1 (scalar_fold1Index min') (scalar_fold1sIndex min')
{-# NOVECTORISE minIndexPA #-}
min' (i,x) (j,y) | x P.<= y = (i,x)
| P.otherwise = (j,y)
{-# NOVECTORISE min' #-}
maxIndexP :: PArr Int -> Int
{-# NOINLINE maxIndexP #-}
maxIndexP _ = 0 -- FIXME: add proper implementation
{-# VECTORISE maxIndexP = maxIndexPA #-}
maxIndexPA :: PArray Int :-> Int
{-# INLINE maxIndexPA #-}
maxIndexPA = closure1 (scalar_fold1Index max') (scalar_fold1sIndex max')
{-# NOVECTORISE maxIndexPA #-}
max' (i,x) (j,y) | x P.>= y = (i,x)
| P.otherwise = (j,y)
{-# NOVECTORISE max' #-}
(+), (-), (*) :: Int -> Int -> Int
(+) = (P.+)
{-# VECTORISE SCALAR (+) #-}
(-) = (P.-)
{-# VECTORISE SCALAR (-) #-}
(*) = (P.*)
{-# VECTORISE SCALAR (*) #-}
negate, abs :: Int -> Int
negate = P.negate
{-# VECTORISE SCALAR negate #-}
abs = P.abs
{-# VECTORISE SCALAR abs #-}
sumP, productP :: PArr Int -> Int
{-# NOINLINE sumP #-}
sumP a = a `indexPArr` 0
{-# VECTORISE sumP = sumP_v #-}
{-# NOINLINE productP #-}
productP a = a `indexPArr` 0
{-# VECTORISE productP = productP_v #-}
sumP_v, productP_v:: PArray Int :-> Int
{-# INLINE sumP_v #-}
sumP_v = closure1 (scalar_fold (P.+) 0) (scalar_folds (P.+) 0)
{-# NOVECTORISE sumP_v #-}
{-# INLINE productP_v #-}
productP_v = closure1 (scalar_fold (P.*) 1) (scalar_folds (P.*) 1)
{-# NOVECTORISE productP_v #-}
div, mod :: Int -> Int -> Int
div = P.div
{-# VECTORISE SCALAR div #-}
mod = P.mod
{-# VECTORISE SCALAR mod #-}
sqrt :: Int -> Int
sqrt n = P.floor (P.sqrt (P.fromIntegral n) :: P.Double)
{-# VECTORISE SCALAR sqrt #-}
enumFromToP :: Int -> Int -> PArr Int
{-# NOINLINE enumFromToP #-}
enumFromToP x y = singletonPArr (x P.+ y)
{-# VECTORISE enumFromToP = enumFromToPA_Int #-}