Closed
Description
Ref: TuringLang/Turing.jl#2390 (comment)
MWE:
julia> @model demo(x) = x .~ Normal()
demo (generic function with 2 methods)
julia> demo(missing)()
ERROR: MethodError: no method matching dot_assume(::Random.TaskLocalRNG, ::SampleFromPrior, ::Normal{…}, ::VarName{…}, ::Missing, ::UntypedVarInfo{…})
[...]
julia> demo([missing])()
ERROR: MethodError: no method matching loglikelihood(::Normal{Float64}, ::Vector{Union{Missing, Float64}})
[...]
Even if you use condition
, you still run into a similar issue when specifying components, i.e.
julia> @model function demo()
x = Vector{Float64}(undef, 2)
x .~ Normal()
end
demo (generic function with 4 methods)
julia> (demo() | (@varname(x[1]) => 1.0,))() # not conditioned
2-element Vector{Float64}:
1.6841936984140546
0.3645020534551503
The reason why we do this is because of performance: we want .~
to be faster than just iterating over the entire broadcast expression and calling tilde_assume!!
and tilde_observe!!
separately. However, this is very, very confusing for users, and I think it's very understandable.
Sooo the question is how to fix this. A few immediate thoughts:
- Do we need
.~
? Does it just make things confusing? - Should we just convert it into a loop over the broadcasted expression and drop the perf benefits?
Metadata
Metadata
Assignees
Labels
No labels