packages feed

probable-0.1.0.0: bench/distrib.hs

module Main where

import Control.Applicative
import Control.Monad
import Control.Monad.Primitive
import Criterion.Main
import System.Random.MWC

import qualified Data.Vector         as V
import qualified Data.Vector.Unboxed as U
import Math.Probable

n :: Int
n = 100000

data Fruit = Apple | Banana | Orange
    deriving (Eq, Show)

fruitDist :: FromFinite d => d Fruit
fruitDist = weighted [ (Apple, 0.3)
                     , (Banana, 0.6)
                     , (Orange, 0.1)
                     ]
liftF' :: Fin a -> IO a
liftF' dist = do
    d <- withSystemRandom . asGenIO $ uniform
    pick (P d) (exact dist)

instance FromFinite IO where
    weighted = liftF' . weighted

observe1 :: RandT IO Fruit -> IO (V.Vector Fruit)
observe1 = mwc . vectorOf5 n

observe2 :: RandT IO Fruit -> IO (V.Vector Fruit)
observe2 r = mwc . RandT $ \gen ->
   V.replicateM n (runRandT r gen)

observe4 :: IO Fruit
         -> IO (V.Vector Fruit)
observe4 fr = 
    V.replicateM n (fr gen)


-- | Time to benchmark!
main :: IO ()
main = do 
    defaultMain 
        [ 
            bgroup "big vector of fruits"
                [ bench "observe1" $ whnfIO (observe1 fruitDist)
                , bench "observe2" $ whnfIO (observe2 fruitDist)
                , bench "observe3" $ whnfIO (observe4 fruitDist)
                ]
        ]