#include "fusion-phases.h"
module Data.Array.Parallel.Unlifted.Parallel.Extracts
(
indexsFromVector
, indexsFromVectorsUPVSegdP
, indexsFromVectorsUPVSegd
, extractsFromNestedUPSSegd
, extractsFromVectorsUPSSegd
, extractsFromVectorsUPVSegdP
, extractsFromVectorsUPVSegd
, extractsFromVectorsUPSSegdSegmap)
where
import Data.Array.Parallel.Unlifted.Distributed
import Data.Array.Parallel.Unlifted.Distributed.What
import Data.Array.Parallel.Unlifted.Parallel.UPSSegd (UPSSegd)
import Data.Array.Parallel.Unlifted.Parallel.UPVSegd (UPVSegd)
import Data.Array.Parallel.Unlifted.Vectors (Vectors)
import Data.Array.Parallel.Unlifted.Sequential.Vector as Seq
import qualified Data.Array.Parallel.Unlifted.Parallel.UPSSegd as UPSSegd
import qualified Data.Array.Parallel.Unlifted.Parallel.UPVSegd as UPVSegd
import qualified Data.Array.Parallel.Unlifted.Sequential.UVSegd as UVSegd
import qualified Data.Array.Parallel.Unlifted.Sequential.USegd as USegd
import qualified Data.Array.Parallel.Unlifted.Sequential.USSegd as USSegd
import qualified Data.Array.Parallel.Unlifted.Vectors as US
import qualified Data.Array.Parallel.Unlifted.Stream as US
import qualified Data.Array.Parallel.Unlifted.Sequential as Seq
import qualified Data.Vector as V
import Prelude as P
indexsFromVector
:: Unbox a
=> Vector a -> Vector Int -> Vector a
indexsFromVector = Seq.indexsFromVector
indexsFromVectorsUPVSegdP
:: (Unbox a, US.Unboxes a)
=> Vectors a -> UPVSegd -> Vector (Int, Int) -> Vector a
indexsFromVectorsUPVSegdP vectors upvsegd vsrcixs
= splitJoinD theGang
(mapD (What "indexsFromVectorsUPVSegdP") theGang
(indexsFromVectorsUPVSegd vectors upvsegd))
vsrcixs
indexsFromVectorsUPVSegd
:: (Unbox a, US.Unboxes a)
=> Vectors a -> UPVSegd -> Vector (Int, Int) -> Vector a
indexsFromVectorsUPVSegd vectors upvsegd vsrcixs
= let
!vsegids = UPVSegd.takeVSegidsRedundant upvsegd
!upssegd = UPVSegd.takeUPSSegdRedundant upvsegd
!ussegd = UPSSegd.takeUSSegd upssegd
in Seq.unstream
$ US.streamElemsFromVectors vectors
$ US.streamSrcIxsThroughUSSegd ussegd
$ US.streamSrcIxsThroughVSegids vsegids
$ Seq.stream vsrcixs
extractsFromNestedUPSSegd
:: Unbox a
=> UPSSegd -> V.Vector (Vector a) -> Vector a
extractsFromNestedUPSSegd upssegd vectors
= Seq.unstream
$ US.streamSegsFromNestedUSSegd
vectors
(UPSSegd.takeUSSegd upssegd)
extractsFromVectorsUPSSegd
:: (Unbox a, US.Unboxes a)
=> UPSSegd
-> Vectors a
-> Vector a
extractsFromVectorsUPSSegd upssegd vectors
= Seq.extractsFromVectorsUSSegd
(UPSSegd.takeUSSegd upssegd)
vectors
extractsFromVectorsUPVSegdP
:: (Unbox a, US.Unboxes a)
=> UPVSegd
-> Vectors a
-> Vector a
extractsFromVectorsUPVSegdP !upvsegd !vectors
= let !segs = UPVSegd.takeDistributed upvsegd
!vsegids = UPVSegd.takeVSegidsRedundant upvsegd
!ussegd = UPSSegd.takeUSSegd
$ UPVSegd.takeUPSSegdRedundant upvsegd
in joinD theGang balanced
$ mapD (What "extractsFromVectorsUPVSegdP")
theGang
(extractsFromVectorsUPSSegd_split
ussegd
vsegids
vectors)
segs
extractsFromVectorsUPSSegd_split
:: (Unbox a, US.Unboxes a)
=> USSegd.USSegd
-> Vector Int
-> Vectors a
-> ((USegd.USegd,Int),Int)
-> Vector a
extractsFromVectorsUPSSegd_split !ussegd !vsegids !vectors !which
= Seq.unstream
$ US.streamSegsFromVectorsUSSegd_split vectors
ussegd vsegids which
extractsFromVectorsUPVSegd
:: (Unbox a, US.Unboxes a)
=> UPVSegd
-> Vectors a
-> Vector a
extractsFromVectorsUPVSegd upvsegd vectors
= Seq.unstream
$ US.streamSegsFromVectorsUVSegd vectors
$ UVSegd.mkUVSegd
(UPVSegd.takeVSegidsRedundant upvsegd)
(UPSSegd.takeUSSegd $ UPVSegd.takeUPSSegdRedundant upvsegd)
extractsFromVectorsUPSSegdSegmap
:: (Unbox a, US.Unboxes a)
=> UPSSegd
-> Vectors a
-> Vector Int
-> Vector a
extractsFromVectorsUPSSegdSegmap upssegd vectors segmap
= Seq.unstream
$ US.streamSegsFromVectorsUSSegdSegmap vectors
(UPSSegd.takeUSSegd upssegd)
segmap