@@ -60,11 +60,14 @@ evaluates to a `VarName`, and this will be used in the subsequent checks.
60
60
If `vn` is not specified, `AbstractPPL.varname(expr, need_concretize(expr))` will be
61
61
used in its place.
62
62
"""
63
- function isassumption (expr:: Union{Expr,Symbol} , vn= make_varname_expression (expr))
63
+ function isassumption (expr:: Union{Expr,Symbol} , left_vn= make_varname_expression (expr))
64
+ @gensym vn
64
65
return quote
65
- if $ (DynamicPPL. contextual_isassumption)(
66
- __model__. context, $ (DynamicPPL. prefix)(__model__. context, $ vn)
67
- )
66
+ # TODO (penelopeysm): This re-prefixing seems a bit wasteful. I'd really like
67
+ # the whole `isassumption` thing to be simplified, though, so I'll
68
+ # leave it till later.
69
+ $ vn = $ (AbstractPPL. prefix)($ left_vn, __model__. prefix)
70
+ if $ (DynamicPPL. contextual_isassumption)(__model__. context, $ vn)
68
71
# Considered an assumption by `__model__.context` which means either:
69
72
# 1. We hit the default implementation, e.g. using `DefaultContext`,
70
73
# which in turn means that we haven't considered if it's one of
@@ -78,8 +81,8 @@ function isassumption(expr::Union{Expr,Symbol}, vn=make_varname_expression(expr)
78
81
# TODO : Support by adding context to model, and use `model.args`
79
82
# as the default conditioning. Then we no longer need to check `inargnames`
80
83
# since it will all be handled by `contextual_isassumption`.
81
- if ! ($ (DynamicPPL. inargnames)($ vn , __model__)) ||
82
- $ (DynamicPPL. inmissings)($ vn , __model__)
84
+ if ! ($ (DynamicPPL. inargnames)($ left_vn , __model__)) ||
85
+ $ (DynamicPPL. inmissings)($ left_vn , __model__)
83
86
true
84
87
else
85
88
$ (maybe_view (expr)) === missing
@@ -99,7 +102,7 @@ isassumption(expr) = :(false)
99
102
100
103
Return `true` if `vn` is considered an assumption by `context`.
101
104
"""
102
- function contextual_isassumption (context:: AbstractContext , vn)
105
+ function contextual_isassumption (context:: AbstractContext , vn:: VarName )
103
106
if hasconditioned_nested (context, vn)
104
107
val = getconditioned_nested (context, vn)
105
108
# TODO : Do we even need the `>: Missing`, i.e. does it even help the compiler?
115
118
116
119
isfixed (expr, vn) = false
117
120
function isfixed (:: Union{Symbol,Expr} , vn)
118
- return :($ (DynamicPPL. contextual_isfixed)(
119
- __model__. context, $ (DynamicPPL. prefix)(__model__. context, $ vn)
120
- ))
121
+ return :($ (DynamicPPL. contextual_isfixed)(__model__. context, $ vn))
121
122
end
122
123
123
124
"""
@@ -448,24 +449,23 @@ function generate_tilde(left, right)
448
449
449
450
# Otherwise it is determined by the model or its value,
450
451
# if the LHS represents an observation
451
- @gensym vn isassumption value dist
452
+ @gensym left_vn vn isassumption value dist
452
453
453
454
return quote
454
455
$ dist = $ right
455
- $ vn = $ (DynamicPPL. resolve_varnames)($ (make_varname_expression (left)), $ dist)
456
- $ isassumption = $ (DynamicPPL. isassumption (left, vn))
456
+ $ left_vn = $ (DynamicPPL. resolve_varnames)($ (make_varname_expression (left)), $ dist)
457
+ $ vn = $ (AbstractPPL. prefix)($ left_vn, __model__. prefix)
458
+ $ isassumption = $ (DynamicPPL. isassumption (left, left_vn))
457
459
if $ (DynamicPPL. isfixed (left, vn))
458
- $ left = $ (DynamicPPL. getfixed_nested)(
459
- __model__. context, $ (DynamicPPL. prefix)(__model__. context, $ vn)
460
- )
460
+ $ left = $ (DynamicPPL. getfixed_nested)(__model__. context, $ vn)
461
461
elseif $ isassumption
462
462
$ (generate_tilde_assume (left, dist, vn))
463
463
else
464
- # If `vn ` is not in `argnames`, we need to make sure that the variable is defined.
465
- if ! $ (DynamicPPL . inargnames)( $ vn, __model__)
466
- $ left = $ (DynamicPPL . getconditioned_nested)(
467
- __model__ . context, $ (DynamicPPL. prefix)(__model__ . context, $ vn )
468
- )
464
+ # If `left_vn ` is not in `argnames`, we need to make sure that the variable is defined.
465
+ # (Note: we use the unprefixed `left_vn` here rather than `vn` which will have had
466
+ # prefixes applied!)
467
+ if ! $ (DynamicPPL. inargnames)( $ left_vn, __model__ )
468
+ $ left = $ (DynamicPPL . getconditioned_nested)(__model__ . context, $ vn )
469
469
end
470
470
471
471
$ value, __varinfo__ = $ (DynamicPPL. tilde_observe!!)(
@@ -495,6 +495,7 @@ function generate_tilde_assume(left, right, vn)
495
495
return quote
496
496
$ value, __varinfo__ = $ (DynamicPPL. tilde_assume!!)(
497
497
__model__. context,
498
+ __model__. prefix,
498
499
$ (DynamicPPL. unwrap_right_vn)($ (DynamicPPL. check_tilde_rhs)($ right), $ vn). .. ,
499
500
__varinfo__,
500
501
)
0 commit comments