Turing.jl
Turing.jl copied to clipboard
Slice sampling as a `Gibbs` sampler
Hi all,
I looked into using the samplers in SliceSampling
as a component to Experimental.Gibbs
. After a few patches to SliceSampling
, it seems to be feasible. Here is a snippet that works with SliceSampling#main
:
using Distributions
using Turing
using Turing.Experimental
using SliceSampling
@model function demo()
s ~ InverseGamma(3, 3)
m ~ MvNormal(zeros(10), sqrt(s))
end
Turing.Inference.getparams(::Turing.DynamicPPL.Model, state::SliceSampling.UnivariateSliceState) = state.transition.params
Turing.Inference.getparams(::Turing.DynamicPPL.Model, state::SliceSampling.GibbsState) = state.transition.params
Turing.Experimental.gibbs_requires_recompute_logprob(
model_dst,
::DynamicPPL.Sampler{<:Turing.Inference.ExternalSampler},
sampler_src,
state_dst,
state_src
) = false
n_samples = 10000
model = demo()
sample(
model,
Experimental.Gibbs(
(
m = externalsampler(RandPermGibbs(SliceSteppingOut(0.1))),
s = externalsampler(SliceSteppingOut(0.1)),
),
),
n_samples
)