{-# LANGUAGE RankNTypes #-}
module Mcmc.Move.Scale
( scale,
scaleUnbiased,
)
where
import Lens.Micro
import Mcmc.Move
import Mcmc.Move.Generic
import Statistics.Distribution.Gamma
scaleSimple :: Lens' a Double -> Double -> Double -> Double -> MoveSimple a
scaleSimple l k th t = moveGenericContinuous l (gammaDistr k (t * th)) (*) (/)
scale ::
String ->
Int ->
Lens' a Double ->
Double ->
Double ->
Bool ->
Move a
scale n w l k th True =
Move n w (scaleSimple l k th 1.0) (Just $ tuner $ scaleSimple l k th)
scale n w l k th False = Move n w (scaleSimple l k th 1.0) Nothing
scaleUnbiased ::
String ->
Int ->
Lens' a Double ->
Double ->
Bool ->
Move a
scaleUnbiased n w l k True =
Move
n
w
(scaleSimple l k (1 / k) 1.0)
(Just $ tuner $ scaleSimple l k (1 / k))
scaleUnbiased n w l k False = Move n w (scaleSimple l k (1 / k) 1.0) Nothing