-- | A general purpose library for simulating differential processes, of a deterministic or
-- stochastic nature.
module Goal.Simulation.Chain (
-- * Chains
Chain
, streamChain
-- ** Markov Chains
, MarkovTensor
, markovTensor
, markovChain
-- ** Harris Chains
, harrisChain
) where
--- Imports ---
-- Goal --
import Goal.Simulation.Mealy
import Goal.Geometry
import Goal.Probability
--- Stochastic Processes ---
-- | A 'Chain' is a discrete time 'Flow'.
type Chain s = Mealy () s
streamChain :: Chain k -> [k]
-- | A convenience function for streaming 'MarkovChain's.
streamChain mchn = stream mchn $ repeat ()
-- Finite --
type MarkovTensor s = Tensor (CurvedCategorical s) (CurvedCategorical s)
markovTensor :: s -> MarkovTensor s
markovTensor s = Tensor (CurvedCategorical s) (CurvedCategorical s)
markovChain :: Discrete s
=> (Function Standard Standard :#: MarkovTensor s) -- ^ The stochastic matrix
-> Element s -- ^ The initial state
-> RandST r (Chain (Element s)) -- ^ An embedded markov chain
-- | Constructs a markov chain process.
markovChain smtx =
accumulateRandomFunction (markovChainAccumulator smtx)
markovChainAccumulator smtx _ k = do
let ks = elements . sampleSpace . domain $ manifold smtx
sk = fromList (domain $ manifold smtx) [ if k' == k then 1 else 0 | k' <- ks ]
k' <- generate $ smtx >.> sk
return (k',k')
-- Continuous --
harrisChain :: (Manifold m, Transition c Standard m, Generative Standard m)
=> (Sample m -> c :#: m)
-> Sample m
-> RandST s' (Chain (Sample m))
harrisChain mdl =
accumulateRandomFunction (harrisChainAccumulator mdl)
harrisChainAccumulator mdl () s = do
let cp' = mdl s
s' <- standardGenerate cp'
return (s',s')