Skip to content

Slice sampling as a Gibbs sampler #2300

Open
@Red-Portal

Description

@Red-Portal

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
)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions