{-# LANGUAGE NoImplicitPrelude, NoMonomorphismRestriction, DataKinds, FlexibleContexts #-} module Main where import Algebra.Algorithms.Faugere4 import Algebra.Algorithms.Groebner import qualified Algebra.LinkedMatrix as LM import Algebra.Matrix import Algebra.Prelude import Control.DeepSeq import Control.Parallel.Strategies import Criterion import Criterion.Main import qualified Data.Matrix as DM import Data.Proxy (Proxy (..)) import Test.QuickCheck import Utils s3 :: SNat 3 s3 = sing s4 :: SNat 4 s4 = sing s6 :: SNat 6 s6 = sing f4Repa = faugere4 optimalStrategy f4DM = faugere4G (Proxy :: Proxy DM.Matrix) optimalStrategy -- f4SM = faugere4G (Proxy :: Proxy Sparse) optimalStrategy f4LM = faugere4LM optimalStrategy f4LMN = faugere4G (Proxy :: Proxy LM.Matrix) optimalStrategy f4Mod = faugere4Modular optimalStrategy ideal3 :: [OrderedPolynomial (Fraction Integer) Grevlex 3] ideal3 = [x^2 + y^2 + z^2 - 1, x^2 + y^2 + z^2 - 2*x, 2*x -3*y - z] where [x,y,z] = vars ideal4 :: [OrderedPolynomial (Fraction Integer) Grevlex 3] ideal4 = [x^2 * y - 2*x*y - 4*z - 1, z-y^2, x^3 - 4*z*y] where [x,y,z] = vars ideal5 :: [OrderedPolynomial (Fraction Integer) Grevlex 6] ideal5 = [ 2 * s - a * y, b^2 - (x^2 + y^2), c^2 - ( (a-x) ^ 2 + y^2) ] where [s,x,y,a,b,c] = vars ideal6 :: [OrderedPolynomial (Fraction Integer) Grevlex 3] ideal6 = [ z^5 + y^4 + x^3 - 1, z^3 + y^3 + x^2 - 1] where [x,y,z] = vars buildCase :: NFData b => a -> String -> (a -> b) -> Benchmark buildCase i name calc = bench name $ nf calc i main :: IO () main = do i1 <- return $!! (cyclic s3 `using` rdeepseq) i2 <- return $!! (cyclic s4 `using` rdeepseq) i3 <- return $!! (toIdeal ideal3 `using` rdeepseq) i4 <- return $!! (toIdeal ideal4 `using` rdeepseq) i5 <- return $!! (toIdeal ideal5 `using` rdeepseq) i6 <- return $!! (toIdeal ideal6 `using` rdeepseq) rand0 <- sample' $ idealOfDim s3 rnd <- return $!! (head (drop 2 rand0) `using` rdeepseq) putStrLn $ concat [ "random ideal: ", show rnd ] defaultMain $ [ bgroup "cyclic-3" $ map (uncurry $ buildCase i1) [("buchberger", toIdeal . calcGroebnerBasis) , ("F4-repa", f4Repa) , ("F4-dm", f4DM) -- , ("F4-sparse", f4SM) , ("F4-link-naive", f4LMN) , ("F4-link-str", f4LM) , ("F4-modular" , f4Mod) ] , bgroup "cyclic-4" $ map (uncurry $ buildCase i2) [("buchberger", toIdeal . calcGroebnerBasis) , ("F4-repa", f4Repa) , ("F4-dm", f4DM) -- , ("F4-sparse", f4SM) , ("F4-link-naive", f4LMN) , ("F4-link-str", f4LM) , ("F4-modular" , f4Mod) ] , bgroup "I3" $ map (uncurry $ buildCase i3) [("buchberger", toIdeal . calcGroebnerBasis) , ("F4-repa", f4Repa) , ("F4-dm", f4DM) -- , ("F4-sparse", f4SM) , ("F4-link-naive", f4LMN) , ("F4-link-str", f4LM) , ("F4-modular" , f4Mod) ] , bgroup "I4" $ map (uncurry $ buildCase i4) [("buchberger", toIdeal . calcGroebnerBasis) , ("F4-repa", f4Repa) , ("F4-dm", f4DM) -- , ("F4-sparse", f4SM) , ("F4-link-naive", f4LMN) , ("F4-link-str", f4LM) , ("F4-modular" , f4Mod) ] , bgroup "I5" $ map (uncurry $ buildCase i5) [("buchberger", toIdeal . calcGroebnerBasis) , ("F4-repa", f4Repa) , ("F4-dm", f4DM) -- , ("F4-sparse", f4SM) , ("F4-link-naive", f4LMN) , ("F4-link-str", f4LM) , ("F4-modular" , f4Mod) ] , bgroup "I6" $ map (uncurry $ buildCase i6) [("buchberger", toIdeal . calcGroebnerBasis) , ("F4-repa", f4Repa) , ("F4-dm", f4DM) -- , ("F4-sparse", f4SM) , ("F4-link-naive", f4LMN) , ("F4-link-str", f4LM) , ("F4-modular" , f4Mod) ] , bgroup "random-3ary" $ map (uncurry $ buildCase rnd) [("buchberger", toIdeal . calcGroebnerBasis) , ("F4-repa", f4Repa) , ("F4-dm", f4DM) -- , ("F4-sparse", f4SM) , ("F4-link-naive", f4LMN) , ("F4-link-str", f4LM) , ("F4-modular" , f4Mod) ] ]