packages feed

multilinear-io-0.2.3: benchmark/Bench.hs

{-|
Module      : Bench
Description : Benchmark of Multilinear library
Copyright   : (c) Artur M. Brodzki, 2018
License     : BSD3
Maintainer  : artur@brodzki.org
Stability   : experimental
Portability : Windows/POSIX

-}

module Main (
    main
) where

import           Control.Monad.Trans.Except
import           Control.Monad.Trans.Maybe
import           Criterion.Main
import           Multilinear.Generic
import           Multilinear.Generic.Serialize
import qualified Multilinear.Matrix         as Matrix
import           System.Directory

pathPref :: String
pathPref = "benchmark/matrix-"

gen :: Int -> Int -> Double
gen j k = sin (fromIntegral j) + cos (fromIntegral k)

writeMatrixBinaryBench :: Int -> Benchmark
writeMatrixBinaryBench s = 
    let path = pathPref ++ show s ++ ".zlib" in 
    bench (show s ++ "x" ++ show s) $ 
        nfIO $ toBinaryFile (Matrix.fromIndices "ij" s s gen) path

readMatrixBinaryBench :: Int -> Benchmark
readMatrixBinaryBench s = do
    let path = pathPref ++ show s ++ ".zlib"
    let tensorDoubleIOT = fromBinaryFile path :: ExceptT String IO (Tensor Double)
    bench (show s ++ "x" ++ show s) $ 
        nfIO $ runExceptT tensorDoubleIOT

writeMatrixJSONBench :: Int -> Benchmark
writeMatrixJSONBench s = 
    let path = pathPref ++ show s ++ ".json" in 
    bench (show s ++ "x" ++ show s) $ 
        nfIO $ toJSONFile (Matrix.fromIndices "ij" s s gen) path

readMatrixJSONBench :: Int -> Benchmark
readMatrixJSONBench s = do
    let path = pathPref ++ show s ++ ".json"
    let tensorDoubleIOT = fromJSONFile path :: MaybeT IO (Tensor Double)
    bench (show s ++ "x" ++ show s) $ 
        nfIO $ runMaybeT tensorDoubleIOT

writeMatrixCSVBench :: Int -> Benchmark
writeMatrixCSVBench s = 
    let path = pathPref ++ show s ++ ".csv" in 
    bench (show s ++ "x" ++ show s) $ 
        nfIO $ toCSVFile (Matrix.fromIndices "ij" s s gen) path

readMatrixCSVBench :: Int -> Benchmark
readMatrixCSVBench s = do
    let path = pathPref ++ show s ++ ".csv"
    let tensorDoubleIOT = fromCSVFile path ',' "ij" :: ExceptT String IO (Tensor Double)
    bench (show s ++ "x" ++ show s) $ 
        nfIO $ runExceptT tensorDoubleIOT

benchSizes :: [Int]
benchSizes = [100, 200, 400, 800, 1600]

-- ENTRY POINT
mainBench :: IO ()
mainBench = defaultMain [
    bgroup "matrix binary write" $ writeMatrixBinaryBench <$> benchSizes,
    bgroup "matrix binary read"  $ readMatrixBinaryBench  <$> benchSizes,
    bgroup "matrix JSON write"   $ writeMatrixJSONBench   <$> benchSizes,
    bgroup "matrix JSON read"    $ readMatrixJSONBench    <$> benchSizes,
    bgroup "matrix CSV write"    $ writeMatrixCSVBench    <$> benchSizes,
    bgroup "matrix CSV read"     $ readMatrixCSVBench     <$> benchSizes
    ]

main :: IO ()
main = do
    mainBench
    let pathsBinary = (\s -> pathPref ++ show s ++ ".zlib") <$> benchSizes
    let pathsJSON   = (\s -> pathPref ++ show s ++ ".json") <$> benchSizes 
    let pathsCSV    = (\s -> pathPref ++ show s ++ ".csv")  <$> benchSizes
    mapM_ removeFile (pathsBinary ++ pathsJSON ++ pathsCSV)