statistics 0.15.0.0 → 0.15.1.0
raw patch · 5 files changed
+48/−18 lines, 5 filesdep +async
Dependencies added: async
Files
- Statistics/Regression.hs +5/−7
- Statistics/Resampling.hs +6/−7
- Statistics/Resampling/Bootstrap.hs +12/−1
- changelog.md +7/−0
- statistics.cabal +18/−3
Statistics/Regression.hs view
@@ -14,10 +14,9 @@ ) where import Control.Applicative ((<$>))-import Control.Concurrent (forkIO)-import Control.Concurrent.Chan (newChan, readChan, writeChan)+import Control.Concurrent.Async (forConcurrently) import Control.DeepSeq (rnf)-import Control.Monad (forM_, replicateM, when)+import Control.Monad (when) import Data.List (nub) import GHC.Conc (getNumCapabilities) import Prelude hiding (pred, sum)@@ -140,16 +139,15 @@ caps <- getNumCapabilities gens <- splitGen caps gen0- done <- newChan- forM_ (zip gens (balance caps numResamples)) $ \(gen,count) -> forkIO $ do+ vs <- forConcurrently (zip gens (balance caps numResamples)) $ \(gen,count) -> do v <- V.replicateM count $ do let n = U.length resp0 ixs <- U.replicateM n $ uniformR (0,n-1) gen let resp = U.backpermute resp0 ixs preds = map (flip U.backpermute ixs) preds0 return $ rgrss preds resp- rnf v `seq` writeChan done v- (coeffsv, r2v) <- (G.unzip . V.concat) <$> replicateM caps (readChan done)+ rnf v `seq` return v+ let (coeffsv, r2v) = G.unzip (V.concat vs) let coeffs = flip G.imap (G.convert coeffss) $ \i x -> est x . U.generate numResamples $ \k -> (coeffsv G.! k) G.! i r2 = est r2s (G.convert r2v)
Statistics/Resampling.hs view
@@ -37,8 +37,8 @@ import Data.Aeson (FromJSON, ToJSON) import Control.Applicative-import Control.Concurrent (forkIO, newChan, readChan, writeChan)-import Control.Monad (forM_, forM, replicateM, replicateM_, liftM2)+import Control.Concurrent.Async (forConcurrently_)+import Control.Monad (forM_, forM, replicateM, liftM2) import Control.Monad.Primitive (PrimMonad(..)) import Data.Binary (Binary(..)) import Data.Data (Data, Typeable)@@ -164,18 +164,17 @@ (replicate r 1 ++ repeat 0) where (q,r) = numResamples `quotRem` numCapabilities results <- mapM (const (MU.new numResamples)) ests- done <- newChan gens <- splitGen numCapabilities gen- forM_ (zip3 ixs (tail ixs) gens) $ \ (start,!end,gen') ->- forkIO $ do- let loop k ers | k >= end = writeChan done ()+ forConcurrently_ (zip3 ixs (tail ixs) gens) $ \ (start,!end,gen') -> do+ -- on GHCJS it doesn't make sense to do any forking.+ -- JavaScript runtime has only single capability.+ let loop k ers | k >= end = return () | otherwise = do re <- resampleVector gen' samples forM_ ers $ \(est,arr) -> MU.write arr k . est $ re loop (k+1) ers loop start (zip ests' results)- replicateM_ numCapabilities $ readChan done mapM_ sort results -- Build resamples res <- mapM unsafeFreeze results
Statistics/Resampling/Bootstrap.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} -- | -- Module : Statistics.Resampling.Bootstrap -- Copyright : (c) 2009, 2011 Bryan O'Sullivan@@ -16,7 +17,6 @@ -- $references ) where -import Control.Monad.Par (parMap, runPar) import Data.Vector.Generic ((!)) import qualified Data.Vector.Unboxed as U import qualified Data.Vector.Generic as G@@ -31,6 +31,9 @@ import qualified Statistics.Resampling as R +#if !defined(__GHCJS__)+import Control.Monad.Par (parMap, runPar)+#endif data T = {-# UNPACK #-} !Double :< {-# UNPACK #-} !Double infixl 2 :<@@ -48,7 +51,15 @@ -- this. -> [Estimate ConfInt Double] bootstrapBCA confidenceLevel sample resampledData+#if defined(__GHCJS__)+ -- monad-par causes seems to cause "thread blocked indefinitely on MVar"+ -- on GHCJS still+ --+ -- I (phadej) would change the interface to return IO, and use mapConcurrently from async+ = map e resampledData+#else = runPar $ parMap e resampledData+#endif where e (est, Bootstrap pt resample) | U.length sample == 1 || isInfinite bias =
changelog.md view
@@ -1,3 +1,10 @@+## Changes in 0.15.1.0++ * GHCJS support++ * Concurrent resampling now uses `async` instead of hand-rolled primitives++ ## Changes in 0.15.0.0 * Modules `Statistics.Matrix.*` are split into new package
statistics.cabal view
@@ -1,5 +1,5 @@ name: statistics-version: 0.15.0.0+version: 0.15.1.0 synopsis: A library of statistical types, data, and functions description: This library provides a number of common functions and types useful@@ -44,8 +44,19 @@ tests/Tests/Math/gen.py tests/utils/Makefile tests/utils/fftw.c-tested-with: GHC==7.4.2, GHC==7.6.3, GHC==7.8.3, GHC==7.10.3, GHC==8.0.2, GHC==8.2.2, GHC==8.4.3 +tested-with:+ GHC ==7.4.2+ || ==7.6.3+ || ==7.8.4+ || ==7.10.3+ || ==8.0.2+ || ==8.2.2+ || ==8.4.4+ || ==8.6.5+ , GHCJS ==8.4++ library exposed-modules: Statistics.Autocorrelation@@ -103,9 +114,9 @@ , mwc-random >= 0.13.0.0 -- , aeson >= 0.6.0.0+ , async >= 2.2.2 && <2.3 , deepseq >= 1.1.0.2 , binary >= 0.5.1.0- , monad-par >= 0.3.4 , primitive >= 0.3 , dense-linear-algebra >= 0.1 && <0.2 , vector >= 0.10@@ -113,6 +124,10 @@ , vector-th-unbox , vector-binary-instances >= 0.2.1 , data-default-class >= 0.1.2+ if !impl(ghcjs)+ build-depends:+ monad-par >= 0.3.4+ -- Older GHC if impl(ghc < 7.6) build-depends: ghc-prim