import Criterion.Main
import Statistics.Distribution.Normal
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Generic as G
import HLearn.Algebra
import HLearn.Models.Distributions
-- import qualified HLearn.Models.Distributions.GaussianOld as GO
-- import qualified HLearn.Models.Distributions.GaussianOld2 as GO2
import qualified Control.ConstraintKinds as CK
size = 10^8
main = defaultMain
[ bench "HLearn-Gaussian" $ nf ((train :: VU.Vector Double -> Gaussian Double)) (VU.enumFromN (0::Double) size)
, bench "HLearn-Gaussian-Parallel" $ whnf (parallel $ (train :: VU.Vector Double -> Gaussian Double)) (VU.enumFromN (0::Double) size)
-- , bench "HLearn-Gaussian-List" $ nf (train :: [Double] -> Gaussian Double) [0..fromIntegral size]
, bench "statistics-Gaussian" $ whnf (normalFromSample . VU.enumFromN 0) (size)
]
{-bench "batch train [] 1e6" $ nf ((batch train) GaussianParams) [0..1e6::Double]
-- , bench "batch train V 1e6" $ nf ((batch train) GaussianParams) (V.enumFromN (0::Double) (10^6))
-- , bench "batch train VU 1e6" $ nf ((batch train) GaussianParams) (VU.enumFromN (0::Double) [0..1e6::Double])
-- , bench "parallel2 batch train [] 1e6" $ nf ((parallel $ batch train) GaussianParams) (V.enumFromN (0::Double) (10^7))
,-}
-- bench "Parallel GaussianOld2" $ nf (parallel $ batch (train GO2.GaussianParams)) (VU.enumFromN (0::Double) (10^8))
-- , bench "GaussianOld2" $ nf (batch (train GO2.GaussianParams)) (VU.enumFromN (0::Double) (10^8))
-- bench "Parallel GaussianOld" $ nf (parallel $ batch (train GO.GaussianParams)) (VU.enumFromN (0::Double) (10^8))
-- , bench "GaussianOld" $ nf (batch (train GO.GaussianParams)) (VU.enumFromN (0::Double) (10^8))
-- bench "Parallel Gaussian2" $ nf (parallel $ batch (train GaussianParams)) (VU.enumFromN (0::Double) (10^8))
-- , bench "Gaussian2" $ nf (batch (train GaussianParams)) (VU.enumFromN (0::Double) (10^8))
{-bench "Parallel Gaussian" $ nf (parallel $ batch (trainSG)) (VU.enumFromN (0::Double) (10^8))
, bench "Gaussian" $ nf (batch (trainSG)) (VU.enumFromN (0::Double) (10^8))
,-} -- bench "Categorical" $ nf (train :: [String] -> Categorical String Double) (concat $ replicate (10^4) ["a","b"])
-- , bench "normalFromSample - 1e5" $ whnf (normalFromSample . VU.enumFromN 1) (10^8)
-- instance NFData NormalDistribution where
-- rnf (NormalDistribution a b c d) = deepseq a $ deepseq b $ deepseq c $ rnf d
-- parallel3 strat train = \modelparams datapoint ->
-- foldl1 (<>) $ map (CK.foldl1 (<>) . CK.fmap (train modelparams . CK.pure)) (CK.partition 2 datapoint)
-- test (ds1,ds2) = m1 <> m2
-- where
-- [m1,m2] = parMap rdeepseq ((batch train) GaussianParams) [ds1,ds2]
-- -- [m1,m2] = parMap rdeepseq ((batch train) GaussianParams) [ds1,ds2]
--
-- -- test (ds1,ds2) = runEval $ do
-- -- let [m1,m2] = {-parMap rdeepseq-} map (batch train GaussianParams) [ds1,ds2]
-- -- -- m1 <- rparWith rseq $ batch train GaussianParams ds1
-- -- -- m2 <- rparWith rseq $ batch train GaussianParams ds2
-- -- {- let m1 = batch train GaussianParams ds1
-- -- let m2 = batch train GaussianParams ds2-}
-- -- return $ m1 <> m2
--
-- dsL = replicate 4 ds
-- -- dsL = [ds1,ds2]
-- ds = [0..1000000::Double]
-- ds1 = V.enumFromN (0::Double) (10^7)
-- ds2 = V.enumFromN (0.5::Double) (10^7)