@@ -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 = $ (DynamicPPL. maybe_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
"""
@@ -413,7 +414,9 @@ function generate_assign(left, right)
413
414
return quote
414
415
$ right_val = $ right
415
416
if $ (DynamicPPL. is_extracting_values)(__varinfo__)
416
- $ vn = $ (DynamicPPL. prefix)(__model__. context, $ (make_varname_expression (left)))
417
+ $ vn = $ (DynamicPPL. maybe_prefix)(
418
+ $ (make_varname_expression (left)), __model__. prefix
419
+ )
417
420
__varinfo__ = $ (map_accumulator!!)(
418
421
$ acc -> push! ($ acc, $ vn, $ right_val), __varinfo__, Val (:ValuesAsInModel )
419
422
)
@@ -448,24 +451,23 @@ function generate_tilde(left, right)
448
451
449
452
# Otherwise it is determined by the model or its value,
450
453
# if the LHS represents an observation
451
- @gensym vn isassumption value dist
454
+ @gensym left_vn vn isassumption value dist
452
455
453
456
return quote
454
457
$ dist = $ right
455
- $ vn = $ (DynamicPPL. resolve_varnames)($ (make_varname_expression (left)), $ dist)
456
- $ isassumption = $ (DynamicPPL. isassumption (left, vn))
458
+ $ left_vn = $ (DynamicPPL. resolve_varnames)($ (make_varname_expression (left)), $ dist)
459
+ $ vn = $ (DynamicPPL. maybe_prefix)($ left_vn, __model__. prefix)
460
+ $ isassumption = $ (DynamicPPL. isassumption (left, left_vn))
457
461
if $ (DynamicPPL. isfixed (left, vn))
458
- $ left = $ (DynamicPPL. getfixed_nested)(
459
- __model__. context, $ (DynamicPPL. prefix)(__model__. context, $ vn)
460
- )
462
+ $ left = $ (DynamicPPL. getfixed_nested)(__model__. context, $ vn)
461
463
elseif $ isassumption
462
464
$ (generate_tilde_assume (left, dist, vn))
463
465
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
- )
466
+ # If `left_vn ` is not in `argnames`, we need to make sure that the variable is defined.
467
+ # (Note: we use the unprefixed `left_vn` here rather than `vn` which will have had
468
+ # prefixes applied!)
469
+ if ! $ (DynamicPPL. inargnames)( $ left_vn, __model__ )
470
+ $ left = $ (DynamicPPL . getconditioned_nested)(__model__ . context, $ vn )
469
471
end
470
472
471
473
$ value, __varinfo__ = $ (DynamicPPL. tilde_observe!!)(
@@ -495,6 +497,7 @@ function generate_tilde_assume(left, right, vn)
495
497
return quote
496
498
$ value, __varinfo__ = $ (DynamicPPL. tilde_assume!!)(
497
499
__model__. context,
500
+ __model__. prefix,
498
501
$ (DynamicPPL. unwrap_right_vn)($ (DynamicPPL. check_tilde_rhs)($ right), $ vn). .. ,
499
502
__varinfo__,
500
503
)
0 commit comments