Skip to content

error with invlink!! and Dirichlet #504

@miguelbiron

Description

@miguelbiron

The following code works well with DynamicPPL v0.23.0 but fails with anything newer. In turn, this seems to be caused by the new parametrization of the Simplex introduced in Bijectors v0.13.0

using DynamicPPL, Distributions

@model function demo()
    x ~ Dirichlet(2, 1.0)
end
model = demo()
vi    = VarInfo(model)                                   # make VarInfo -> sample from prior and compute logdensity
getlogp(vi)  0.0                                        # zero because Dirichlet(1) == Uniform over Simplex
spl   = SampleFromPrior()                                # create dummy sampler for linking
DynamicPPL.link!!(vi, spl, model)                        # transform to unconstrained space
!(0.0  getlogp(last(DynamicPPL.evaluate!!(model, vi)))) # non-zero now due to log(abs(determinant(jacobian)))
x = vi[spl]                                              # extract unconstrained values
newx  = deepcopy(x)                                      # simulate making a change to x
vinew = VarInfo(vi, spl, newx)                           # make a new vi with the new unconstrained values
invlink!!(vinew,spl,model)                               # fails with Bijectors >= v0.13

The error is

julia> invlink!!(vinew,spl,model)
ERROR: BoundsError: attempt to access 1-element Vector{Float64} at index [1:2]
Stacktrace:
  [1] throw_boundserror(A::Vector{Float64}, I::Tuple{UnitRange{Int64}})
    @ Base ./abstractarray.jl:744
  [2] checkbounds
    @ ./abstractarray.jl:709 [inlined]
  [3] setindex!
    @ ./array.jl:992 [inlined]
  [4] setval!(md::DynamicPPL.Metadata{Dict{VarName{:x, Setfield.IdentityLens}, Int64}, Vector{Dirichlet{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}, Float64}}, Vector{VarName{:x, Setfield.IdentityLens}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, val::Vector{Float64}, vn::VarName{:x, Setfield.IdentityLens})
    @ DynamicPPL ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:328
  [5] setval!
    @ ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:327 [inlined]
  [6] _inner_transform!(vi::TypedVarInfo{NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{VarName{:x, Setfield.IdentityLens}, Int64}, Vector{Dirichlet{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}, Float64}}, Vector{VarName{:x, Setfield.IdentityLens}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, vn::VarName{:x, Setfield.IdentityLens}, dist::Dirichlet{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}, Float64}, f::Bijectors.Inverse{Bijectors.SimplexBijector})
    @ DynamicPPL ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:892
  [7] macro expansion
    @ ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:869 [inlined]
  [8] _invlink!(metadata::NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{VarName{:x, Setfield.IdentityLens}, Int64}, Vector{Dirichlet{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}, Float64}}, Vector{VarName{:x, Setfield.IdentityLens}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, vi::TypedVarInfo{NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{VarName{:x, Setfield.IdentityLens}, Int64}, Vector{Dirichlet{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}, Float64}}, Vector{VarName{:x, Setfield.IdentityLens}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, vns::NamedTuple{(:x,), Tuple{Vector{VarName{:x, Setfield.IdentityLens}}}}, #unused#::Val{()})
    @ DynamicPPL ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:855
  [9] _invlink!
    @ ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:853 [inlined]
 [10] _invlink!
    @ ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:849 [inlined]
 [11] invlink!!
    @ ~/.julia/packages/DynamicPPL/qAXlC/src/varinfo.jl:801 [inlined]
 [12] invlink!!(vi::TypedVarInfo{NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{VarName{:x, Setfield.IdentityLens}, Int64}, Vector{Dirichlet{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}, Float64}}, Vector{VarName{:x, Setfield.IdentityLens}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, spl::SampleFromPrior, model::Model{typeof(demo), (), (), (), Tuple{}, Tuple{}, DefaultContext})
    @ DynamicPPL ~/.julia/packages/DynamicPPL/qAXlC/src/abstract_varinfo.jl:403
 [13] top-level scope

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