packages feed

SuffixStructures-0.0.1.0: src/SAperformance.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}

{-# OPTIONS_GHC -fno-cse #-}

module Main where

import           Control.DeepSeq
import           Criterion.Main
import           Data.Char (ord,chr)
import           Data.Vector.Unboxed (Vector(..))
import qualified Data.ByteString.Char8 as BS
import qualified Data.Vector.Unboxed as VU
import           System.Console.CmdArgs
import           System.Environment (withArgs)
import           System.Random.MWC (withSystemRandom, asGenST, uniformVector)

import Data.SuffixStructure.ESA
import Data.SuffixStructure.NaiveArray



data Options = Options
  { from      :: Int
  , step      :: Int
  , count     :: Int
  , remaining :: [String]
  }
  deriving (Show,Data,Typeable)

options = Options
  { from      =   1 &= help ""
  , step      =  10 &= help ""
  , count     =   5 &= help ""
  , remaining = def &= args
  }

main = do
  o@Options{..} <- cmdArgs options
  is :: [Vector Int] <- sequence . map (\k -> withSystemRandom . asGenST $ \gen -> uniformVector gen k) . take count $ (iterate (*step) from)
  let cs :: [Vector Char] = map (VU.map (chr . flip mod 256)) is
  let bs :: [BS.ByteString] = map (BS.pack . VU.toList) cs
  deepseq (is,cs,bs) $ putStrLn "vectors generated"
  withArgs remaining $ defaultMain
    [ bgroup "naive/introsort"
        $ zipWith (\k r -> bench (show k) $ whnf (VU.length . sa . genSA) r)
                  (iterate (*step) from)
                  cs
    , bgroup "naive/americanflag"
        $ zipWith (\k r -> bench (show k) $ whnf (VU.length . sa . genSAaf) r)
                  (iterate (*step) from)
                  bs
    ]