packages feed

accelerate-examples-0.2.0.0: tests/primitives/Permute.hs

module Permute where

import Random

import System.Random.MWC
import Data.Array.Unboxed
import Data.Array.Accelerate as Acc
import Prelude               as P


-- Tests
-- -----

histogramAcc :: (Int,Int) -> Vector Float -> Acc (Vector Int)
histogramAcc (m,n) vec =
  let vec'  = use vec
      zeros = generate (constant (Z:. n-m)) (const 0)
      ones  = generate (shape vec') (const 1)
  in
  permute (+) zeros (\ix -> index1 $ Acc.floor (vec' Acc.! ix)) ones

histogramRef :: (Int,Int) -> UArray Int Float -> UArray Int Int
histogramRef (m,n) vec =
  accumArray (+) 0 (0,n-m-1) [(P.floor e, 1) | e <- elems vec]


-- Main
-- ----
run :: String -> Int -> IO (() -> UArray Int Int, () -> Acc (Vector Int))
run alg n = withSystemRandom $ \gen -> do
  vec  <- randomUArrayR (0,100::Float) gen n
  vec' <- convertUArray vec
  --
  let go f g = return (\() -> f vec, \() -> g vec')
  case alg of
    "histogram" -> go (histogramRef (0,100)) (histogramAcc (0,100))
    _           -> error $ "unknown variant: " ++ alg