#include "fusion-phases.h"
module Data.Array.Parallel.Lifted.Combinators (
lengthPA, replicatePA, singletonPA, mapPA, crossMapPA,
zipWithPA, zipPA, unzipPA,
packPA, filterPA, combine2PA, indexPA, concatPA, appPA, enumFromToPA_Int,
indexedPA, slicePA, updatePA, bpermutePA,
lengthPA_v, replicatePA_v, singletonPA_v, zipPA_v, unzipPA_v,
packPA_v, concatPA_v, indexedPA_v, updatePA_v, bpermutePA_v,
slicePA_v, indexPA_v, appPA_v, enumFromToPA_v
) where
import Data.Array.Parallel.Lifted.PArray
import Data.Array.Parallel.Lifted.Closure
import Data.Array.Parallel.Lifted.Unboxed
import Data.Array.Parallel.Lifted.Scalar
import Data.Array.Parallel.PArray.PReprInstances
import Data.Array.Parallel.PArray.PDataInstances
import Data.Array.Parallel.PArray.ScalarInstances
import qualified Data.Array.Parallel.Unlifted as U
import Data.Array.Parallel.Base (Tag)
import GHC.Exts (Int(..), (+#))
lengthPA :: PA a => PArray a :-> Int
lengthPA = closure1 lengthPA_v lengthPA_l
lengthPA_v :: PA a => PArray a -> Int
lengthPA_v xs = I# (lengthPA# xs)
lengthPA_l :: PA a => PArray (PArray a) -> PArray Int
lengthPA_l xss = fromUArrPA (U.elementsSegd segd) (U.lengthsSegd segd)
where
segd = segdPA# xss
replicatePA :: PA a => Int :-> a :-> PArray a
replicatePA = closure2 replicatePA_v replicatePA_l
replicatePA_v :: PA a => Int -> a -> PArray a
replicatePA_v (I# n#) x = replicatePA# n# x
replicatePA_l :: PA a => PArray Int -> PArray a -> PArray (PArray a)
replicatePA_l (PArray n# (PInt ns)) (PArray _ xs)
= PArray n# (PNested segd (replicatelPD segd xs))
where
segd = U.lengthsToSegd ns
singletonPA :: PA a => a :-> PArray a
singletonPA = closure1 singletonPA_v singletonPA_l
singletonPA_v :: PA a => a -> PArray a
singletonPA_v x = replicatePA_v 1 x
singletonPA_l :: PA a => PArray a -> PArray (PArray a)
singletonPA_l (PArray n# xs)
= PArray n# (PNested (U.mkSegd (U.replicate (I# n#) 1)
(U.enumFromStepLen 0 1 (I# n#))
(I# n#))
xs)
mapPA :: (PA a, PA b) => (a :-> b) :-> PArray a :-> PArray b
mapPA = closure2 mapPA_v mapPA_l
mapPA_v :: (PA a, PA b) => (a :-> b) -> PArray a -> PArray b
mapPA_v f as = replicatePA# (lengthPA# as) f $:^ as
mapPA_l :: (PA a, PA b)
=> PArray (a :-> b) -> PArray (PArray a) -> PArray (PArray b)
mapPA_l (PArray n# clo) (PArray _ xss)
= PArray n#
$ case xss of { PNested segd xs ->
PNested segd
$ liftedApply (case U.elementsSegd segd of { I# k# -> k# })
(replicatelPD segd clo)
xs }
crossMapPA :: (PA a, PA b) => (PArray a :-> (a :-> PArray b) :-> PArray (a,b))
crossMapPA = closure2 crossMapPA_v crossMapPA_l
crossMapPA_v :: (PA a, PA b) => PArray a -> (a :-> PArray b) -> PArray (a,b)
crossMapPA_v as f
= zipPA# (replicatelPA# (segdPA# bss) as) (concatPA# bss)
where
bss = mapPA_v f as
crossMapPA_l :: (PA a, PA b)
=> PArray (PArray a)
-> PArray (a :-> PArray b)
-> PArray (PArray (a,b))
crossMapPA_l ass fs = copySegdPA# bss (zipPA# as' (concatPA# bss))
where
bsss = mapPA_l fs ass
bss = concatPA_l bsss
as' = replicatelPA# (segdPA# (concatPA# bsss)) (concatPA# ass)
zipPA :: (PA a, PA b) => PArray a :-> PArray b :-> PArray (a,b)
zipPA = closure2 zipPA_v zipPA_l
zipPA_v :: (PA a, PA b) => PArray a -> PArray b -> PArray (a,b)
zipPA_v xs ys = zipPA# xs ys
zipPA_l :: (PA a, PA b)
=> PArray (PArray a) -> PArray (PArray b) -> PArray (PArray (a,b))
zipPA_l (PArray n# (PNested segd xs)) (PArray _ (PNested _ ys))
= PArray n# (PNested segd (P_2 xs ys))
zipWithPA :: (PA a, PA b, PA c)
=> (a :-> b :-> c) :-> PArray a :-> PArray b :-> PArray c
zipWithPA = closure3 zipWithPA_v zipWithPA_l
zipWithPA_v :: (PA a, PA b, PA c)
=> (a :-> b :-> c) -> PArray a -> PArray b -> PArray c
zipWithPA_v f as bs = replicatePA# (lengthPA# as) f $:^ as $:^ bs
zipWithPA_l :: (PA a, PA b, PA c)
=> PArray (a :-> b :-> c) -> PArray (PArray a) -> PArray (PArray b)
-> PArray (PArray c)
zipWithPA_l fs ass bss
= copySegdPA# ass
(replicatelPA# (segdPA# ass) fs $:^ concatPA# ass $:^ concatPA# bss)
unzipPA:: (PA a, PA b) => PArray (a, b) :-> (PArray a, PArray b)
unzipPA = closure1 unzipPA_v unzipPA_l
unzipPA_v:: (PA a, PA b) => PArray (a,b) -> (PArray a, PArray b)
unzipPA_v abs' = unzipPA# abs'
unzipPA_l:: (PA a, PA b) => PArray (PArray (a, b)) -> PArray (PArray a, PArray b)
unzipPA_l xyss = zipPA# (copySegdPA# xyss xs) (copySegdPA# xyss ys)
where
(xs, ys) = unzipPA# (concatPA# xyss)
packPA :: PA a => PArray a :-> PArray Bool :-> PArray a
packPA = closure2 packPA_v packPA_l
packPA_v :: PA a => PArray a -> PArray Bool -> PArray a
packPA_v xs bs
= packByTagPA# xs (elementsSel2_1# sel) (U.tagsSel2 sel) 1#
where
sel = boolSel bs
packPA_l :: PA a
=> PArray (PArray a) -> PArray (PArray Bool) -> PArray (PArray a)
packPA_l (PArray n# xss) (PArray _ bss)
= PArray n#
$ case xss of { PNested segd xs ->
case bss of { PNested _ (PBool sel) ->
PNested (U.lengthsToSegd $ U.count_s segd (U.tagsSel2 sel) 1)
$ packByTagPD xs (elementsSel2_1# sel) (U.tagsSel2 sel) 1# }}
boolSel :: PArray Bool -> U.Sel2
boolSel (PArray _ (PBool sel)) = sel
combine2PA:: PA a => PArray a :-> PArray a :-> PArray Tag :-> PArray a
combine2PA = closure3 combine2PA_v combine2PA_l
combine2PA_v:: PA a => PArray a -> PArray a -> PArray Tag -> PArray a
combine2PA_v xs ys bs
= combine2PA# (lengthPA# xs +# lengthPA# ys)
(U.tagsToSel2 (toUArrPA bs))
xs ys
combine2PA_l
:: PA a
=> PArray (PArray a) -> PArray (PArray a)
-> PArray (PArray Tag)
-> PArray (PArray a)
combine2PA_l _ _ _
= error "dph-common:Data.Array.Parallel.Lifted.Combinators: combinePA_l isn't implemented"
filterPA :: PA a => (a :-> Bool) :-> PArray a :-> PArray a
filterPA = closure2 filterPA_v filterPA_l
filterPA_v :: PA a => (a :-> Bool) -> PArray a -> PArray a
filterPA_v p xs = packPA_v xs (mapPA_v p xs)
filterPA_l :: PA a
=> PArray (a :-> Bool) -> PArray (PArray a) -> PArray (PArray a)
filterPA_l ps xss = packPA_l xss (mapPA_l ps xss)
indexPA :: PA a => PArray a :-> Int :-> a
indexPA = closure2 indexPA_v indexPA_l
indexPA_v :: PA a => PArray a -> Int -> a
indexPA_v xs (I# i#) = indexPA# xs i#
indexPA_l :: PA a => PArray (PArray a) -> PArray Int -> PArray a
indexPA_l (PArray _ (PNested segd xs)) (PArray n# is)
= PArray n#
$ bpermutePD xs n#
(U.zipWith (+) (U.indicesSegd segd)
(fromScalarPData is))
concatPA :: PA a => PArray (PArray a) :-> PArray a
concatPA = closure1 concatPA_v concatPA_l
concatPA_v :: PA a => PArray (PArray a) -> PArray a
concatPA_v xss = concatPA# xss
concatPA_l :: PA a => PArray (PArray (PArray a)) -> PArray (PArray a)
concatPA_l (PArray m# (PNested segd1 (PNested segd2 xs)))
= PArray m#
(PNested (U.mkSegd (U.sum_s segd1 (U.lengthsSegd segd2))
(U.bpermute (U.indicesSegd segd2) (U.indicesSegd segd1))
(U.elementsSegd segd2))
xs)
appPA :: PA a => PArray a :-> PArray a :-> PArray a
appPA = closure2 appPA_v appPA_l
appPA_v :: PA a => PArray a -> PArray a -> PArray a
appPA_v xs ys = appPA# xs ys
appPA_l :: PA a => PArray (PArray a) -> PArray (PArray a) -> PArray (PArray a)
appPA_l (PArray m# pxss) (PArray n# pyss)
= PArray (m# +# n#)
$ case pxss of { PNested xsegd xs ->
case pyss of { PNested ysegd ys ->
let
segd = U.plusSegd xsegd ysegd
in
PNested segd (applPD segd xsegd xs ysegd ys) }}
enumFromToPA_Int :: Int :-> Int :-> PArray Int
enumFromToPA_Int = closure2 enumFromToPA_v enumFromToPA_l
enumFromToPA_v :: Int -> Int -> PArray Int
enumFromToPA_v m n = fromUArrPA (distance m n) (U.enumFromTo m n)
distance :: Int -> Int -> Int
distance m n = max 0 (n m + 1)
enumFromToPA_l :: PArray Int -> PArray Int -> PArray (PArray Int)
enumFromToPA_l (PArray m# ms) (PArray _ ns)
= PArray m#
$ PNested segd
$ toScalarPData
$ U.enumFromStepLenEach (U.elementsSegd segd)
(fromScalarPData ms) (U.replicate (U.elementsSegd segd) 1) lens
where
lens = U.zipWith distance (fromScalarPData ms) (fromScalarPData ns)
segd = U.lengthsToSegd lens
indexedPA :: PA a => PArray a :-> PArray (Int,a)
indexedPA = closure1 indexedPA_v indexedPA_l
indexedPA_v :: PA a => PArray a -> PArray (Int,a)
indexedPA_v (PArray n# xs)
= PArray n# (P_2 (toScalarPData $ U.enumFromStepLen 0 1 (I# n#)) xs)
indexedPA_l :: PA a => PArray (PArray a) -> PArray (PArray (Int,a))
indexedPA_l (PArray n# xss)
= PArray n#
$ case xss of { PNested segd xs ->
PNested segd (P_2 (toScalarPData $ U.indices_s segd) xs) }
slicePA :: PA a => Int :-> Int :-> PArray a :-> PArray a
slicePA = closure3 slicePA_v slicePA_l
slicePA_v :: PA a => Int -> Int -> PArray a -> PArray a
slicePA_v (I# from) (I# len) xs
= extractPA# xs from len
slicePA_l :: PA a => PArray Int -> PArray Int -> PArray (PArray a) -> PArray (PArray a)
slicePA_l (PArray n# is) (PArray _ lens) (PArray _ xss)
= PArray n#
$ case xss of { PNested segd xs ->
PNested segd'
$ bpermutePD xs (elementsSegd# segd')
(U.zipWith (+) (U.indices_s segd')
(U.replicate_s segd'
(U.zipWith (+) (fromScalarPData is)
(U.indicesSegd segd)))) }
where
segd' = U.lengthsToSegd (fromScalarPData lens)
updatePA :: PA a => PArray a :-> PArray (Int,a) :-> PArray a
updatePA = closure2 updatePA_v updatePA_l
updatePA_v :: PA a => PArray a -> PArray (Int,a) -> PArray a
updatePA_v xs (PArray n# (P_2 is ys))
= updatePA# xs (fromScalarPData is) (PArray n# ys)
updatePA_l
:: PA a => PArray (PArray a) -> PArray (PArray (Int,a)) -> PArray (PArray a)
updatePA_l (PArray m# xss) (PArray _ pss)
= PArray m#
$ case xss of { PNested segd xs ->
case pss of { PNested segd' (P_2 is ys) ->
PNested segd
$ updatePD xs (U.zipWith (+) (fromScalarPData is)
(U.replicate_s segd' (U.indicesSegd segd)))
ys }}
bpermutePA :: PA a => PArray a :-> PArray Int :-> PArray a
bpermutePA = closure2 bpermutePA_v bpermutePA_l
bpermutePA_v :: PA a => PArray a -> PArray Int -> PArray a
bpermutePA_v xs (PArray n# is) = bpermutePA# xs n# (fromScalarPData is)
bpermutePA_l :: PA a => PArray (PArray a) -> PArray (PArray Int) -> PArray (PArray a)
bpermutePA_l (PArray _ xss) (PArray n# iss)
= PArray n#
$ case xss of { PNested segd xs ->
case iss of { PNested isegd is ->
PNested isegd
$ bpermutePD xs (elementsSegd# isegd)
(U.zipWith (+) (fromScalarPData is)
(U.replicate_s isegd (U.indicesSegd segd))) }}