From 55a00ceacb197096ed082890db9d312ed8f161d1 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 04:06:33 +0200 Subject: [PATCH 01/17] added PrefixContext in preparation for allowing submodels --- src/DynamicPPL.jl | 1 + src/context_implementations.jl | 6 ++++++ src/contexts.jl | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/src/DynamicPPL.jl b/src/DynamicPPL.jl index e369fee3f..9cfecd95a 100644 --- a/src/DynamicPPL.jl +++ b/src/DynamicPPL.jl @@ -78,6 +78,7 @@ export AbstractVarInfo, LikelihoodContext, PriorContext, MiniBatchContext, + PrefixContext, assume, dot_assume, observer, diff --git a/src/context_implementations.jl b/src/context_implementations.jl index 6b3542acd..61b480176 100644 --- a/src/context_implementations.jl +++ b/src/context_implementations.jl @@ -39,6 +39,9 @@ end function tilde(rng, ctx::MiniBatchContext, sampler, right, left::VarName, inds, vi) return tilde(rng, ctx.ctx, sampler, right, left, inds, vi) end +function tilde(rng, ctx::PrefixContext, sampler, right, vn::VarName, inds, vi) + return tilde(rng, ctx.ctx, sampler, right, prefix(ctx, vn), inds, vi) +end """ tilde_assume(rng, ctx, sampler, right, vn, inds, vi) @@ -75,6 +78,9 @@ end function tilde(ctx::MiniBatchContext, sampler, right, left, vi) return ctx.loglike_scalar * tilde(ctx.ctx, sampler, right, left, vi) end +function tilde(ctx::PrefixContext, sampler, right, left, vi) + return tilde(ctx.ctx, sampler, right, left, vi) +end """ tilde_observe(ctx, sampler, right, left, vname, vinds, vi) diff --git a/src/contexts.jl b/src/contexts.jl index 2de05a034..26f22cf32 100644 --- a/src/contexts.jl +++ b/src/contexts.jl @@ -52,3 +52,13 @@ end function MiniBatchContext(ctx = DefaultContext(); batch_size, npoints) return MiniBatchContext(ctx, npoints/batch_size) end + + +struct PrefixContext{C, Prefix} <: AbstractContext + ctx::C +end +PrefixContext{Prefix}(ctx::AbstractContext) where {Prefix} = PrefixContext{typeof(ctx), Prefix}(ctx) + +@generated function prefix(::PrefixContext{<:Any, Prefix}, vn::VarName{Sym}) where {Prefix, Sym} + return :(VarName{$(QuoteNode(Symbol(Prefix, Symbol(":"), Sym)))}(vn.indexing)) +end From 4f0ee95814a491729dbf682b826d4f7f44052e22 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 04:13:48 +0200 Subject: [PATCH 02/17] added submodel macro --- src/DynamicPPL.jl | 4 +++- src/submodel_macro.jl | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/submodel_macro.jl diff --git a/src/DynamicPPL.jl b/src/DynamicPPL.jl index 9cfecd95a..e00b8bba2 100644 --- a/src/DynamicPPL.jl +++ b/src/DynamicPPL.jl @@ -96,7 +96,9 @@ export AbstractVarInfo, logjoint, pointwise_loglikelihoods, # Convenience macros - @addlogprob! + @addlogprob!, + @submodel + # Reexport using Distributions: loglikelihood diff --git a/src/submodel_macro.jl b/src/submodel_macro.jl new file mode 100644 index 000000000..fc18bcde0 --- /dev/null +++ b/src/submodel_macro.jl @@ -0,0 +1,23 @@ +macro submodel(expr) + return quote + $(DynamicPPL)._evaluate( + $(esc(:_rng)), + $(esc(expr)), + $(esc(:_varinfo)), + $(esc(:_sampler)), + $(esc(:_context)) + ) + end +end + +macro submodel(prefix, expr) + return quote + $(DynamicPPL)._evaluate( + $(esc(:_rng)), + $(esc(expr)), + $(esc(:_varinfo)), + $(esc(:_sampler)), + $(PrefixContext){$(esc(prefix))}($(esc(:_context))) + ) + end +end From 2625d122e9969b10497ee1f403d09053dbf2726c Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 05:35:57 +0200 Subject: [PATCH 03/17] forgot a QuoteNode and including the actual code --- src/DynamicPPL.jl | 1 + src/submodel_macro.jl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/DynamicPPL.jl b/src/DynamicPPL.jl index e00b8bba2..fad96323d 100644 --- a/src/DynamicPPL.jl +++ b/src/DynamicPPL.jl @@ -126,5 +126,6 @@ include("compiler.jl") include("prob_macro.jl") include("compat/ad.jl") include("loglikelihoods.jl") +include("submodel_macro.jl") end # module diff --git a/src/submodel_macro.jl b/src/submodel_macro.jl index fc18bcde0..dc75ed741 100644 --- a/src/submodel_macro.jl +++ b/src/submodel_macro.jl @@ -17,7 +17,7 @@ macro submodel(prefix, expr) $(esc(expr)), $(esc(:_varinfo)), $(esc(:_sampler)), - $(PrefixContext){$(esc(prefix))}($(esc(:_context))) + $(DynamicPPL).PrefixContext{$(QuoteNode(prefix))}($(esc(:_context))) ) end end From 52c70a5d813bb56cce899243be1e735f825a7d8a Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 11:41:13 +0100 Subject: [PATCH 04/17] Update src/submodel_macro.jl Co-authored-by: David Widmann --- src/submodel_macro.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/submodel_macro.jl b/src/submodel_macro.jl index dc75ed741..b49719907 100644 --- a/src/submodel_macro.jl +++ b/src/submodel_macro.jl @@ -13,11 +13,11 @@ end macro submodel(prefix, expr) return quote $(DynamicPPL)._evaluate( - $(esc(:_rng)), + $(esc(:__rng__)), $(esc(expr)), - $(esc(:_varinfo)), - $(esc(:_sampler)), - $(DynamicPPL).PrefixContext{$(QuoteNode(prefix))}($(esc(:_context))) + $(esc(:__varinfo__)), + $(esc(:__sampler__)), + $(DynamicPPL).PrefixContext{$(QuoteNode(prefix))}($(esc(:__context__))) ) end end From 634a2ffaedc37a4f0e4543c6ecbbb55e5f7a5238 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 11:41:18 +0100 Subject: [PATCH 05/17] Update src/submodel_macro.jl Co-authored-by: David Widmann --- src/submodel_macro.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/submodel_macro.jl b/src/submodel_macro.jl index b49719907..309c416ba 100644 --- a/src/submodel_macro.jl +++ b/src/submodel_macro.jl @@ -1,11 +1,11 @@ macro submodel(expr) return quote $(DynamicPPL)._evaluate( - $(esc(:_rng)), + $(esc(:__rng__)), $(esc(expr)), - $(esc(:_varinfo)), - $(esc(:_sampler)), - $(esc(:_context)) + $(esc(:__varinfo__)), + $(esc(:__sampler__)), + $(esc(:__context__)) ) end end From 267a24e2cc9ddc6bd903fc18e0d313bbe183811e Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 12:42:38 +0200 Subject: [PATCH 06/17] added recursive constructor for PrefixContext to avoid runtime overhead --- src/contexts.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/contexts.jl b/src/contexts.jl index 26f22cf32..c79d20955 100644 --- a/src/contexts.jl +++ b/src/contexts.jl @@ -59,6 +59,12 @@ struct PrefixContext{C, Prefix} <: AbstractContext end PrefixContext{Prefix}(ctx::AbstractContext) where {Prefix} = PrefixContext{typeof(ctx), Prefix}(ctx) +@generated function PrefixContext{PrefixInner}( + ctx::PrefixContext{<:Any, PrefixOuter} +) where {PrefixInner, PrefixOuter} + :(PrefixContext{$(QuoteNode(Symbol(PrefixOuter, ":", PrefixInner)))}(ctx.ctx)) +end + @generated function prefix(::PrefixContext{<:Any, Prefix}, vn::VarName{Sym}) where {Prefix, Sym} return :(VarName{$(QuoteNode(Symbol(Prefix, Symbol(":"), Sym)))}(vn.indexing)) end From ff539ce50e0fb3a073296a2865bf6a923ba28d53 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 12:43:21 +0200 Subject: [PATCH 07/17] warn is now false by default --- src/compiler.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler.jl b/src/compiler.jl index 39203f5ee..5bac0dd9c 100644 --- a/src/compiler.jl +++ b/src/compiler.jl @@ -43,7 +43,7 @@ isassumption(expr) = :(false) ################# """ - @model(expr[, warn = true]) + @model(expr[, warn = false]) Macro to specify a probabilistic model. @@ -62,7 +62,7 @@ end To generate a `Model`, call `model(xvalue)` or `model(xvalue, yvalue)`. """ -macro model(expr, warn=true) +macro model(expr, warn=false) # include `LineNumberNode` with information about the call site in the # generated function for easier debugging and interpretation of error messages esc(model(__module__, __source__, expr, warn)) From 2eb5eb438c1a2236337c62f78c83037b6c6d805b Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 12:46:14 +0200 Subject: [PATCH 08/17] removed unnecessary module-interpolation in submodel --- src/submodel_macro.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/submodel_macro.jl b/src/submodel_macro.jl index 309c416ba..aa6eeb10a 100644 --- a/src/submodel_macro.jl +++ b/src/submodel_macro.jl @@ -1,6 +1,6 @@ macro submodel(expr) return quote - $(DynamicPPL)._evaluate( + _evaluate( $(esc(:__rng__)), $(esc(expr)), $(esc(:__varinfo__)), @@ -12,12 +12,12 @@ end macro submodel(prefix, expr) return quote - $(DynamicPPL)._evaluate( + _evaluate( $(esc(:__rng__)), $(esc(expr)), $(esc(:__varinfo__)), $(esc(:__sampler__)), - $(DynamicPPL).PrefixContext{$(QuoteNode(prefix))}($(esc(:__context__))) + PrefixContext{$(QuoteNode(prefix))}($(esc(:__context__))) ) end end From 902d5273268d87e9e8e9a4e71775754be860c3bc Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 17:32:05 +0100 Subject: [PATCH 09/17] use quot instead of QuoteNode to allow interpolation in submodel Co-authored-by: David Widmann --- src/submodel_macro.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/submodel_macro.jl b/src/submodel_macro.jl index aa6eeb10a..abf144811 100644 --- a/src/submodel_macro.jl +++ b/src/submodel_macro.jl @@ -17,7 +17,7 @@ macro submodel(prefix, expr) $(esc(expr)), $(esc(:__varinfo__)), $(esc(:__sampler__)), - PrefixContext{$(QuoteNode(prefix))}($(esc(:__context__))) + PrefixContext{$(Meta.quot(prefix))}($(esc(:__context__))) ) end end From d05f080d61fa77e096959cd330524278039a6d13 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 17:33:30 +0100 Subject: [PATCH 10/17] change order of PrefixContext types Co-authored-by: David Widmann --- src/contexts.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contexts.jl b/src/contexts.jl index c79d20955..4fec79f8c 100644 --- a/src/contexts.jl +++ b/src/contexts.jl @@ -54,7 +54,7 @@ function MiniBatchContext(ctx = DefaultContext(); batch_size, npoints) end -struct PrefixContext{C, Prefix} <: AbstractContext +struct PrefixContext{Prefix,C} <: AbstractContext ctx::C end PrefixContext{Prefix}(ctx::AbstractContext) where {Prefix} = PrefixContext{typeof(ctx), Prefix}(ctx) From 13bb2599a27a8815e88c2d6e4ccb5c6a800f1d1e Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 18:40:29 +0200 Subject: [PATCH 11/17] change ordering type-parameters for PrefixContext --- src/contexts.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/contexts.jl b/src/contexts.jl index 4fec79f8c..fd70d1d8e 100644 --- a/src/contexts.jl +++ b/src/contexts.jl @@ -54,17 +54,17 @@ function MiniBatchContext(ctx = DefaultContext(); batch_size, npoints) end -struct PrefixContext{Prefix,C} <: AbstractContext +struct PrefixContext{Prefix, C} <: AbstractContext ctx::C end -PrefixContext{Prefix}(ctx::AbstractContext) where {Prefix} = PrefixContext{typeof(ctx), Prefix}(ctx) +PrefixContext{Prefix}(ctx::AbstractContext) where {Prefix} = PrefixContext{Prefix, typeof(ctx)}(ctx) @generated function PrefixContext{PrefixInner}( - ctx::PrefixContext{<:Any, PrefixOuter} + ctx::PrefixContext{PrefixOuter} ) where {PrefixInner, PrefixOuter} :(PrefixContext{$(QuoteNode(Symbol(PrefixOuter, ":", PrefixInner)))}(ctx.ctx)) end -@generated function prefix(::PrefixContext{<:Any, Prefix}, vn::VarName{Sym}) where {Prefix, Sym} +@generated function prefix(::PrefixContext{Prefix}, vn::VarName{Sym}) where {Prefix, Sym} return :(VarName{$(QuoteNode(Symbol(Prefix, Symbol(":"), Sym)))}(vn.indexing)) end From 16d4210f7dffb0254b8a634a8ac491ce95dbc1b5 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 25 Apr 2021 18:40:45 +0200 Subject: [PATCH 12/17] escape the prefix to allow non-constant prefices --- src/submodel_macro.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/submodel_macro.jl b/src/submodel_macro.jl index abf144811..267ec8933 100644 --- a/src/submodel_macro.jl +++ b/src/submodel_macro.jl @@ -17,7 +17,7 @@ macro submodel(prefix, expr) $(esc(expr)), $(esc(:__varinfo__)), $(esc(:__sampler__)), - PrefixContext{$(Meta.quot(prefix))}($(esc(:__context__))) + PrefixContext{$(esc(Meta.quot(prefix)))}($(esc(:__context__))) ) end end From 2c3ed9910560b38506de3bd750b6f9b478406850 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Mon, 26 Apr 2021 02:16:17 +0200 Subject: [PATCH 13/17] use if generated for PrefixContext to allow the compiler to decide --- src/contexts.jl | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/contexts.jl b/src/contexts.jl index fd70d1d8e..6871d279d 100644 --- a/src/contexts.jl +++ b/src/contexts.jl @@ -59,12 +59,22 @@ struct PrefixContext{Prefix, C} <: AbstractContext end PrefixContext{Prefix}(ctx::AbstractContext) where {Prefix} = PrefixContext{Prefix, typeof(ctx)}(ctx) -@generated function PrefixContext{PrefixInner}( +const _prefix_seperator = Symbol(".") + +function PrefixContext{PrefixInner}( ctx::PrefixContext{PrefixOuter} ) where {PrefixInner, PrefixOuter} - :(PrefixContext{$(QuoteNode(Symbol(PrefixOuter, ":", PrefixInner)))}(ctx.ctx)) + if @generated + :(PrefixContext{$(QuoteNode(Symbol(PrefixOuter, _prefix_seperator, PrefixInner)))}(ctx.ctx)) + else + PrefixContext{Symbol(PrefixOuter, _prefix_separator, PrefixInner)}(ctx.ctx) + end end -@generated function prefix(::PrefixContext{Prefix}, vn::VarName{Sym}) where {Prefix, Sym} - return :(VarName{$(QuoteNode(Symbol(Prefix, Symbol(":"), Sym)))}(vn.indexing)) +function prefix(::PrefixContext{Prefix}, vn::VarName{Sym}) where {Prefix, Sym} + if @generated + return :(VarName{$(QuoteNode(Symbol(Prefix, _prefix_seperator, Sym)))}(vn.indexing)) + else + VarName{Symbol(Prefix, _prefix_seperator, Sym)}(vn.indexing) + end end From e0bb44973146c2cc4a1442befdced15d1f49f945 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Mon, 26 Apr 2021 09:31:45 +0100 Subject: [PATCH 14/17] Update src/contexts.jl Co-authored-by: David Widmann --- src/contexts.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contexts.jl b/src/contexts.jl index 6871d279d..985de641a 100644 --- a/src/contexts.jl +++ b/src/contexts.jl @@ -59,7 +59,7 @@ struct PrefixContext{Prefix, C} <: AbstractContext end PrefixContext{Prefix}(ctx::AbstractContext) where {Prefix} = PrefixContext{Prefix, typeof(ctx)}(ctx) -const _prefix_seperator = Symbol(".") +const PREFIX_SEPARATOR = Symbol(".") function PrefixContext{PrefixInner}( ctx::PrefixContext{PrefixOuter} From d47772c98e3d18068cb3a7a339977b3677b51a29 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Mon, 26 Apr 2021 10:32:52 +0200 Subject: [PATCH 15/17] _prefix_separator is now named PREFIX_SEPARATOR --- src/contexts.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contexts.jl b/src/contexts.jl index 985de641a..0d7006bf0 100644 --- a/src/contexts.jl +++ b/src/contexts.jl @@ -67,7 +67,7 @@ function PrefixContext{PrefixInner}( if @generated :(PrefixContext{$(QuoteNode(Symbol(PrefixOuter, _prefix_seperator, PrefixInner)))}(ctx.ctx)) else - PrefixContext{Symbol(PrefixOuter, _prefix_separator, PrefixInner)}(ctx.ctx) + PrefixContext{Symbol(PrefixOuter, PREFIX_SEPARATOR, PrefixInner)}(ctx.ctx) end end @@ -75,6 +75,6 @@ function prefix(::PrefixContext{Prefix}, vn::VarName{Sym}) where {Prefix, Sym} if @generated return :(VarName{$(QuoteNode(Symbol(Prefix, _prefix_seperator, Sym)))}(vn.indexing)) else - VarName{Symbol(Prefix, _prefix_seperator, Sym)}(vn.indexing) + VarName{Symbol(Prefix, PREFIX_SEPARATOR, Sym)}(vn.indexing) end end From cdd2543b6a2ab0516240410d1e6faa28bad6238e Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Sun, 16 May 2021 05:11:57 +0200 Subject: [PATCH 16/17] added tests for submodel macro --- test/compiler.jl | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/test/compiler.jl b/test/compiler.jl index 73901dae7..841ccdef4 100644 --- a/test/compiler.jl +++ b/test/compiler.jl @@ -313,4 +313,105 @@ end end @test demo2()() == 42 end + + @testset "submodel" begin + # No prefix, 1 level. + @model function demo1(x) + x ~ Normal() + end; + @model function demo2(x, y) + @submodel demo1(x) + y ~ Uniform() + end; + # No observation. + m = demo2(missing, missing); + vi = VarInfo(m); + ks = keys(vi) + @test VarName(:x) ∈ ks + @test VarName(:y) ∈ ks + + # Observation in top-level. + m = demo2(missing, 1.0); + vi = VarInfo(m); + ks = keys(vi) + @test VarName(:x) ∈ ks + @test VarName(:y) ∉ ks + + # Observation in nested model. + m = demo2(1000.0, missing); + vi = VarInfo(m); + ks = keys(vi) + @test VarName(:x) ∉ ks + @test VarName(:y) ∈ ks + + # Observe all. + m = demo2(1000.0, 0.5); + vi = VarInfo(m); + ks = keys(vi) + @test isempty(ks) + + # Check values makes sense. + @model function demo2(x, y) + @submodel demo1(x) + y ~ Normal(x) + end; + m = demo2(1000.0, missing); + # Mean of `y` should be close to 1000. + @test abs(mean([VarInfo(m)[VarName(:y)] for i = 1:10]) - 1000) ≤ 10; + + # Prefixed submodels and usage of submodel return values. + @model function demo_return(x) + x ~ Normal() + return x + end; + + @model function demo_useval(x, y) + x1 = @submodel sub1 demo_return(x) + x2 = @submodel sub2 demo_return(y) + + z ~ Normal(x1 + x2 + 100, 1.0) + end; + m = demo_useval(missing, missing) + vi = VarInfo(m); + ks = keys(vi) + @test VarName(Symbol("sub1.x")) ∈ ks + @test VarName(Symbol("sub2.x")) ∈ ks + @test VarName(:z) ∈ ks + @test abs(mean([VarInfo(m)[VarName(:z)] for i = 1:10]) - 100) ≤ 10 + + # AR1 model. Dynamic prefixing. + @model function AR1(num_steps, α, μ, σ, ::Type{TV} = Vector{Float64}) where {TV} + η ~ MvNormal(num_steps, 1.0) + δ = sqrt(1 - α^2) + + x = TV(undef, num_steps) + x[1] = η[1] + @inbounds for t = 2:num_steps + x[t] = @. α * x[t - 1] + δ * η[t] + end + + return @. μ + σ * x + end + + @model function demo(y) + α ~ Uniform() + μ ~ Normal() + σ ~ truncated(Normal(), 0, Inf) + + num_steps = length(y[1]) + num_obs = length(y) + @inbounds for i = 1:num_obs + x = @submodel $(Symbol("ar1_$i")) AR1(num_steps, α, μ, σ) + y[i] ~ MvNormal(x, 0.1) + end + end; + + ys = [randn(10), randn(10)]; + m = demo(ys); + vi = VarInfo(m); + + for k in [:α, :μ, :σ, Symbol("ar1_1.η"), Symbol("ar1_2.η")] + @test VarName(k) ∈ keys(vi) + end + end end From 46cdcb153129c200a05918ceb41fc884e2bba86f Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Tue, 18 May 2021 14:25:57 +0200 Subject: [PATCH 17/17] version bump --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index e1a1fddac..201dd62d9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "DynamicPPL" uuid = "366bfd00-2699-11ea-058f-f148b4cae6d8" -version = "0.10.19" +version = "0.10.20" [deps] AbstractMCMC = "80f14c24-f653-4e6a-9b94-39d6b0f70001"