#include "fusion-phases.h"
module Data.Array.Parallel.Unlifted.Distributed.Types.USegd
( mkDUSegd
, lengthD
, takeLengthsD
, takeIndicesD
, takeElementsD)
where
import Data.Array.Parallel.Unlifted.Distributed.Types.Base
import Data.Array.Parallel.Unlifted.Sequential.USegd (USegd)
import Data.Array.Parallel.Unlifted.Sequential.Vector (Vector)
import Data.Array.Parallel.Pretty
import Control.Monad
import qualified Data.Array.Parallel.Unlifted.Distributed.Types.Vector as DV
import qualified Data.Array.Parallel.Unlifted.Sequential.USegd as USegd
import Prelude as P
instance DT USegd where
data Dist USegd
= DUSegd !(Dist (Vector Int))
!(Dist (Vector Int))
!(Dist Int)
data MDist USegd s
= MDUSegd !(MDist (Vector Int) s)
!(MDist (Vector Int) s)
!(MDist Int s)
indexD str (DUSegd lens idxs eles) i
= USegd.mkUSegd
(indexD (str ++ "/indexD[USegd]") lens i)
(indexD (str ++ "/indexD[USegd]") idxs i)
(indexD (str ++ "/indexD[USegd]") eles i)
newMD g
= liftM3 MDUSegd (newMD g) (newMD g) (newMD g)
readMD (MDUSegd lens idxs eles) i
= liftM3 USegd.mkUSegd (readMD lens i) (readMD idxs i) (readMD eles i)
writeMD (MDUSegd lens idxs eles) i segd
= do writeMD lens i (USegd.takeLengths segd)
writeMD idxs i (USegd.takeIndices segd)
writeMD eles i (USegd.takeElements segd)
unsafeFreezeMD (MDUSegd lens idxs eles)
= liftM3 DUSegd (unsafeFreezeMD lens)
(unsafeFreezeMD idxs)
(unsafeFreezeMD eles)
deepSeqD segd z
= deepSeqD (USegd.takeLengths segd)
$ deepSeqD (USegd.takeIndices segd)
$ deepSeqD (USegd.takeElements segd) z
sizeD (DUSegd _ _ eles) = sizeD eles
sizeMD (MDUSegd _ _ eles) = sizeMD eles
measureD segd
= "Segd " P.++ show (USegd.length segd)
P.++ " " P.++ show (USegd.takeElements segd)
instance PprPhysical (Dist USegd) where
pprp (DUSegd lens indices elements)
= text "DUSegd"
$$ (nest 7 $ vcat
[ text "lengths: " <+> pprp lens
, text "indices: " <+> pprp indices
, text "elements:" <+> pprp elements])
mkDUSegd
:: Dist (Vector Int)
-> Dist (Vector Int)
-> Dist Int
-> Dist USegd
mkDUSegd = DUSegd
lengthD :: Dist USegd -> Dist Int
lengthD (DUSegd lens _ _)
= DV.lengthD lens
takeLengthsD :: Dist USegd -> Dist (Vector Int)
takeLengthsD (DUSegd lens _ _ )
= lens
takeIndicesD :: Dist USegd -> Dist (Vector Int)
takeIndicesD (DUSegd _ idxs _)
= idxs
takeElementsD :: Dist USegd -> Dist Int
takeElementsD (DUSegd _ _ dns)
= dns