{-# LANGUAGE DataKinds, FlexibleContexts, FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses, OverloadedStrings, PolyKinds #-} {-# LANGUAGE TemplateHaskell, UndecidableInstances #-} import Algebra.Algorithms.Groebner.Monomorphic import Algebra.Internal import Algebra.Ring.Polynomial (eliminationOrder, weightedEliminationOrder) import Algebra.Ring.Polynomial.Monomorphic import Control.DeepSeq import Control.Parallel.Strategies import Criterion.Main import Criterion.Types import Data.Type.Natural import Numeric.Algebra (LeftModule (..)) import qualified Numeric.Algebra as NA x, y, z, w, s, a, b, c, t, u, v :: Polynomial (Fraction Integer) [x, y, z, w, s, a, b, c, t, u, v, x', y'] = map (injectVar . flip Variable Nothing) "xyzwsabctuvXY" instance NFData Variable where rnf (Variable x y) = rnf x `seq` rnf y `seq` () instance NFData (Polynomial (Fraction Integer)) where rnf (Polynomial dic) = rnf dic i1, i2, i3, i4 :: [Polynomial (Fraction Integer)] i1 = [x - (t + u), y - (t^2 + 2*t*u), z - (t^3 + 3*t^2*u)] i2 = [t^2 + x^2+y^2+z^2, t^2 + 2*x^2 - x*y -z^2, t+ y^3-z^3] i3 = [ 2 * s - a * y', b^2 - (x'^2 + y'^2), c^2 - ( (a-x') ^ 2 + y'^2) ] i4 = [ x - (3*u + 3*u*v^2 - u^3), y - (3*v + 3*u^2*v - v^3), z - (3*u^2 - 3*v^2)] mkTestCase :: SingI n => String -> [Polynomial (Fraction Integer)] -> SNat n -> Benchmark mkTestCase name ideal nth = bgroup name [ bench "lex" $ nf (calcGroebnerBasisWith Lex) ideal , bench "product" $ nf (calcGroebnerBasisWith (eliminationOrder nth)) ideal , bench "weight" $ nf (calcGroebnerBasisWith (weightedEliminationOrder nth)) ideal ] main :: IO () main = do ideal1 <- return $! (i1 `using` rdeepseq) ideal2 <- return $! (i2 `using` rdeepseq) ideal3 <- return $! (i3 `using` rdeepseq) ideal4 <- return $! (i4 `using` rdeepseq) [var_x, var_y, var_t] <- return $! (map (flip Variable Nothing) "xyt" `using` rdeepseq) defaultMain $ [ mkTestCase "heron" ideal3 sTwo , mkTestCase "implicit01" ideal2 sOne , mkTestCase "implicit03" ideal1 sTwo , mkTestCase "implicit04" ideal4 sTwo ]