packages feed

javelin-0.1.1.0: benchmarks/Operations.hs

import           Control.DeepSeq    ( rnf )
import           Control.Exception  ( evaluate )
import           Criterion.Main     ( bench, whnf, defaultMain )

import           Data.Foldable      ( Foldable(foldl') )
import           Data.Set           ( Set )     
import qualified Data.Set           as Set
import           Data.Series        ( Series )
import qualified Data.Series        as Series
import qualified Data.Series.Index  as Index


main :: IO ()
main = do
    let srs1        = Series.fromList $ zip [0..] [1::Int .. 2^(12::Int)]
        srs2        = Series.fromList $ zip [0,2..] [1::Int .. 2^(12::Int)]
        elems      = Index.toSet $ Series.index srs1
        small      = Set.fromAscList  [1::Int ..  2^(8::Int)]
        elems_even = Set.fromDistinctAscList  [2::Int, 4..2^(12::Int)]
        elems_odd  = Set.fromDistinctAscList  [1::Int, 3..2^(12::Int)]
    evaluate $ rnf [elems, small, elems_even, elems_odd]
    evaluate $ rnf [srs1, srs2]
    defaultMain
        [ bench "at" $ whnf (at elems_even) srs1
        , bench "iat" $ whnf (iat elems_even) srs1
        , bench "select" $ whnf (select elems_odd) srs1
        , bench "mappend" $ whnf (mappend' srs1) srs2
        , bench "zipWithMatched" $ whnf (zipWithMatched srs1) srs1
        , bench "group by ... aggregate with ..." $ whnf (groupbyagg small) srs1
        , bench "group by ... fold with ..." $ whnf (groupbyfold small) srs1
        ]

at :: Set Int -> Series Int Int -> Int
at xs s = foldl' go 0 xs
    where
        go n x = case s `Series.at` x of 
            Just _ -> n + 1
            Nothing -> n

iat :: Set Int -> Series Int Int -> Int
iat xs s = foldl' go 0 xs
    where
        go n x = case s `Series.iat` x of 
            Just _ -> n + 1
            Nothing -> n
  
select :: Set Int -> Series Int Int -> Int
select ks s = foldl' go 0 ks
    where
        go n k = n + length (s `Series.select` ((k-100) `Series.to` (k+100)))


mappend' :: Series Int Int -> Series Int Int -> Int
mappend' xs ys = sum $ xs <> ys


zipWithMatched :: Series Int Int -> Series Int Int -> Int
zipWithMatched xs ys = length $ Series.zipWithMatched (+) xs ys


groupbyagg :: Set Int -> Series Int Int -> Int
groupbyagg ks s = foldl' go 0 ks
    where
        go n k = n + product (s `Series.groupBy` (`mod` (k + 1)) `Series.aggregateWith` sum)

groupbyfold :: Set Int -> Series Int Int -> Int
groupbyfold ks s = foldl' go 0 ks
    where
        go n k = n + product (s `Series.groupBy` (`mod` (k + 1)) `Series.foldWith` (+))