packages feed

probability-polynomial-1.0.0.0: benchmark/Main.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}

{-|
Copyright   : Predictable Network Solutions Ltd., 2020-2024
License     : BSD-3-Clause
-}
module Main (main) where

import Criterion.Main
    ( bench
    , bgroup
    , defaultMain
    , nf
    )
import Numeric.Polynomial.Simple
    ( Poly
    )

import qualified Numeric.Polynomial.Simple as Poly

longPoly :: (Integral b, Floating a, Eq a) => b -> Poly a
longPoly m = Poly.fromCoefficients $ replicate (2 ^ m) pi

mulLongPolys :: Int -> Poly Double
mulLongPolys n = longPoly n * longPoly n

addLongPolys :: Int -> Poly Double
addLongPolys n = longPoly n + longPoly n

convPolys :: Int -> [(Double, Poly Double)]
convPolys n = Poly.convolve (0, 1, Poly.constant 1) (0, 1, longPoly n)

main :: IO ()
main =
    defaultMain
        [ bgroup
            "con"
            [ bench "a1" $ nf addLongPolys 1
            , bench "a5" $ nf addLongPolys 5
            , bench "a10" $ nf addLongPolys 10
            , bench "a15" $ nf addLongPolys 15
            , bench "a20" $ nf addLongPolys 20
            , bench "m1" $ nf mulLongPolys 1
            , bench "m3" $ nf mulLongPolys 3
            , bench "m5" $ nf mulLongPolys 5
            , bench "m7" $ nf mulLongPolys 7
            , bench "m9" $ nf mulLongPolys 9
            , bench "c1" $ nf convPolys 1
            , bench "c2" $ nf convPolys 2
            , bench "c3" $ nf convPolys 3
            , bench "c4" $ nf convPolys 4
            ]
        ]