dph-prim-seq: add missing indexs and extracts functions
authorBen Lippmeier <benl@ouroborus.net>
Fri, 16 Dec 2011 03:55:49 +0000 (14:55 +1100)
committerBen Lippmeier <benl@ouroborus.net>
Fri, 16 Dec 2011 03:55:49 +0000 (14:55 +1100)
dph-prim-seq/Data/Array/Parallel/Unlifted.hs
dph-prim-seq/Data/Array/Parallel/Unlifted/Sequential.hs
dph-prim-seq/Data/Array/Parallel/Unlifted/Sequential/Extracts.hs

index 5d3090b..8e832a6 100644 (file)
@@ -46,12 +46,12 @@ enumFromStepLenEach     = U.enumFromStepLenEach
 -- Projections ----------------------------------------------------------------
 length                  = U.length
 index                   = U.index
-indexs_avs              = Prelude.error "dph-prim-seq: indexs_avs wrapper not defined"
+indexs_avs              = indexsFromVectorsUVSegd
 
 extract                 = U.extract
 extracts_nss            = extractsFromNestedUSSegd
 extracts_ass            = extractsFromVectorsUSSegd
-extracts_avs            = Prelude.error "dph-prim-seq: extracts_avs: not done"
+extracts_avs            = extractsFromVectorsUVSegd
 drop                    = U.drop
 
 
index e683755..4a936a6 100644 (file)
@@ -29,9 +29,11 @@ module Data.Array.Parallel.Unlifted.Sequential
           -- * Pack and Combine
         , combineSU
         
-          -- * Extracts
+          -- * Extracts and Indexing
+        , indexsFromVectorsUVSegd
         , extractsFromNestedUSSegd
-        , extractsFromVectorsUSSegd)
+        , extractsFromVectorsUSSegd
+        , extractsFromVectorsUVSegd)
 where
 import Data.Array.Parallel.Unlifted.Sequential.Basics
 import Data.Array.Parallel.Unlifted.Sequential.Combinators
index ea1112d..a297866 100644 (file)
@@ -3,33 +3,70 @@
 
 -- | Standard combinators for segmented unlifted arrays.
 module Data.Array.Parallel.Unlifted.Sequential.Extracts
-        ( extractsFromNestedUSSegd
-        , extractsFromVectorsUSSegd)
+        ( -- * Scattered indexing.
+          indexsFromVectorsUVSegd
+
+          -- * Scattered extracts
+        , extractsFromNestedUSSegd
+        , extractsFromVectorsUSSegd
+        , extractsFromVectorsUVSegd)
 where
-import Data.Array.Parallel.Unlifted.Stream
+import Data.Array.Parallel.Unlifted.Stream                      as US
 import Data.Array.Parallel.Unlifted.Vectors                     as US
 import Data.Array.Parallel.Unlifted.Sequential.Vector           as U
 import Data.Array.Parallel.Unlifted.Sequential.USSegd           (USSegd)
+import Data.Array.Parallel.Unlifted.Sequential.UVSegd           (UVSegd)
+import qualified Data.Array.Parallel.Unlifted.Sequential.UVSegd as UVSegd
 import qualified Data.Vector                                    as V
-import qualified Data.Vector.Generic                            as G
+
+
+-- Indexs --------------------------------------------------------------------
+-- | Lookup elements from some `Vectors` through a `UPVSegd`.
+indexsFromVectorsUVSegd 
+        :: (Unbox a, US.Unboxes a)
+        => Vectors a -> UVSegd -> Vector (Int, Int) -> Vector a
+
+indexsFromVectorsUVSegd vectors uvsegd vsrcixs
+ = let  -- Because we're just doing indexing here, we don't need the culled
+        -- vsegids or ussegd, and can just use the redundant version.
+        !vsegids  = UVSegd.takeVSegidsRedundant uvsegd
+        !ussegd   = UVSegd.takeUSSegdRedundant  uvsegd
+   in   U.unstream
+         $ US.streamElemsFromVectors     vectors
+         $ US.streamSrcIxsThroughUSSegd  ussegd
+         $ US.streamSrcIxsThroughVSegids vsegids
+         $ U.stream vsrcixs
+{-# INLINE_U indexsFromVectorsUVSegd #-}
 
 
 -- Extracts wrappers ---------------------------------------------------------
--- | Copy segments from a `Vectors` and concatenate them into a new array.
+-- | Copy segments from a `Vectors`, concatenating them into a new array.
 extractsFromNestedUSSegd
         :: (U.Unbox a)
         => USSegd -> V.Vector (Vector a) -> U.Vector a
 
 extractsFromNestedUSSegd ussegd vectors
-        = G.unstream $ streamSegsFromNestedUSSegd vectors ussegd
+        = U.unstream $ streamSegsFromNestedUSSegd vectors ussegd
 {-# INLINE_U extractsFromNestedUSSegd #-}
 
 
--- | Copy segments from a `Vectors` and concatenate them into a new array.
+-- | Copy segments from a `Vectors`, concatenating them into a new array.
 extractsFromVectorsUSSegd
         :: (Unboxes a, U.Unbox a)
         => USSegd -> Vectors a -> U.Vector a
 
 extractsFromVectorsUSSegd ussegd vectors
-        = G.unstream $ streamSegsFromVectorsUSSegd vectors ussegd
+        = U.unstream $ streamSegsFromVectorsUSSegd vectors ussegd
 {-# INLINE_U extractsFromVectorsUSSegd #-}
+
+
+-- | Copy segments from a `Vectors`, concatenating them into a new array.
+extractsFromVectorsUVSegd
+        :: (Unbox a, US.Unboxes a)
+        => UVSegd
+        -> Vectors a
+        -> Vector a
+
+extractsFromVectorsUVSegd uvsegd vectors
+        = U.unstream  $ US.streamSegsFromVectorsUVSegd vectors uvsegd
+{-# INLINE_U extractsFromVectorsUVSegd #-}