Skip to content

Indexing into SimpleVarInfo  #363

@ParadaCarleton

Description

@ParadaCarleton
julia> @model function demo()
              μ ~ Normal()
              x = Vector{Float64}(undef, 2)
              for i in eachindex(x)
                  x[i] ~ Normal()
              end
              return x
          end
demo (generic function with 2 methods)

julia> m = demo()
Model{typeof(demo), (), (), (), Tuple{}, Tuple{}, DefaultContext}(:demo, demo, NamedTuple(), NamedTuple(), DefaultContext())

julia> vi = SimpleVarInfo(VarInfo(m))

julia> logjoint(m, vi)
ERROR: type NamedTuple has no field x
Stacktrace:
  [1] getproperty
    @ ./Base.jl:42 [inlined]
  [2] get(obj::NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, l::Setfield.PropertyLens{:x})
    @ Setfield ~/.julia/packages/Setfield/9IaGB/src/lens.jl:117
  [3] get(obj::NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, l::Setfield.ComposedLens{Setfield.PropertyLens{:x}, Setfield.IndexLens{Tuple{Int64}}})
    @ Setfield ~/.julia/packages/Setfield/9IaGB/src/lens.jl:182
  [4] get(obj::NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, vn::VarName{:x, Setfield.IndexLens{Tuple{Int64}}})
    @ AbstractPPL ~/.julia/packages/AbstractPPL/EkJZe/src/varname.jl:131
  [5] getindex(vi::SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64}, vn::VarName{:x, Setfield.IndexLens{Tuple{Int64}}})
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/simple_varinfo.jl:186
  [6] getindex(vi::DynamicPPL.ThreadSafeVarInfo{SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64}, Vector{Base.RefValue{Float64}}}, vn::VarName{:x, Setfield.IndexLens{Tuple{Int64}}})
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/threadsafe.jl:65
  [7] assume(dist::Normal{Float64}, vn::VarName{:x, Setfield.IndexLens{Tuple{Int64}}}, vi::DynamicPPL.ThreadSafeVarInfo{SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64}, Vector{Base.RefValue{Float64}}})
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/simple_varinfo.jl:341
  [8] tilde_assume(#unused#::DynamicPPL.IsLeaf, context::DefaultContext, right::Normal{Float64}, vn::VarName{:x, Setfield.IndexLens{Tuple{Int64}}}, vi::DynamicPPL.ThreadSafeVarInfo{SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64}, Vector{Base.RefValue{Float64}}})
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/context_implementations.jl:39
  [9] tilde_assume(::DefaultContext, ::Normal{Float64}, ::VarName{:x, Setfield.IndexLens{Tuple{Int64}}}, ::DynamicPPL.ThreadSafeVarInfo{SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64}, Vector{Base.RefValue{Float64}}})
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/context_implementations.jl:36
 [10] tilde_assume!!(context::DefaultContext, right::Normal{Float64}, vn::VarName{:x, Setfield.IndexLens{Tuple{Int64}}}, vi::DynamicPPL.ThreadSafeVarInfo{SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64}, Vector{Base.RefValue{Float64}}})
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/context_implementations.jl:117
 [11] demo
    @ ./REPL[3]:4 [inlined]
 [12] macro expansion
    @ ~/.julia/dev/DynamicPPL.jl/src/model.jl:489 [inlined]
 [13] _evaluate!!
    @ ~/.julia/dev/DynamicPPL.jl/src/model.jl:472 [inlined]
 [14] evaluate_threadsafe!!(model::Model{typeof(demo), (), (), (), Tuple{}, Tuple{}, DefaultContext}, varinfo::SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64}, context::DefaultContext)
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/model.jl:463
 [15] evaluate!!
    @ ~/.julia/dev/DynamicPPL.jl/src/model.jl:402 [inlined]
 [16] logjoint(model::Model{typeof(demo), (), (), (), Tuple{}, Tuple{}, DefaultContext}, varinfo::SimpleVarInfo{NamedTuple{(:μ, Symbol("x[1]"), Symbol("x[2]")), Tuple{Float64, Float64, Float64}}, Float64})
    @ DynamicPPL ~/.julia/dev/DynamicPPL.jl/src/model.jl:522
 [17] top-level scope
    @ REPL[18]:1

julia> vi
SimpleVarInfo((μ = 0.35792840316913777, x[1] = -0.05997503801481726, x[2] = -2.2264843907029834), -5.30128684412608)

Looks like indexing with :x into SimpleVarInfo doesn't work, so logjoint fails.

Given SimpleVarInfo is a named tuple that can store arbitrary types, is there anything keeping us from storing arrays in it?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions