packages feed

ADPfusion-0.5.1.0: tests/performance.hs

module Main where

import           Data.Vector.Fusion.Util
import           GHC.Stats
import qualified Data.Vector.Fusion.Stream.Monadic as SM
import qualified Data.Vector.Unboxed as VU
import           System.Mem
import           System.Environment
import           GHC.Conc (pseq)
import           GHC.Generics
import qualified Data.Vector as V
import           Control.Arrow (second)
import           Data.Int(Int64)
import           System.Exit

import           ADP.Fusion hiding (Split)
import           Data.PrimitiveArray hiding (map)
import           BenchmarkHistory



-- | All grammars require a signature.

data Split m x r = Split
  { nil :: ()  -> x
  , lef :: Int -> x -> x
  , spl :: x   -> x -> x
  , h   :: SM.Stream m x -> m r
  }

-- makeAlgebraProduct ''Split

algMax :: Monad m => Split m Int Int
algMax = Split
  { nil = \ () -> 0
  , lef = \k x -> k+x
  , spl = \ x y   -> x+y
  , h   = SM.foldl' max 0
  }
{-# Inline algMax #-}

gLeft Split{..} c t' =
  let t = t'  ( lef <<< chr c % t   |||
                spl <<< t % t       |||
                nil <<< Epsilon     ... h
              )
  in Z:.t
{-# Inline gLeft #-}

mkArrs :: Int -> (VU.Vector Int, Unboxed (Subword I) Int)
mkArrs n = ( VU.enumFromTo 1 n
           , fromAssocs (subword 0 0) (subword 0 n) (-999999) []
           )
{-# NoInline mkArrs #-}

-- | WARNING: Multiple runs of @runLeft@ make use of the same @arr@. This
-- is, of course, dangerous. Unless you know what you are doing.

runLeft :: (VU.Vector Int, Unboxed (Subword I) Int) -> Int -> Int
runLeft (!i, !arr) k = seq k d where
--  i   = VU.enumFromTo 1 k
  n   = VU.length i
--  arr = fromAssocs (subword 0 0) (subword 0 n) (-999999) []
  (Z:.t) = runLeftForward i arr
  d = unId $ axiom t
{-# NoInline runLeft #-}

runLeftForward :: VU.Vector Int -> Unboxed (Subword I) Int -> Z:.ITbl Id Unboxed EmptyOk (Subword I) Int
runLeftForward !i !arr = mutateTablesDefault
               $ gLeft algMax
                   i
                   (ITbl 0 0 EmptyOk arr)
{-# NoInline runLeftForward #-}



main :: IO ()
main = do
  es <- sequence
    [ benchmark 10000 ("bench-0100.csv") mkArrs runLeft  100
    , benchmark    10 ("bench-1000.csv") mkArrs runLeft 1000
    , benchmark     1 ("bench-2000.csv") mkArrs runLeft 2000
    ]
  let ok = all (== ExitSuccess) es
  if ok
    then exitSuccess
    else exitFailure