packages feed

mcmc-0.8.1.0: bench/Bench.hs

-- |
-- Module      :  Main
-- Copyright   :  2021 Dominik Schrempf
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Creation date: Fri May  8 17:27:03 2020.
module Main
  ( main,
  )
where

import Criterion.Main
import Data.List
import Mcmc.Internal.SpecFunctions
import Normal
import Numeric.SpecFunctions
import Poisson
import System.Random.Stateful

gammaBenchG :: RealFloat a => (a -> a) -> [a] -> a
gammaBenchG f = foldl' (\acc x -> acc + f x) 0
{-# SPECIALIZE gammaBenchG :: (Double -> Double) -> [Double] -> Double #-}

gammaVals :: [Double]
gammaVals = [0, 0.01 .. 10000]

main :: IO ()
main = do
  let g = mkStdGen 0
  defaultMain
    [ bgroup
        "Normal"
        [ bench "Slide" $ nfIO (normalSlideBench g),
          bench "Bactrian" $ nfIO (normalBactrianBench g),
          bench "LargeCycle" $ nfIO (normalLargeCycleBench g)
        ],
      bgroup
        "Poisson"
        [ bench "Random walk" $ nfIO (poissonBench g),
          bench "Hamiltonian" $ nfIO (poissonHamiltonianBench g)
        ],
      bgroup
        "MC3"
        [ bench "MC3 2" $ nfIO (normalMC3 g 2),
          bench "MC3 3" $ nfIO (normalMC3 g 3),
          bench "MC3 4" $ nfIO (normalMC3 g 4),
          bench "MC3 5" $ nfIO (normalMC3 g 5),
          bench "MC3 10" $ nfIO (normalMC3 g 10)
        ],
      bgroup
        "probability"
        [ bench "gamma function general" $
            nf (gammaBenchG logGammaG) gammaVals,
          bench "gamma function specialized" $
            nf (gammaBenchG logGamma) gammaVals
        ]
    ]

-- benchmarking Normal/Slide
-- time                 24.12 ms   (23.52 ms .. 24.76 ms)
--                      0.997 R²   (0.995 R² .. 0.999 R²)
-- mean                 23.70 ms   (23.44 ms .. 24.02 ms)
-- std dev              658.2 μs   (448.5 μs .. 837.2 μs)

-- benchmarking Normal/Bactrian
-- time                 26.65 ms   (26.08 ms .. 27.26 ms)
--                      0.998 R²   (0.996 R² .. 1.000 R²)
-- mean                 26.53 ms   (26.32 ms .. 26.91 ms)
-- std dev              626.9 μs   (322.3 μs .. 1.040 ms)

-- benchmarking Normal/LargeCycle
-- time                 52.48 ms   (51.51 ms .. 53.83 ms)
--                      0.999 R²   (0.998 R² .. 1.000 R²)
-- mean                 52.54 ms   (51.62 ms .. 54.90 ms)
-- std dev              2.765 ms   (758.0 μs .. 4.788 ms)
-- variance introduced by outliers: 14% (moderately inflated)

-- benchmarking Poisson/Random walk
-- time                 86.57 ms   (86.06 ms .. 86.97 ms)
--                      1.000 R²   (1.000 R² .. 1.000 R²)
-- mean                 86.57 ms   (86.20 ms .. 87.14 ms)
-- std dev              775.9 μs   (415.4 μs .. 1.205 ms)

-- benchmarking Poisson/Hamiltonian
-- time                 2.890 s    (2.313 s .. 3.359 s)
--                      0.993 R²   (0.992 R² .. 1.000 R²)
-- mean                 3.082 s    (2.960 s .. 3.153 s)
-- std dev              120.4 ms   (39.93 ms .. 164.0 ms)
-- variance introduced by outliers: 19% (moderately inflated)

-- benchmarking MC3/MC3 2
-- time                 7.771 ms   (7.573 ms .. 8.008 ms)
--                      0.996 R²   (0.993 R² .. 0.999 R²)
-- mean                 7.810 ms   (7.722 ms .. 7.974 ms)
-- std dev              328.3 μs   (223.0 μs .. 517.6 μs)
-- variance introduced by outliers: 19% (moderately inflated)

-- benchmarking MC3/MC3 3
-- time                 10.69 ms   (10.57 ms .. 10.87 ms)
--                      0.997 R²   (0.993 R² .. 1.000 R²)
-- mean                 10.73 ms   (10.65 ms .. 10.90 ms)
-- std dev              308.1 μs   (132.2 μs .. 528.9 μs)

-- benchmarking MC3/MC3 4
-- time                 13.81 ms   (13.66 ms .. 14.08 ms)
--                      0.999 R²   (0.997 R² .. 1.000 R²)
-- mean                 13.73 ms   (13.67 ms .. 13.85 ms)
-- std dev              213.2 μs   (95.38 μs .. 334.4 μs)

-- benchmarking MC3/MC3 5
-- time                 16.80 ms   (16.65 ms .. 16.93 ms)
--                      0.999 R²   (0.997 R² .. 1.000 R²)
-- mean                 16.99 ms   (16.87 ms .. 17.23 ms)
-- std dev              376.6 μs   (162.3 μs .. 589.3 μs)

-- benchmarking MC3/MC3 10
-- time                 32.59 ms   (32.10 ms .. 33.20 ms)
--                      0.999 R²   (0.998 R² .. 1.000 R²)
-- mean                 32.21 ms   (32.07 ms .. 32.46 ms)
-- std dev              390.9 μs   (219.6 μs .. 640.0 μs)

-- benchmarking probability/gamma function general
-- time                 60.73 ms   (60.37 ms .. 61.26 ms)
--                      1.000 R²   (1.000 R² .. 1.000 R²)
-- mean                 60.70 ms   (60.49 ms .. 60.91 ms)
-- std dev              385.5 μs   (287.3 μs .. 513.5 μs)

-- benchmarking probability/gamma function specialized
-- time                 59.00 ms   (58.74 ms .. 59.32 ms)
--                      1.000 R²   (1.000 R² .. 1.000 R²)
-- mean                 58.83 ms   (58.76 ms .. 58.97 ms)
-- std dev              168.3 μs   (105.7 μs .. 245.7 μs)