{-# LANGUAGE DataKinds, FlexibleContexts, FlexibleInstances, GADTs #-} {-# LANGUAGE MultiParamTypeClasses, OverloadedStrings, PolyKinds, QuasiQuotes #-} {-# LANGUAGE TemplateHaskell, UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-type-defaults -fno-warn-orphans #-} module Main where import Algebra.Algorithms.ZeroDim import Control.Concurrent import Control.DeepSeq import Control.Monad import Control.Parallel.Strategies import Criterion.Main import qualified Data.Matrix as M import qualified Data.Vector as V import Prelude hiding (product) import System.Process import Test.QuickCheck import Utils makeLinear :: Int -> Int -> IO [(M.Matrix (Fraction Integer), V.Vector (Fraction Integer))] makeLinear count dpI = liftM (take count) $ sample' $ do Equation m v <- resize dpI arbitrarySolvable return (M.fromLists m, V.fromList v) mkTestCases :: [(M.Matrix (Fraction Integer), V.Vector (Fraction Integer))] -> IO [Benchmark] mkTestCases lins0 = do lins <- return $!! (lins0 `using` rdeepseq) forM (zip [1..] lins) $ \(n,ex) -> do return $ bgroup (concat ["case-",show n]) [ bench "rank" $ nf (uncurry solveLinear') ex , bench "length" $ nf (uncurry solveLinear) ex ] main :: IO () main = do putStrLn "generating case01..." case01 <- mkTestCases =<< makeLinear 5 10 putStrLn "generating case02..." case02 <- mkTestCases =<< makeLinear 5 5 putStrLn "generating case03..." case03 <- mkTestCases =<< makeLinear 5 20 putStrLn "done. purge and sleep 10secs..." _ <- system "purge" threadDelay $ 10^7 defaultMain $ [ bgroup "size5" case02 , bgroup "size10" case01 , bgroup "size20" case03 ]