packages feed

foldl-statistics-0.1.0.0: bench/Main.hs

module Main where

import Control.Monad.ST (runST)
import Criterion.Main
import qualified Statistics.Sample as S
import Statistics.Transform
import System.Random.MWC
import qualified Data.Vector.Unboxed as U
import Control.Foldl as F

import Control.Foldl.Statistics


-- Test sample
sample :: U.Vector Double
sample = runST $ flip uniformVector 10000 =<< create

absSample = U.map abs sample

-- Weighted test sample
sampleW :: U.Vector (Double,Double)
sampleW = U.zip sample (U.reverse sample)

m = F.fold mean (U.toList sample)

mw = F.fold meanWeighted (U.toList sampleW)




main :: IO ()
main = defaultMain
        [ bgroup "Statistics of location"
            [ bgroup "mean"
                [ bench "C.F.Statistics"      $ nf (\vec -> F.fold mean (U.toList vec)) sample
                , bench "Statistics.Sample"   $ nf S.mean sample
                ]
            , bgroup "meanWeighted"
                [ bench "C.F.Statistics"      $ nf (\vec -> F.fold meanWeighted (U.toList vec)) sampleW
                , bench "Statistics.Sample"   $ nf S.meanWeighted sampleW
                ]
            , bgroup "welfordMean"
                [ bench "C.F.Statistics"      $ nf (\vec -> F.fold welfordMean (U.toList vec)) sample
                , bench "Statistics.Sample"   $ nf S.welfordMean sample
                ]
            , bgroup "harmonicMean"
                [ bench "C.F.Statistics"      $ nf (\vec -> F.fold harmonicMean (U.toList vec)) sample
                , bench "Statistics.Sample"   $ nf S.harmonicMean sample
                ]
            , bgroup "geometricMean"
                [ bench "C.F.Statistics"      $ nf (\vec -> F.fold geometricMean (U.toList vec)) absSample
                , bench "Statistics.Sample"   $ nf S.geometricMean absSample
                ]
            ]
        , bgroup "Single-pass functions"
            [ bgroup "fastVariance"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold fastVariance (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.fastVariance sample
                ]
            , bgroup "fastVarianceUnbiased"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold fastVarianceUnbiased (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.fastVarianceUnbiased sample
                ]
            , bgroup "fastStdDev"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold fastStdDev (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.fastStdDev sample
                ]
            ]

        , bgroup "Functions requiring the mean"
            [ bgroup "variance"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (variance m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (variance (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.variance sample
                ]
            , bgroup "varianceUnbiased"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (varianceUnbiased m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (varianceUnbiased (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.varianceUnbiased sample
                ]
            , bgroup "stdDev"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (stdDev m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (stdDev (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.stdDev sample
                ]
            , bgroup "varianceWeighted"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (varianceWeighted m) (U.toList vec)) sampleW
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (varianceWeighted (F.fold meanWeighted (U.toList vec))) (U.toList vec)) sampleW
                , bench "Statistics.Sample" $ nf S.varianceWeighted sampleW
                ]
            ]

        , bgroup "Functions over central moments"
            [ bgroup "skewness"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (skewness m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (skewness (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.skewness sample
                ]
            , bgroup "kurtosis"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (kurtosis m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (kurtosis (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf S.kurtosis sample
                ]
            , bgroup "centralMoment 2"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (centralMoment 2 m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (centralMoment 2 (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf (S.centralMoment 2) sample
                ]
            , bgroup "centralMoment 3"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (centralMoment 3 m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (centralMoment 3 (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf (S.centralMoment 3) sample
                ]
            , bgroup "centralMoment 4"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (centralMoment 4 m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (centralMoment 4 (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf (S.centralMoment 4) sample
                ]
            , bgroup "centralMoment 7"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (centralMoment 7 m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (centralMoment 7 (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf (S.centralMoment 7) sample
                ]
            , bgroup "centralMoments 4 9"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (centralMoments 4 9 m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (centralMoments 4 9 (F.fold mean (U.toList vec))) (U.toList vec)) sample
                , bench "Statistics.Sample" $ nf (S.centralMoments 4 9) sample
                ]
            , bgroup "centralMoments' 4 9"
                [ bench "C.F.Statistics"    $ nf (\vec -> F.fold (centralMoments' 4 9 m) (U.toList vec)) sample
                , bench "C.F.S(comp mean)"  $ nf (\vec -> F.fold (centralMoments' 4 9 (F.fold mean (U.toList vec))) (U.toList vec)) sample
                ]
            ]
        ]