packages feed

accelerate-examples-0.12.0.0: examples/tests/simple/SliceExamples.hs

{-# LANGUAGE TypeOperators, ScopedTypeVariables #-}
module SliceExamples where

import Data.Array.Accelerate as Acc
import qualified Data.Array.Unboxed as UA

--    y
--    ^
--    |  3   4 
--    |  1   2
--     -------> x
--
arr :: Acc (Array DIM2 Int)
arr = use $ fromList (Z:.2:.2) [1,2,3,4]

slice1 :: Exp (Z:.Int:.All:.All)
slice1 = lift $ Z:.(2::Int):.All:.All

slice2 :: Exp (Z:.All:.Int:.All)
slice2 = lift $ Z:.All:.(2::Int):.All

slice3 :: Exp (Z:.All:.All:.Int)
slice3 = lift $ Z:.All:.All:.(2::Int)

-- Replicate into z-axis
-- should produce [1,2,3,4,1,2,3,4]
test1 :: Acc (Array DIM3 Int)
test1 = Acc.replicate slice1 arr

-- Replicate into y-axis
-- should produce [1,2,1,2,3,4,3,4]
test2 :: Acc (Array DIM3 Int)
test2 =  Acc.replicate slice2 arr

-- Replicate into x-axis
-- should produce [1,1,2,2,3,3,4,4]
test3 :: Acc (Array DIM3 Int)
test3 =  Acc.replicate slice3 arr

--
-- repN. Replicates an array into the rightmost dimension of
-- the result array.
--
repN :: forall sh e. (Shape sh, Elt e)
     => Int 
     -> Acc (Array sh e)
     -> Acc (Array (sh:.Int) e)
repN n a = Acc.replicate (lift (Any:.n :: Any sh:.Int)) a

repExample :: Acc (Array DIM2 Int) -> Acc (Array DIM3 Int)
repExample = repN 2

repExample' :: Acc (Array DIM2 Int) -> Acc (Array DIM3 Int)
repExample' = Acc.replicate (lift (Z:.All:.All:.(2::Int)))

slice1' :: Any (Z:.Int:.Int) :. Int
slice1' = Any:.2

slice2' :: Z:.All:.All:.Int
slice2' = Z:.All:.All:.2

run1 :: IO (() -> UA.UArray (Int,Int,Int) Int, () -> Acc (Array DIM3 Int))
run1 = return (\() -> UA.array ((0,0,0),(1,1,1)) [ ((0,0,0), 1)
                                                 , ((0,0,1), 2)
                                                 , ((0,1,0), 3)
                                                 , ((0,1,1), 4)
                                                 , ((1,0,0), 1)
                                                 , ((1,0,1), 2)
                                                 , ((1,1,0), 3)
                                                 , ((1,1,1), 4) ]
              ,\() -> test1)


run2 :: IO (() -> UA.UArray (Int,Int,Int) Int, () -> Acc (Array DIM3 Int))
run2 = return (\() -> UA.array ((0,0,0),(1,1,1)) [ ((0,0,0), 1)
                                                 , ((0,0,1), 2)
                                                 , ((0,1,0), 1)
                                                 , ((0,1,1), 2)
                                                 , ((1,0,0), 3)
                                                 , ((1,0,1), 4)
                                                 , ((1,1,0), 3)
                                                 , ((1,1,1), 4) ]
              ,\() -> test2)

run3 :: IO (() -> UA.UArray (Int,Int,Int) Int, () -> Acc (Array DIM3 Int))
run3 = return (\() -> UA.array ((0,0,0),(1,1,1)) [ ((0,0,0), 1)
                                                 , ((0,0,1), 1)
                                                 , ((0,1,0), 2)
                                                 , ((0,1,1), 2)
                                                 , ((1,0,0), 3)
                                                 , ((1,0,1), 3)
                                                 , ((1,1,0), 4)
                                                 , ((1,1,1), 4) ]
              ,\() -> test3)
run4 :: IO (() -> UA.UArray (Int,Int,Int) Int, () -> Acc (Array DIM3 Int))
run4 = return (\() -> UA.array ((0,0,0),(1,1,1)) [ ((0,0,0), 1)
                                                 , ((0,0,1), 1)
                                                 , ((0,1,0), 2)
                                                 , ((0,1,1), 2)
                                                 , ((1,0,0), 3)
                                                 , ((1,0,1), 3)
                                                 , ((1,1,0), 4)
                                                 , ((1,1,1), 4) ]
              ,\() -> repExample arr)

run5 :: IO (() -> UA.UArray (Int,Int,Int) Int, () -> Acc (Array DIM3 Int))
run5 = return (\() -> UA.array ((0,0,0),(1,1,1)) [ ((0,0,0), 1)
                                                 , ((0,0,1), 1)
                                                 , ((0,1,0), 2)
                                                 , ((0,1,1), 2)
                                                 , ((1,0,0), 3)
                                                 , ((1,0,1), 3)
                                                 , ((1,1,0), 4)
                                                 , ((1,1,1), 4) ]
              ,\() -> repExample' arr)