mwc-probability-transition 0.3.0.1 → 0.3.0.2
raw patch · 3 files changed
+48/−11 lines, 3 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ System.Random.MWC.Probability.Transition: evalTransition :: Monad m => Handler m message -> Transition message s m a -> Int -> s -> Gen (PrimState m) -> m [a]
+ System.Random.MWC.Probability.Transition: execTransition :: Monad m => Handler m message -> Transition message s m a -> Int -> s -> Gen (PrimState m) -> m s
Files
- mwc-probability-transition.cabal +2/−1
- src/System/Random/MWC/Probability/Transition.hs +44/−10
- test/LibSpec.hs +2/−0
mwc-probability-transition.cabal view
@@ -1,5 +1,5 @@ name: mwc-probability-transition-version: 0.3.0.1+version: 0.3.0.2 synopsis: A Markov stochastic transition operator with logging description: .@@ -38,6 +38,7 @@ hs-source-dirs: test main-is: LibSpec.hs build-depends: base+ , logging-effect , mwc-probability , mwc-probability-transition , hspec
src/System/Random/MWC/Probability/Transition.hs view
@@ -6,8 +6,12 @@ Transition , mkTransition , runTransition+ -- ** Specialized combinators+ , evalTransition+ , execTransition+ -- ** Conditional execution , stepConditional- -- ** Helper functions+ -- * Helper functions , withSeverity -- -- * Re-exported from `logging-effect` -- , Handler@@ -22,8 +26,9 @@ import Control.Monad.Trans.Class (MonadTrans(..), lift) import Control.Monad.Trans.State.Strict (StateT(..), evalStateT, execStateT, runStateT)-import Control.Monad.Log (MonadLog(..), Handler, WithSeverity(..), Severity(..), LoggingT(..), runLoggingT, withFDHandler, defaultBatchingOptions, logMessage)+-- import Control.Monad.Log (MonadLog(..), Handler, WithSeverity(..), Severity(..), LoggingT(..), runLoggingT, withFDHandler, defaultBatchingOptions, logMessage) +import qualified Control.Monad.Log as L import Data.Char import System.Random.MWC.Probability@@ -32,7 +37,7 @@ -- | A Markov transition kernel. newtype Transition message s m a = Transition (- Gen (PrimState m) -> StateT s (LoggingT message m) a+ Gen (PrimState m) -> StateT s (L.LoggingT message m) a ) deriving (Functor) instance Show (Transition msg s m a) where@@ -56,22 +61,51 @@ s <- S.get w <- lift . lift $ sample (fm s) gen let (a, s') = fs s w- lift $ logMessage $ flog a s' + lift $ L.logMessage $ flog a s' S.put s' return a -- | Run a 'Transition' for a number of steps, while logging each iteration.+--+-- Returns both the list of outputs and the final state. runTransition :: Monad m =>- Handler m message -- ^ Logging handler+ L.Handler m message -- ^ Logging handler -> Transition message s m a -> Int -- ^ Number of iterations -> s -- ^ Initial state -> Gen (PrimState m) -- ^ PRNG -> m ([a], s) -- ^ (Outputs, Final state) runTransition logf (Transition fm) n s0 g =- runLoggingT (runStateT (replicateM n (fm g)) s0) logf+ L.runLoggingT (runStateT (replicateM n (fm g)) s0) logf +-- | Run a 'Transition' for a number of steps, while logging each iteration.+--+-- Returns the list of outputs.+evalTransition :: Monad m =>+ L.Handler m message+ -> Transition message s m a+ -> Int+ -> s+ -> Gen (PrimState m)+ -> m [a] -- ^ Outputs+evalTransition logf (Transition fm) n s0 g =+ L.runLoggingT (evalStateT (replicateM n (fm g)) s0) logf++-- | Run a 'Transition' for a number of steps, while logging each iteration.+--+-- Returns the final state.+execTransition :: Monad m =>+ L.Handler m message+ -> Transition message s m a+ -> Int+ -> s+ -> Gen (PrimState m)+ -> m s -- ^ Final state+execTransition logf (Transition fm) n s0 g =+ L.runLoggingT (execStateT (replicateM n (fm g)) s0) logf++ -- | Perform one 'Transition' and check output and updated state against the current state, producing an Either with the result of the comparison. -- -- Can be useful for detecting early divergence or lack of convergence etc.@@ -79,13 +113,13 @@ (a -> s -> s -> Bool) -- ^ Inputs: Model output, Current state, New state -> (a -> s -> s -> l) -- ^ " -> (a -> s -> s -> r) -- ^ "- -> Handler m message + -> L.Handler m message -> Transition message s m a -> s -- ^ Current state -> Gen (PrimState m) -> m (Either l r) stepConditional q fleft fright logf (Transition fm) s g = do - (a, s') <- runLoggingT (runStateT (fm g) s) logf+ (a, s') <- L.runLoggingT (runStateT (fm g) s) logf if q a s s' then pure (Left $ fleft a s s') else pure (Right $ fright a s s') @@ -97,7 +131,7 @@ bracketsUpp p = unwords ["[", map toUpper (show p), "]"] -- | Render a logging message along with an annotation of its severity.-withSeverity :: (t -> String) -> WithSeverity t -> String-withSeverity k (WithSeverity u a ) = unwords [bracketsUpp u, k a]+withSeverity :: (t -> String) -> L.WithSeverity t -> String+withSeverity k (L.WithSeverity u a ) = unwords [bracketsUpp u, k a]
test/LibSpec.hs view
@@ -3,6 +3,8 @@ import Test.Hspec import Test.Hspec.QuickCheck +import Control.Monad.Log+ import System.Random.MWC.Probability import System.Random.MWC.Probability.Transition