Open
Description
The guide shows how to sample from the prior using return values:
@model function gdemo(x, y)
s ~ InverseGamma(2, 3)
m ~ Normal(0, sqrt(s))
x ~ Normal(m, sqrt(s))
y ~ Normal(m, sqrt(s))
return x, y
end
g_prior_sample = gdemo(missing, missing)
g_prior_sample()
I can rewrite it like this and it still works:
@model function gdemo(x)
s ~ InverseGamma(2, 3)
m ~ Normal(0, sqrt(s))
x[1] ~ Normal(m, sqrt(s))
x[2] ~ Normal(m, sqrt(s))
return x
end
g_prior_sample = gdemo([missing, missing])
g_prior_sample()
However in my model I have many uses of MvNormal
. The equivalent in this small example would be:
@model function gdemo(x)
s ~ InverseGamma(2, 3)
m ~ Normal(0, sqrt(s))
x ~ MvNormal([m, m], sqrt(s))
return x
end
g_prior_sample = gdemo([missing, missing])
g_prior_sample()
On 0.15.1 this fails with MethodError: no method matching loglikelihood(::IsoNormal, ::Vector{Union{Missing, Float64}})
.
Stacktrace
[1] observe(spl::DynamicPPL.SampleFromPrior, dist::IsoNormal, value::Vector{Union{Missing, Float64}}, vi::DynamicPPL.UntypedVarInfo{DynamicPPL.Metadata{Dict{DynamicPPL.VarName, Int64}, Vector{Distribution}, Vector{DynamicPPL.VarName}, Vector{Real}, Vector{Set{DynamicPPL.Selector}}}, Float64}) @ DynamicPPL ~/.julia/packages/DynamicPPL/wf0dU/src/context_implementations.jl:152 [2] _tilde(sampler::DynamicPPL.SampleFromPrior, right::IsoNormal, left::Vector{Union{Missing, Float64}}, vi::DynamicPPL.UntypedVarInfo{DynamicPPL.Metadata{Dict{DynamicPPL.VarName, Int64}, Vector{Distribution}, Vector{DynamicPPL.VarName}, Vector{Real}, Vector{Set{DynamicPPL.Selector}}}, Float64}) @ DynamicPPL ~/.julia/packages/DynamicPPL/wf0dU/src/context_implementations.jl:109 [3] tilde(ctx::DynamicPPL.DefaultContext, sampler::DynamicPPL.SampleFromPrior, right::IsoNormal, left::Vector{Union{Missing, Float64}}, vi::DynamicPPL.UntypedVarInfo{DynamicPPL.Metadata{Dict{DynamicPPL.VarName, Int64}, Vector{Distribution}, Vector{DynamicPPL.VarName}, Vector{Real}, Vector{Set{DynamicPPL.Selector}}}, Float64}) @ DynamicPPL ~/.julia/packages/DynamicPPL/wf0dU/src/context_implementations.jl:67 [4] tilde_observe(ctx::DynamicPPL.DefaultContext, sampler::DynamicPPL.SampleFromPrior, right::IsoNormal, left::Vector{Union{Missing, Float64}}, vname::DynamicPPL.VarName{:x, Tuple{}}, vinds::Tuple{}, vi::DynamicPPL.UntypedVarInfo{DynamicPPL.Metadata{Dict{DynamicPPL.VarName, Int64}, Vector{Distribution}, Vector{DynamicPPL.VarName}, Vector{Real}, Vector{Set{DynamicPPL.Selector}}}, Float64}) @ DynamicPPL ~/.julia/packages/DynamicPPL/wf0dU/src/context_implementations.jl:89 [5] #33 @ ./In[81]:8 [inlined] [6] (::var"#33#34")(_rng::Random._GLOBAL_RNG, _model::DynamicPPL.Model{var"#33#34", (:x,), (), (), Tuple{Vector{Missing}}, Tuple{}}, _varinfo::DynamicPPL.UntypedVarInfo{DynamicPPL.Metadata{Dict{DynamicPPL.VarName, Int64}, Vector{Distribution}, Vector{DynamicPPL.VarName}, Vector{Real}, Vector{Set{DynamicPPL.Selector}}}, Float64}, _sampler::DynamicPPL.SampleFromPrior, _context::DynamicPPL.DefaultContext, x::Vector{Union{Missing, Float64}}) @ Main ./none:0 [7] macro expansion @ ~/.julia/packages/DynamicPPL/wf0dU/src/model.jl:0 [inlined] [8] _evaluate @ ~/.julia/packages/DynamicPPL/wf0dU/src/model.jl:154 [inlined] [9] evaluate_threadunsafe @ ~/.julia/packages/DynamicPPL/wf0dU/src/model.jl:127 [inlined] [10] Model @ ~/.julia/packages/DynamicPPL/wf0dU/src/model.jl:92 [inlined] [11] Model @ ~/.julia/packages/DynamicPPL/wf0dU/src/model.jl:91 [inlined] [12] (::DynamicPPL.Model{var"#33#34", (:x,), (), (), Tuple{Vector{Missing}}, Tuple{}})() @ DynamicPPL ~/.julia/packages/DynamicPPL/wf0dU/src/model.jl:98 [13] top-level scope @ In[84]:2 [14] eval @ ./boot.jl:360 [inlined] [15] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String) @ Base ./loading.jl:1090