packages feed

arithmoi-0.5.0.0: benchmark/Math/NumberTheory/RecurrenciesBench.hs

{-# LANGUAGE RankNTypes #-}

module Math.NumberTheory.RecurrenciesBench
  ( benchSuite
  ) where

import Criterion.Main
import Numeric.Natural
import System.Random

import Math.NumberTheory.Recurrencies.Bilinear

benchTriangle :: String -> (forall a. (Integral a) => [[a]]) -> Int -> Benchmark
benchTriangle name triangle n = bgroup name
  [ benchAt (10 * n)  (1 * n)
  , benchAt (10 * n)  (2 * n)
  , benchAt (10 * n)  (5 * n)
  , benchAt (10 * n)  (9 * n)
  ]
  where
    benchAt i j = bench ("!! " ++ show i ++ " !! " ++ show j)
                $ nf (\(x, y) -> triangle !! x !! y :: Integer) (i, j)

benchSuite = bgroup "Bilinear"
  [ benchTriangle "binomial"  binomial 1000
  , benchTriangle "stirling1" stirling1 100
  , benchTriangle "stirling2" stirling2 100
  , benchTriangle "eulerian1" eulerian1 100
  , benchTriangle "eulerian2" eulerian2 100
  ]