-
Notifications
You must be signed in to change notification settings - Fork 37
Closed
Description
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.13The 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 scopeMetadata
Metadata
Assignees
Labels
No labels