Skip to content

Commit 92fbf69

Browse files
committed
Prefix varnames appropriately inside check_model_and_trace
1 parent 727da63 commit 92fbf69

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

src/contexts.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ end
261261

262262
const PREFIX_SEPARATOR = Symbol(".")
263263

264+
# TODO(penelopeysm): Prefixing arguably occurs the wrong way round here
264265
function PrefixContext{PrefixInner}(
265266
context::PrefixContext{PrefixOuter}
266267
) where {PrefixInner,PrefixOuter}
@@ -273,13 +274,13 @@ function PrefixContext{PrefixInner}(
273274
end
274275
end
275276

276-
function prefix(::PrefixContext{Prefix}, vn::VarName{Sym}) where {Prefix,Sym}
277-
if @generated
278-
return :(VarName{$(QuoteNode(Symbol(Prefix, PREFIX_SEPARATOR, Sym)))}(getoptic(vn)))
279-
else
280-
VarName{Symbol(Prefix, PREFIX_SEPARATOR, Sym)}(getoptic(vn))
281-
end
277+
# TODO(penelopeysm): Prefixing arguably occurs the wrong way round here
278+
function prefix(ctx::PrefixContext{Prefix}, vn::VarName{Sym}) where {Prefix,Sym}
279+
prefix(childcontext(ctx), VarName{Symbol(Prefix, PREFIX_SEPARATOR, Sym)}(getoptic(vn)))
282280
end
281+
prefix(ctx::AbstractContext, vn::VarName) = prefix(NodeTrait(ctx), ctx, vn)
282+
prefix(::IsLeaf, ::AbstractContext, vn::VarName) = vn
283+
prefix(::IsParent, ctx::AbstractContext, vn::VarName) = prefix(childcontext(ctx), vn)
283284

284285
"""
285286
prefix(model::Model, x)

src/debug_utils.jl

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -239,50 +239,51 @@ function DynamicPPL.setchildcontext(context::DebugContext, child)
239239
end
240240

241241
function record_varname!(context::DebugContext, varname::VarName, dist)
242-
if haskey(context.varnames_seen, varname)
242+
prefixed_varname = prefix(context, varname)
243+
if haskey(context.varnames_seen, prefixed_varname)
243244
if context.error_on_failure
244-
error("varname $varname used multiple times in model")
245+
error("varname $prefixed_varname used multiple times in model")
245246
else
246-
@warn "varname $varname used multiple times in model"
247+
@warn "varname $prefixed_varname used multiple times in model"
247248
end
248-
context.varnames_seen[varname] += 1
249+
context.varnames_seen[prefixed_varname] += 1
249250
else
250251
# We need to check:
251252
# 1. Does this `varname` subsume any of the other keys.
252253
# 2. Does any of the other keys subsume `varname`.
253254
vns = collect(keys(context.varnames_seen))
254255
# Is `varname` subsumed by any of the other keys?
255-
idx_parent = findfirst(Base.Fix2(subsumes, varname), vns)
256+
idx_parent = findfirst(Base.Fix2(subsumes, prefixed_varname), vns)
256257
if idx_parent !== nothing
257258
varname_parent = vns[idx_parent]
258259
if context.error_on_failure
259260
error(
260-
"varname $(varname_parent) used multiple times in model (subsumes $varname)",
261+
"varname $(varname_parent) used multiple times in model (subsumes $prefixed_varname)",
261262
)
262263
else
263-
@warn "varname $(varname_parent) used multiple times in model (subsumes $varname)"
264+
@warn "varname $(varname_parent) used multiple times in model (subsumes $prefixed_varname)"
264265
end
265266
# Update count of parent.
266267
context.varnames_seen[varname_parent] += 1
267268
else
268269
# Does `varname` subsume any of the other keys?
269-
idx_child = findfirst(Base.Fix1(subsumes, varname), vns)
270+
idx_child = findfirst(Base.Fix1(subsumes, prefixed_varname), vns)
270271
if idx_child !== nothing
271272
varname_child = vns[idx_child]
272273
if context.error_on_failure
273274
error(
274-
"varname $(varname_child) used multiple times in model (subsumed by $varname)",
275+
"varname $(varname_child) used multiple times in model (subsumed by $prefixed_varname)",
275276
)
276277
else
277-
@warn "varname $(varname_child) used multiple times in model (subsumed by $varname)"
278+
@warn "varname $(varname_child) used multiple times in model (subsumed by $prefixed_varname)"
278279
end
279280

280281
# Update count of child.
281282
context.varnames_seen[varname_child] += 1
282283
end
283284
end
284285

285-
context.varnames_seen[varname] = 1
286+
context.varnames_seen[prefixed_varname] = 1
286287
end
287288
end
288289

0 commit comments

Comments
 (0)