Skip to content

Sampling from prior using return value doesn't work with MvNormal #1559

Open
@knuesel

Description

@knuesel

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions