{-# LANGUAGE ScopedTypeVariables #-}
module Mcmc.Internal.Random
( splitGen,
saveGen,
loadGen,
)
where
import Control.Monad
import Control.Monad.Primitive
import qualified Data.Vector.Unboxed as V
import Data.Word
import System.Random.MWC
splitGen :: PrimMonad m => Int -> Gen (PrimState m) -> m [Gen (PrimState m)]
splitGen :: Int -> Gen (PrimState m) -> m [Gen (PrimState m)]
splitGen Int
n Gen (PrimState m)
gen
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = [Gen (PrimState m)] -> m [Gen (PrimState m)]
forall (m :: * -> *) a. Monad m => a -> m a
return []
| Bool
otherwise = do
[Vector Word32]
seeds :: [V.Vector Word32] <- Int -> m (Vector Word32) -> m [Vector Word32]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n (m (Vector Word32) -> m [Vector Word32])
-> m (Vector Word32) -> m [Vector Word32]
forall a b. (a -> b) -> a -> b
$ Gen (PrimState m) -> Int -> m (Vector Word32)
forall (m :: * -> *) g a (v :: * -> *).
(PrimMonad m, StatefulGen g m, Uniform a, Vector v a) =>
g -> Int -> m (v a)
uniformVector Gen (PrimState m)
gen Int
256
(Vector Word32 -> m (Gen (PrimState m)))
-> [Vector Word32] -> m [Gen (PrimState m)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Vector Word32 -> m (Gen (PrimState m))
forall (m :: * -> *) (v :: * -> *).
(PrimMonad m, Vector v Word32) =>
v Word32 -> m (Gen (PrimState m))
initialize [Vector Word32]
seeds
saveGen :: GenIO -> IO (V.Vector Word32)
saveGen :: GenIO -> IO (Vector Word32)
saveGen = (Seed -> Vector Word32) -> IO Seed -> IO (Vector Word32)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Seed -> Vector Word32
fromSeed (IO Seed -> IO (Vector Word32))
-> (Gen RealWorld -> IO Seed)
-> Gen RealWorld
-> IO (Vector Word32)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Gen RealWorld -> IO Seed
forall (m :: * -> *). PrimMonad m => Gen (PrimState m) -> m Seed
save
loadGen :: V.Vector Word32 -> IO GenIO
loadGen :: Vector Word32 -> IO GenIO
loadGen = Seed -> IO (Gen RealWorld)
forall (m :: * -> *). PrimMonad m => Seed -> m (Gen (PrimState m))
restore (Seed -> IO (Gen RealWorld))
-> (Vector Word32 -> Seed) -> Vector Word32 -> IO (Gen RealWorld)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Word32 -> Seed
forall (v :: * -> *). Vector v Word32 => v Word32 -> Seed
toSeed