Skip to content

Commit e3ab31b

Browse files
committed
Merge branch 'master' into tor/abstractmcmc-v3
2 parents cc0b140 + 9104637 commit e3ab31b

File tree

3 files changed

+72
-11
lines changed

3 files changed

+72
-11
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "Turing"
22
uuid = "fce5fe82-541a-59a6-adf8-730c64b5f9a0"
3-
version = "0.15.13"
3+
version = "0.15.14"
44

55
[deps]
66
AbstractMCMC = "80f14c24-f653-4e6a-9b94-39d6b0f70001"

src/inference/mh.jl

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,26 @@ end
334334
end
335335

336336
# Utility functions to link
337-
maybe_link!(varinfo, sampler, proposal) = nothing
338-
function maybe_link!(varinfo, sampler, proposal::AdvancedMH.RandomWalkProposal)
339-
link!(varinfo, sampler)
337+
should_link(varinfo, sampler, proposal) = false
338+
function should_link(varinfo, sampler, proposal::NamedTuple{(), Tuple{}})
339+
# If it's an empty `NamedTuple`, we're using the priors as proposals
340+
# in which case we shouldn't link.
341+
return false
342+
end
343+
function should_link(varinfo, sampler, proposal::AdvancedMH.RandomWalkProposal)
344+
return true
345+
end
346+
function should_link(
347+
varinfo,
348+
sampler,
349+
proposal::NamedTuple{names, vals}
350+
) where {names, vals<:NTuple{<:Any, <:AdvancedMH.RandomWalkProposal}}
351+
return true
352+
end
353+
354+
function maybe_link!(varinfo, sampler, proposal)
355+
should_link(varinfo, sampler, proposal) && link!(varinfo, sampler)
356+
return varinfo
340357
end
341358

342359
# Make a proposal if we don't have a covariance proposal matrix (the default).

test/inference/mh.jl

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,17 @@
130130
# with small-valued VC matrix to check if we only see very small steps
131131
vc_μ = convert(Array, 1e-4*I(2))
132132
vc_σ = convert(Array, 1e-4*I(2))
133-
134-
chn = sample(mod,
135-
Gibbs(
136-
MH((, vc_μ)),
137-
MH((, vc_σ)),
138-
), 3_000 # draws
139-
)
133+
134+
alg = Gibbs(
135+
MH((, vc_μ)),
136+
MH((, vc_σ)),
137+
)
138+
139+
chn = sample(
140+
mod,
141+
alg,
142+
3_000 # draws
143+
)
140144

141145

142146
chn2 = sample(mod, MH(), 3_000)
@@ -168,4 +172,44 @@
168172
@test mean(chain, "T[$j][$i]") 0.2 atol=0.01
169173
end
170174
end
175+
176+
@turing_testset "MH link/invlink" begin
177+
vi_base = DynamicPPL.VarInfo(gdemo_default)
178+
179+
# Don't link when no proposals are given since we're using priors
180+
# as proposals.
181+
vi = deepcopy(vi_base)
182+
alg = MH()
183+
spl = DynamicPPL.Sampler(alg)
184+
Turing.Inference.maybe_link!(vi, spl, alg.proposals)
185+
@test !DynamicPPL.islinked(vi, spl)
186+
187+
# Link if proposal is `AdvancedHM.RandomWalkProposal`
188+
vi = deepcopy(vi_base)
189+
d = length(vi_base[DynamicPPL.SampleFromPrior()])
190+
alg = MH(AdvancedMH.RandomWalkProposal(MvNormal(d, 1.0)))
191+
spl = DynamicPPL.Sampler(alg)
192+
Turing.Inference.maybe_link!(vi, spl, alg.proposals)
193+
@test DynamicPPL.islinked(vi, spl)
194+
195+
# Link if ALL proposals are `AdvancedHM.RandomWalkProposal`.
196+
vi = deepcopy(vi_base)
197+
alg = MH(:s => AdvancedMH.RandomWalkProposal(Normal()))
198+
spl = DynamicPPL.Sampler(alg)
199+
Turing.Inference.maybe_link!(vi, spl, alg.proposals)
200+
@test DynamicPPL.islinked(vi, spl)
201+
202+
# Don't link if at least one proposal is NOT `RandomWalkProposal`.
203+
# TODO: make it so that only those that are using `RandomWalkProposal`
204+
# are linked! I.e. resolve https://github.com/TuringLang/Turing.jl/issues/1583.
205+
# https://github.com/TuringLang/Turing.jl/pull/1582#issuecomment-817148192
206+
vi = deepcopy(vi_base)
207+
alg = MH(
208+
:m => AdvancedMH.StaticProposal(Normal()),
209+
:s => AdvancedMH.RandomWalkProposal(Normal())
210+
)
211+
spl = DynamicPPL.Sampler(alg)
212+
Turing.Inference.maybe_link!(vi, spl, alg.proposals)
213+
@test !DynamicPPL.islinked(vi, spl)
214+
end
171215
end

0 commit comments

Comments
 (0)