-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | DIY Markov Chains. -- -- This package presents a simple combinator language for Markov -- transition operators that are useful in MCMC. -- -- Any transition operators sharing the same stationary distribution and -- obeying the Markov and reversibility properties can be combined in a -- couple of ways, such that the resulting operator preserves the -- stationary distribution and desirable properties amenable for MCMC. -- -- We can deterministically concatenate operators end-to-end, or sample -- from a collection of them according to some probability distribution. -- See Geyer, 2005 for details. -- -- A useful strategy is to hedge one's 'sampling risk' by occasionally -- interleaving a computationally-expensive transition (such as a -- gradient-based algorithm like Hamiltonian Monte Carlo or NUTS) with -- cheap Metropolis transitions. -- --
--   transition = frequency [
--       (9, metropolis 1.0)
--     , (1, hamiltonian 0.05 20)
--     ]
--   
-- -- Alternatively: sample consecutively using the same algorithm, but over -- a range of different proposal distributions. -- --
--   transition = concatAllT [
--       slice 0.5
--     , slice 1.0
--     , slice 2.0
--     ]
--   
-- -- Or just mix and match and see what happens! -- --
--   transition =
--     sampleT
--       (sampleT (metropolis 0.5) (slice 0.1))
--       (sampleT (hamiltonian 0.01 20) (metropolis 2.0))
--   
-- -- Check the test suite for example usage. @package declarative @version 0.3.3 -- | Transition operators can easily be tweaked to operate over an -- annealed parameter space, which can be useful when sampling -- from bumpy landscapes with isolated modes. -- -- This library exports a single anneal function that allows one -- to run a declarative-compatible transition operator over a -- space that has been annealed to a specified temperature. -- --
--   import Numeric.MCMC
--   
--   annealingTransition = do
--     anneal 0.70 (metropolis 1)
--     anneal 0.05 (metropolis 1)
--     anneal 0.05 (metropolis 1)
--     anneal 0.70 (metropolis 1)
--     metropolis 1
--   
-- -- These annealed operators can then just be used like any other: -- --
--   himmelblau :: Target [Double]
--   himmelblau = Target lHimmelblau Nothing where
--     lHimmelblau :: [Double] -> Double
--     lHimmelblau [x0, x1] =
--       (-1) * ((x0 * x0 + x1 - 11) ^ 2 + (x0 + x1 * x1 - 7) ^ 2)
--   
--   main :: IO ()
--   main = withSystemRandom . asGenIO $
--     mcmc 10000 [0, 0] annealingTransition himmelblau
--   
module Numeric.MCMC.Anneal -- | An annealing transformer. -- -- When executed, the supplied transition operator will execute over the -- parameter space annealed to the supplied inverse temperature. -- --
--   let annealedTransition = anneal 0.30 (slice 0.5)
--   
anneal :: (Monad m, Functor f) => Double -> Transition m (Chain (f Double) b) -> Transition m (Chain (f Double) b) -- | This module presents a simple combinator language for Markov -- transition operators that are useful in MCMC. -- -- Any transition operators sharing the same stationary distribution and -- obeying the Markov and reversibility properties can be combined in a -- couple of ways, such that the resulting operator preserves the -- stationary distribution and desirable properties amenable for MCMC. -- -- We can deterministically concatenate operators end-to-end, or sample -- from a collection of them according to some probability distribution. -- See Geyer, 2005 for details. -- -- The result is a simple grammar for building composite, -- property-preserving transition operators from existing ones: -- --
--   transition ::= primitive transition
--                | concatT transition transition
--                | sampleT transition transition
--   
-- -- In addition to the above, this module provides a number of combinators -- for building composite transition operators. It re-exports a number of -- production-quality transition operators from the -- mighty-metropolis, speedy-slice, and -- hasty-hamiltonian libraries. -- -- Markov chains can then be run over arbitrary Targets using -- whatever transition operator is desired. -- --
--   import Numeric.MCMC
--   import Data.Sampling.Types
--   
--   target :: [Double] -> Double
--   target [x0, x1] = negate (5  *(x1 - x0 ^ 2) ^ 2 + 0.05 * (1 - x0) ^ 2)
--   
--   rosenbrock :: Target [Double]
--   rosenbrock = Target target Nothing
--   
--   transition :: Transition IO (Chain [Double] b)
--   transition =
--     concatT
--       (sampleT (metropolis 0.5) (metropolis 1.0))
--       (sampleT (slice 2.0) (slice 3.0))
--   
--   main :: IO ()
--   main = withSystemRandom . asGenIO $ mcmc 10000 [0, 0] transition rosenbrock
--   
-- -- See the attached test suite for other examples. module Numeric.MCMC -- | Deterministically concat transition operators together. concatT :: Monad m => Transition m a -> Transition m a -> Transition m a -- | Deterministically concat a list of transition operators together. concatAllT :: Monad m => [Transition m a] -> Transition m a -- | Probabilistically concat transition operators together. sampleT :: PrimMonad m => Transition m a -> Transition m a -> Transition m a -- | Probabilistically concat transition operators together via a uniform -- distribution. sampleAllT :: PrimMonad m => [Transition m a] -> Transition m a -- | Probabilistically concat transition operators together using a -- Bernoulli distribution with the supplied success probability. -- -- This is just a generalization of sampleT. bernoulliT :: PrimMonad m => Double -> Transition m a -> Transition m a -> Transition m a -- | Probabilistically concat transition operators together using the -- supplied frequency distribution. -- -- This function is more-or-less an exact copy of frequency, -- except here applied to transition operators. frequency :: PrimMonad m => [(Int, Transition m a)] -> Transition m a -- | An annealing transformer. -- -- When executed, the supplied transition operator will execute over the -- parameter space annealed to the supplied inverse temperature. -- --
--   let annealedTransition = anneal 0.30 (slice 0.5)
--   
anneal :: (Monad m, Functor f) => Double -> Transition m (Chain (f Double) b) -> Transition m (Chain (f Double) b) -- | Trace n iterations of a Markov chain and stream them to -- stdout. -- --
--   >>> withSystemRandom . asGenIO $ mcmc 3 [0, 0] (metropolis 0.5) rosenbrock
--   -0.48939312153007863,0.13290702689491818
--   1.4541485365128892e-2,-0.4859905564050404
--   0.22487398491619448,-0.29769783186855125
--   
mcmc :: Show (t a) => Int -> t a -> Transition IO (Chain (t a) b) -> Target (t a) -> Gen RealWorld -> IO () -- | A generic Metropolis transition operator. metropolis :: (Traversable f, PrimMonad m) => Double -> Transition m (Chain (f Double) b) -- | A Hamiltonian transition operator. hamiltonian :: (Num (IxValue (t Double)), Traversable t, FunctorWithIndex (Index (t Double)) t, Ixed (t Double), PrimMonad m, (~) * (IxValue (t Double)) Double) => Double -> Int -> Transition m (Chain (t Double) b) -- | A slice sampling transition operator. slice :: (PrimMonad m, FoldableWithIndex (Index (t a)) t, Ixed (t a), Num (IxValue (t a)), Variate (IxValue (t a))) => IxValue (t a) -> Transition m (Chain (t a) b) -- | Create a generator for variates using a fixed seed. create :: PrimMonad m => m (Gen (PrimState m)) -- | Seed a PRNG with data from the system's fast source of pseudo-random -- numbers. All the caveats of withSystemRandom apply here as -- well. createSystemRandom :: IO GenIO -- | Seed a PRNG with data from the system's fast source of pseudo-random -- numbers ("/dev/urandom" on Unix-like systems or -- RtlGenRandom on Windows), then run the given action. -- -- This is a somewhat expensive function, and is intended to be called -- only occasionally (e.g. once per thread). You should use the -- Gen it creates to generate many random numbers. withSystemRandom :: PrimBase m => (Gen (PrimState m) -> m a) -> IO a -- | Constrain the type of an action to run in the IO monad. asGenIO :: (GenIO -> IO a) -> GenIO -> IO a -- | Class of monads which can perform primitive state-transformer actions class Monad m => PrimMonad (m :: * -> *) where type PrimState (m :: * -> *) :: * where { type family PrimState (m :: * -> *) :: *; } -- | State token type -- | RealWorld is deeply magical. It is primitive, but it -- is not unlifted (hence ptrArg). We never manipulate -- values of type RealWorld; it's only used in the type system, -- to parameterise State#. data RealWorld :: *