{-# LANGUAGE RankNTypes #-}
module Mcmc.Move.Slide
( slide,
slideSymmetric,
slideUniform,
)
where
import Lens.Micro
import Mcmc.Move
import Mcmc.Move.Generic
import Statistics.Distribution.Normal
import Statistics.Distribution.Uniform
slideSimple :: Lens' a Double -> Double -> Double -> Double -> MoveSimple a
slideSimple l m s t = moveGenericContinuous l (normalDistr m (s * t)) (+) (-)
slide ::
String ->
Int ->
Lens' a Double ->
Double ->
Double ->
Bool ->
Move a
slide n w l m s True =
Move n w (slideSimple l m s 1.0) (Just $ tuner (slideSimple l m s))
slide n w l m s False = Move n w (slideSimple l m s 1.0) Nothing
slideSymmetricSimple :: Lens' a Double -> Double -> Double -> MoveSimple a
slideSymmetricSimple l s t = moveSymmetricGenericContinuous l (normalDistr 0.0 (s * t)) (+)
slideSymmetric ::
String ->
Int ->
Lens' a Double ->
Double ->
Bool ->
Move a
slideSymmetric n w l s True =
Move n w (slideSymmetricSimple l s 1.0) (Just $ tuner (slideSymmetricSimple l s))
slideSymmetric n w l s False = Move n w (slideSymmetricSimple l s 1.0) Nothing
slideUniformSimple :: Lens' a Double -> Double -> Double -> MoveSimple a
slideUniformSimple l d t =
moveSymmetricGenericContinuous l (uniformDistr (- t * d) (t * d)) (+)
slideUniform ::
String ->
Int ->
Lens' a Double ->
Double ->
Bool ->
Move a
slideUniform n w l d True =
Move n w (slideUniformSimple l d 1.0) (Just $ tuner (slideUniformSimple l d))
slideUniform n w l d False = Move n w (slideUniformSimple l d 1.0) Nothing