{-# 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 ] ]