module Data.Array.Accelerate.System.Random.MWC (
(:~>),
uniform, uniformR,
randomArray, randomArrayWith,
module System.Random.MWC,
) where
import System.Random.MWC hiding ( uniform, uniformR )
import qualified System.Random.MWC as R
import Data.Array.Accelerate as A
import Data.Array.Accelerate.Array.Data as A
import Data.Array.Accelerate.Array.Sugar as Sugar
type sh :~> e = sh -> GenIO -> IO e
uniform :: (Shape sh, Elt e, Variate e) => sh :~> e
uniform _ = R.uniform
uniformR :: (Shape sh, Elt e, Variate e) => (e, e) -> sh :~> e
uniformR bounds _ = R.uniformR bounds
randomArray :: (Shape sh, Elt e) => sh :~> e -> sh -> IO (Array sh e)
randomArray f sh
= do
gen <- create
randomArrayWith gen f sh
randomArrayWith
:: (Shape sh, Elt e)
=> GenIO
-> sh :~> e
-> sh
-> IO (Array sh e)
randomArrayWith gen f sh
= do
adata <- runRandomArray f sh gen
return $! Array (fromElt sh) adata
runRandomArray
:: (Shape sh, Elt e)
=> sh :~> e
-> sh
-> GenIO
-> IO (MutableArrayData (EltRepr e))
runRandomArray f sh gen
= do
arr <- newArrayData $! Sugar.size sh
let write ix = unsafeWriteArrayData arr (Sugar.toIndex sh ix)
. fromElt =<< f ix gen
iter sh write (>>) (return ())
return arr