{-# LANGUAGE DataKinds #-}
module Main where
import Algebra.Ring.Polynomial (OrderedPolynomial)
import Algebra.Ring.Polynomial.Univariate
import Criterion.Main
import Data.Char (toLower)
import Data.List (intercalate)
import qualified Data.Map as M
import Data.Proxy (Proxy (..))
import Data.Sized.Builtin (singleton)
import Data.Typeable
import Numeric.Field.Fraction
import qualified Test.QuickCheck as QC
import Utils ()
x :: Unipol (Fraction Integer)
x = var 0
mkSimpleEnv :: Int -> IO (Unipol (Fraction Integer), Unipol (Fraction Integer))
mkSimpleEnv n = return (x ^ n - 1, x - 1)
fromOP :: OrderedPolynomial (Fraction Integer) Grevlex 1
-> Unipol (Fraction Integer)
fromOP = injectVars
fromCoeffVec :: CoeffRing r => [r] -> Unipol r
fromCoeffVec = polynomial' . M.fromList . zip [singleton n | n <- [0..]]
genPoly :: Int -> IO (Unipol (Fraction Integer))
genPoly len = QC.generate $ fromCoeffVec <$> QC.vectorOf len QC.arbitrary
genPair l r = do
(f, g) <- (,) <$> genPoly l <*> genPoly r
let path = intercalate "-" ["bench/results/unipol-div-", show l, "-", show r]
++ ".txt"
writeFile path $ unlines [show f, show g]
return (f, g)
main :: IO ()
main = do
defaultMain $
[ bgroup "(x^n-1)%(x-1)"
[ env (mkSimpleEnv n) $ \ ~(f, g) ->
bgroup (show n)
[bench "naive" $ nf (uncurry divModUnipol) (f, g)
,bench "mult" $ nf (uncurry divModUnipol) (f, g)
]
| n <- [1,4,8,16] ++ [50,100,500,1000,10000]
]
, bgroup "random" $
[ env (genPair l r) $ \ ~(f, g) ->
bgroup (show l ++ " % " ++ show r)
[bench "naive" $ nf (uncurry divModUnipol) (f, g)
,bench "mult" $ nf (uncurry divModUnipolByMult) (f, g)
]
| (l, r) <- [(5,2), (10,5), (100,50),(200,100),(500,250)]
]
]