Bijectors.jl icon indicating copy to clipboard operation
Bijectors.jl copied to clipboard

Method error for Stacked

Open baggepinnen opened this issue 3 years ago • 2 comments

I'm getting a method error when trying to run

using Turing: Variational
m = clamp_sim(trq_m, q_m)
advi = ADVI(10, 1000)
q = vi(m, advi)

where clamp_sim is a fairly complicated model relying on a private package. The model samples okay with the MH sampler and is differentiable with ForwardDiff. I hope the following stack trace is useful. If more info is required, I can try to reduce the model a bit, but I'm afraid I don't know enough about Turing/Bijectors to have any idea of what has gone wrong.

julia> q = vi(m, advi)
ERROR: MethodError: no method matching Stacked(::Tuple{Inverse{Bijectors.TruncatedBijector{1, Float64, Float64}, 1}, Bijectors.Exp{1}, Bijectors.Exp{1}, Inverse{Bijectors.TruncatedBijector{1, SVector{6, Float64}, SVector{6, Float64}}, 1}, Identity{1}, Bijectors.Exp{1}, Bijectors.Exp{1}, Inverse{Bijectors.TruncatedBijector{2, Matrix{Float64}, Matrix{Float64}}, 2}}, ::NTuple{8, UnitRange{Int64}})
Closest candidates are:
  Stacked(::Any, ::AbstractArray) at /home/fredrikb/.julia/packages/Bijectors/L39Ij/src/bijectors/stacked.jl:44
  Stacked(::A, ::Tuple{Vararg{UnitRange{Int64}, N}}) where {N, A<:(AbstractArray{var"#s27", N} where {var"#s27"<:Bijector, N})} at /home/fredrikb/.julia/packages/Bijectors/L39Ij/src/bijectors/stacked.jl:35
  Stacked(::C, ::Tuple{Vararg{UnitRange{Int64}, N}}) where {N, C<:Tuple{Vararg{Union{Bijector{0}, Bijector{1}}, N}}} at /home/fredrikb/.julia/packages/Bijectors/L39Ij/src/bijectors/stacked.jl:28
  ...
Stacktrace:
 [1] Stacked(bs::Tuple{Inverse{Bijectors.TruncatedBijector{1, Float64, Float64}, 1}, Bijectors.Exp{1}, Bijectors.Exp{1}, Inverse{Bijectors.TruncatedBijector{1, SVector{6, Float64}, SVector{6, Float64}}, 1}, Identity{1}, Bijectors.Exp{1}, Bijectors.Exp{1}, Inverse{Bijectors.TruncatedBijector{2, Matrix{Float64}, Matrix{Float64}}, 2}}, ranges::Vector{UnitRange{Int64}})
   @ Bijectors ~/.julia/packages/Bijectors/L39Ij/src/bijectors/stacked.jl:44
 [2] meanfield(rng::Random._GLOBAL_RNG, model::DynamicPPL.Model{var"#15#17", (:trq_m, :q_m), (), (), Tuple{Matrix{Float64}, Matrix{Float64}}, Tuple{}})
   @ Turing.Variational ~/.julia/packages/Turing/uAz5c/src/variational/advi.jl:84
 [3] meanfield
   @ ~/.julia/packages/Turing/uAz5c/src/variational/advi.jl:53 [inlined]
 [4] vi(model::DynamicPPL.Model{var"#15#17", (:trq_m, :q_m), (), (), Tuple{Matrix{Float64}, Matrix{Float64}}, Tuple{}}, alg::ADVI{AdvancedVI.ForwardDiffAD{40}}; optimizer::AdvancedVI.TruncatedADAGrad)
   @ Turing.Variational ~/.julia/packages/Turing/uAz5c/src/variational/advi.jl:109
 [5] vi(model::DynamicPPL.Model{var"#15#17", (:trq_m, :q_m), (), (), Tuple{Matrix{Float64}, Matrix{Float64}}, Tuple{}}, alg::ADVI{AdvancedVI.ForwardDiffAD{40}})
   @ Turing.Variational ~/.julia/packages/Turing/uAz5c/src/variational/advi.jl:109
 [6] top-level scope
   @ REPL[8]:1

baggepinnen avatar Feb 13 '21 11:02 baggepinnen

Yeah this is an issue with how the transformation from real space to constrained space is constructed. Essentially, at the moment only 0- and 1-dimensional distributions are supported by that constructor. I got the fix though, just a sec!

torfjelde avatar Feb 13 '21 13:02 torfjelde

https://github.com/TuringLang/Turing.jl/pull/1545

Hopefully we'll get the this merged ASAP, but it's a fairly simple change so in the meantime you could just copy-paste the def of Vec and the redefinitions of meanfield and bijector from the file:)

torfjelde avatar Feb 15 '21 12:02 torfjelde