{-# LANGUAGE RankNTypes #-}
module Mcmc.Move.Generic
( moveGenericContinuous,
moveSymmetricGenericContinuous,
moveGenericDiscrete,
moveSymmetricGenericDiscrete,
)
where
import Lens.Micro
import Mcmc.Move
import Numeric.Log
import Statistics.Distribution
import System.Random.MWC
jumpCont ::
(ContDistr d, ContGen d) =>
Lens' a Double ->
d ->
(Double -> Double -> Double) ->
a ->
GenIO ->
IO a
jumpCont l d f x g = do
dx <- genContVar d g
return $ set l ((x ^. l) `f` dx) x
{-# INLINEABLE jumpCont #-}
densCont ::
(ContDistr d, ContGen d) =>
Lens' a Double ->
d ->
(Double -> Double -> Double) ->
a ->
a ->
Log Double
densCont l d fInv x y = Exp $ logDensity d ((y ^. l) `fInv` (x ^. l))
{-# INLINEABLE densCont #-}
moveGenericContinuous ::
(ContDistr d, ContGen d) =>
Lens' a Double ->
d ->
(Double -> Double -> Double) ->
(Double -> Double -> Double) ->
MoveSimple a
moveGenericContinuous l d f fInv =
MoveSimple (jumpCont l d f) (Just $ densCont l d fInv)
moveSymmetricGenericContinuous ::
(ContDistr d, ContGen d) =>
Lens' a Double ->
d ->
(Double -> Double -> Double) ->
MoveSimple a
moveSymmetricGenericContinuous l d f =
MoveSimple (jumpCont l d f) Nothing
jumpDiscrete ::
(DiscreteDistr d, DiscreteGen d) =>
Lens' a Int ->
d ->
(Int -> Int -> Int) ->
a ->
GenIO ->
IO a
jumpDiscrete l d f x g = do
dx <- genDiscreteVar d g
return $ set l ((x ^. l) `f` dx) x
{-# INLINEABLE jumpDiscrete #-}
densDiscrete ::
(DiscreteDistr d, DiscreteGen d) =>
Lens' a Int ->
d ->
(Int -> Int -> Int) ->
a ->
a ->
Log Double
densDiscrete l d fInv x y =
Exp $ logProbability d ((y ^. l) `fInv` (x ^. l))
{-# INLINEABLE densDiscrete #-}
moveGenericDiscrete ::
(DiscreteDistr d, DiscreteGen d) =>
Lens' a Int ->
d ->
(Int -> Int -> Int) ->
(Int -> Int -> Int) ->
MoveSimple a
moveGenericDiscrete l fd f fInv =
MoveSimple (jumpDiscrete l fd f) (Just $ densDiscrete l fd fInv)
moveSymmetricGenericDiscrete ::
(DiscreteDistr d, DiscreteGen d) =>
Lens' a Int ->
d ->
(Int -> Int -> Int) ->
MoveSimple a
moveSymmetricGenericDiscrete l fd f =
MoveSimple (jumpDiscrete l fd f) Nothing