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

Cannot use Distributions.MixtureDistribution for Stochastic variable

Open feynmanliang opened this issue 6 years ago • 1 comments

Problem appears upstream to Distributions.jl, see https://github.com/JuliaStats/Distributions.jl/issues/650

The following code:

using Mamba

dist = MixtureModel([
    MvNormal([0,0], hcat([[1,0.99],[0.99,1]]...)),
    MvNormal([-.8,.8], hcat([[1,0.75],[0.75,1]]...))
])

model = Model(
    x = Stochastic(1,
        () -> dist
    ),
)

inits = [
    Dict{Symbol,Any}(:x => [0,0])
for i in 1:3
]

scheme = [HMC(:x, 0.03, 10, hcat([[1,0],[0,1]]...))]
setsamplers!(model, scheme)
sim = mcmc(model, Dict{Symbol,Any}(), inits, 100)

Generates the stacktrace:

MethodError: no method matching insupport(::Distributions.MixtureModel{Distributions.Multivariate,Distributions.Continuous,Distributions.MvNormal{Float64,PDMats.PDMat{Float64,Array{Float64,2}},Array{Float64,1}}}, ::Array{Float64,1})
Closest candidates are:
  insupport(::Distributions.Dirichlet, ::AbstractArray{T<:Real,1}) where T<:Real at /Users/feynman/.julia/v0.6/Distributions/src/multivariate/dirichlet.jl:149
  insupport(::Distributions.Multinomial, ::AbstractArray{T<:Real,1}) where T<:Real at /Users/feynman/.julia/v0.6/Distributions/src/multivariate/multinomial.jl:130
  insupport(::Distributions.DirichletMultinomial, ::AbstractArray{T<:Real,1}) where T<:Real at /Users/feynman/.julia/v0.6/Distributions/src/multivariate/dirichletmultinomial.jl:51
  ...

Stacktrace:
 [1] logpdf_sub(::Distributions.MixtureModel{Distributions.Multivariate,Distributions.Continuous,Distributions.MvNormal{Float64,PDMats.PDMat{Float64,Array{Float64,2}},Array{Float64,1}}}, ::Array{Float64,1}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/distributions/distributionstruct.jl:139
 [2] logpdf(::Mamba.ArrayStochastic{1}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/dependent.jl:212
 [3] logpdf(::Mamba.Model, ::Array{Symbol,1}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:63
 [4] logpdf!(::Mamba.Model, ::Array{Float64,1}, ::Int64, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:82
 [5] finite_difference!(::Mamba.##38#39{Mamba.Model,Int64,Bool}, ::Array{Float64,1}, ::Array{Float64,1}, ::Symbol) at /Users/feynman/.julia/v0.6/Calculus/src/finite_difference.jl:112
 [6] finite_difference at /Users/feynman/.julia/v0.6/Calculus/src/finite_difference.jl:145 [inlined]
 [7] gradient at /Users/feynman/.julia/v0.6/Calculus/src/derivative.jl:13 [inlined]
 [8] #gradlogpdf!#37 at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:50 [inlined]
 [9] (::Mamba.#kw##gradlogpdf!)(::Array{Any,1}, ::Mamba.#gradlogpdf!, ::Mamba.Model, ::Array{Float64,1}, ::Int64, ::Bool) at ./<missing>:0
 [10] logpdfgrad!(::Mamba.SamplingBlock, ::Array{Float64,1}, ::Symbol) at /Users/feynman/.julia/v0.6/Mamba/src/samplers/sampler.jl:108
 [11] sample!(::Mamba.SamplerVariate{Mamba.HMCTune}, ::Mamba.##298#300{Symbol}) at /Users/feynman/.julia/v0.6/Mamba/src/samplers/hmc.jl:76
 [12] (::Mamba.##297#299{Symbol,Tuple{Float64,Int64,Array{Int64,2}}})(::Mamba.Model, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/samplers/hmc.jl:61
 [13] (::##15#16)(::Mamba.Model, ::Int64) at ./<missing>:0
 [14] sample!(::Mamba.Model, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:99
 [15] sample!(::Mamba.Model) at /Users/feynman/.julia/v0.6/Mamba/src/model/simulation.jl:94
 [16] mcmc_worker!(::Array{Any,1}) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:75
 [17] _collect(::Array{Array{Any,1},1}, ::Base.Generator{Array{Array{Any,1},1},Mamba.#mcmc_worker!}, ::Base.EltypeUnknown, ::Base.HasShape) at ./array.jl:454
 [18] map(::Function, ::Array{Array{Any,1},1}) at ./abstractarray.jl:1865
 [19] pmap2(::Function, ::Array{Array{Any,1},1}) at /Users/feynman/.julia/v0.6/Mamba/src/utils.jl:99
 [20] mcmc_master!(::Mamba.Model, ::UnitRange{Int64}, ::Int64, ::Int64, ::UnitRange{Int64}, ::Bool) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:52
 [21] #mcmc#29(::Int64, ::Int64, ::Int64, ::Bool, ::Function, ::Mamba.Model, ::Dict{Symbol,Any}, ::Array{Dict{Symbol,Any},1}, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:32
 [22] mcmc(::Mamba.Model, ::Dict{Symbol,Any}, ::Array{Dict{Symbol,Any},1}, ::Int64) at /Users/feynman/.julia/v0.6/Mamba/src/model/mcmc.jl:22
 [23] include_string(::String, ::String) at ./loading.jl:515

feynmanliang avatar Aug 13 '17 23:08 feynmanliang

Hi Feynman,

Nice work tracking down the issue and creating a pull request to add an insupport method to the Distribution package's MixtureModel type. This is the first time I have seen someone try a MixtureModel in Mamba. It's neat to see that your example works with that additional method.

brian-j-smith avatar Aug 15 '17 14:08 brian-j-smith