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