diff --git a/Project.toml b/Project.toml index 2ed9d63..1871588 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "SliceSampling" uuid = "43f4d3e8-9711-4a8c-bd1b-03ac73a255cf" -version = "0.7" +version = "0.7.1" [deps] AbstractMCMC = "80f14c24-f653-4e6a-9b94-39d6b0f70001" @@ -29,7 +29,7 @@ LogDensityProblems = "2" LogDensityProblemsAD = "1" Random = "1" Requires = "1" -Turing = "0.33, 0.34, 0.35" +Turing = "0.36" julia = "1.10" [extras] diff --git a/README.md b/README.md index 4be3620..4162144 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ model = demo() sample(model, externalsampler(sampler), n_samples) ``` -The following slice samplers can also be used as a conditional sampler in `Turing.Experimental.Gibbs` sampler: +The following slice samplers can also be used as a conditional sampler in `Turing.Gibbs` sampler: * For multidimensional variables: * `RandPermGibbs` * `HitAndRun` @@ -69,11 +69,9 @@ using SliceSampling end end -sampler = Turing.Experimental.Gibbs( - ( - p = externalsampler(SliceSteppingOut(2.0)), - z = PG(20, :z) - ) +sampler = Turing.Gibbs( + :p => externalsampler(SliceSteppingOut(2.0)), + :z => PG(20, :z), ) n_samples = 1000 diff --git a/docs/Project.toml b/docs/Project.toml index e22c2f9..2f16010 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -25,8 +25,8 @@ PDMats = "0.11" Plots = "1" PrettyTables = "2" Random = "1" -SliceSampling = "0.6, 0.7" +SliceSampling = "0.7.1" StableRNGs = "1" Statistics = "1" -Turing = "0.34, 0.35" +Turing = "0.36" julia = "1.10" diff --git a/docs/src/general.md b/docs/src/general.md index f48a7e7..def9a95 100644 --- a/docs/src/general.md +++ b/docs/src/general.md @@ -60,8 +60,8 @@ model = demo() sample(model, externalsampler(sampler), n_samples) ``` -### Conditional sampling in a `Turing.Experimental.Gibbs` sampler -`SliceSampling.jl` be used as a conditional sampler in `Turing.Experimental.Gibbs`. +### Conditional sampling in a `Turing.Gibbs` sampler +`SliceSampling.jl` be used as a conditional sampler in `Turing.Gibbs`. ```@example turinggibbs using Distributions @@ -80,11 +80,9 @@ using SliceSampling end end -sampler = Turing.Experimental.Gibbs( - ( - p = externalsampler(SliceSteppingOut(2.0)), - z = PG(20, :z) - ) +sampler = Turing.Gibbs( + :p => externalsampler(SliceSteppingOut(2.0)), + :z => PG(20, :z), ) n_samples = 1000 diff --git a/ext/SliceSamplingTuringExt.jl b/ext/SliceSamplingTuringExt.jl index fd3e6ab..c7aa33a 100644 --- a/ext/SliceSamplingTuringExt.jl +++ b/ext/SliceSamplingTuringExt.jl @@ -6,13 +6,11 @@ if isdefined(Base, :get_extension) using Random using SliceSampling using Turing - # using Turing: Turing, Experimental else using ..LogDensityProblemsAD using ..Random using ..SliceSampling using ..Turing - #using ..Turing: Turing, Experimental end # Required for using the slice samplers as `externalsampler`s in Turing @@ -24,12 +22,18 @@ function Turing.Inference.getparams( end # end -# Required for using the slice samplers as `Experimental.Gibbs` samplers in Turing +# Required for using the slice samplers as `Gibbs` samplers in Turing # begin +Turing.Inference.isgibbscomponent(::SliceSampling.RandPermGibbs) = true +Turing.Inference.isgibbscomponent(::SliceSampling.HitAndRun) = true +Turing.Inference.isgibbscomponent(::SliceSampling.Slice) = true +Turing.Inference.isgibbscomponent(::SliceSampling.SliceSteppingOut) = true +Turing.Inference.isgibbscomponent(::SliceSampling.SliceDoublingOut) = true + function Turing.Inference.getparams( - ::Turing.DynamicPPL.Model, state::SliceSampling.UnivariateSliceState + ::Turing.DynamicPPL.Model, sample::SliceSampling.UnivariateSliceState ) - return state.transition.params + return sample.transition.params end function Turing.Inference.getparams( @@ -43,18 +47,6 @@ function Turing.Inference.getparams( ) return state.transition.params end - -function Turing.Experimental.gibbs_requires_recompute_logprob( - model_dst, - ::Turing.DynamicPPL.Sampler{ - <:Turing.Inference.ExternalSampler{<:SliceSampling.AbstractSliceSampling,A,U} - }, - sampler_src, - state_dst, - state_src, -) where {A,U} - return false -end # end function SliceSampling.initial_sample(rng::Random.AbstractRNG, ℓ::Turing.LogDensityFunction) diff --git a/src/multivariate/hitandrun.jl b/src/multivariate/hitandrun.jl index f05ce72..8fb945c 100644 --- a/src/multivariate/hitandrun.jl +++ b/src/multivariate/hitandrun.jl @@ -17,6 +17,13 @@ struct HitAndRunState{T<:Transition} transition::T end +function AbstractMCMC.setparams!!( + model::AbstractMCMC.LogDensityModel, state::HitAndRunState, params +) + lp = LogDensityProblems.logdensity(model.logdensity, params) + return HitAndRunState(Transition(params, lp, NamedTuple())) +end + struct HitAndRunTarget{Model,Vec<:AbstractVector} model :: Model direction :: Vec diff --git a/src/multivariate/randpermgibbs.jl b/src/multivariate/randpermgibbs.jl index 366c320..c8ba434 100644 --- a/src/multivariate/randpermgibbs.jl +++ b/src/multivariate/randpermgibbs.jl @@ -25,6 +25,13 @@ struct GibbsState{T<:Transition} transition::T end +function AbstractMCMC.setparams!!( + model::AbstractMCMC.LogDensityModel, state::GibbsState, params +) + lp = LogDensityProblems.logdensity(model.logdensity, params) + return GibbsState(Transition(params, lp, NamedTuple())) +end + struct GibbsTarget{Model,Idx<:Integer,Vec<:AbstractVector} model :: Model idx :: Idx diff --git a/src/univariate/univariate.jl b/src/univariate/univariate.jl index 0498b17..13f136b 100644 --- a/src/univariate/univariate.jl +++ b/src/univariate/univariate.jl @@ -29,6 +29,13 @@ struct UnivariateSliceState{T<:Transition} transition::T end +function AbstractMCMC.setparams!!( + model::AbstractMCMC.LogDensityModel, state::UnivariateSliceState, params +) + lp = LogDensityProblems.logdensity(model.logdensity, params) + return UnivariateSliceState(Transition(params, lp, NamedTuple())) +end + function AbstractMCMC.step( rng::Random.AbstractRNG, model::AbstractMCMC.LogDensityModel, diff --git a/test/Project.toml b/test/Project.toml index cb3d933..25379d4 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -18,5 +18,5 @@ MCMCTesting = "0.3" Random = "1" StableRNGs = "1" Test = "1" -Turing = "0.33, 0.34, 0.35" +Turing = "0.36" julia = "1.10" diff --git a/test/turing.jl b/test/turing.jl index 725828a..032fa76 100644 --- a/test/turing.jl +++ b/test/turing.jl @@ -41,9 +41,7 @@ ] sample( model, - Turing.Experimental.Gibbs(( - s=externalsampler(sampler), m=externalsampler(sampler) - ),), + Turing.Gibbs(:s => externalsampler(sampler), :m => externalsampler(sampler)), n_samples; progress=false, )