From 3baa9f65ca0ef005e7f9fded18dd5fd303c750f3 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Thu, 1 Apr 2021 09:56:19 +0200 Subject: [PATCH 1/9] removed unnecessary in args check --- src/compiler.jl | 57 +++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/src/compiler.jl b/src/compiler.jl index 73ae707c5..420790739 100644 --- a/src/compiler.jl +++ b/src/compiler.jl @@ -219,29 +219,20 @@ function generate_tilde(left, right, args) || throw(ArgumentError($DISTMSG)))] if left isa Symbol || left isa Expr - @gensym out vn inds + @gensym out vn inds isassumption push!(top, :($vn = $(varname(left))), :($inds = $(vinds(left)))) - # It can only be an observation if the LHS is an argument of the model - if vsym(left) in args - @gensym isassumption - return quote - $(top...) - $isassumption = $(DynamicPPL.isassumption(left)) - if $isassumption - $left = $(DynamicPPL.tilde_assume)( - _rng, _context, _sampler, $tmpright, $vn, $inds, _varinfo) - else - $(DynamicPPL.tilde_observe)( - _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) - end - end - end - return quote $(top...) - $left = $(DynamicPPL.tilde_assume)(_rng, _context, _sampler, $tmpright, $vn, - $inds, _varinfo) + $isassumption = $(DynamicPPL.isassumption(left)) + $left = if $isassumption + $(DynamicPPL.tilde_assume)( + _rng, _context, _sampler, $tmpright, $vn, $inds, _varinfo) + else + $(DynamicPPL.tilde_observe)( + _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) + $left + end end end @@ -264,29 +255,19 @@ function generate_dot_tilde(left, right, args) || throw(ArgumentError($DISTMSG)))] if left isa Symbol || left isa Expr - @gensym out vn inds + @gensym out vn inds isassumption push!(top, :($vn = $(varname(left))), :($inds = $(vinds(left)))) - # It can only be an observation if the LHS is an argument of the model - if vsym(left) in args - @gensym isassumption - return quote - $(top...) - $isassumption = $(DynamicPPL.isassumption(left)) - if $isassumption - $left .= $(DynamicPPL.dot_tilde_assume)( - _rng, _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) - else - $(DynamicPPL.dot_tilde_observe)( - _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) - end - end - end - return quote $(top...) - $left .= $(DynamicPPL.dot_tilde_assume)( - _rng, _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) + $isassumption = $(DynamicPPL.isassumption(left)) + if $isassumption + $left .= $(DynamicPPL.dot_tilde_assume)( + _rng, _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) + else + $(DynamicPPL.dot_tilde_observe)( + _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) + end end end From 823e751812c3e520c3facf1594342a43346d10dd Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Thu, 1 Apr 2021 10:02:46 +0200 Subject: [PATCH 2/9] drop carrying args around --- src/compiler.jl | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/compiler.jl b/src/compiler.jl index 420790739..41c67cc8b 100644 --- a/src/compiler.jl +++ b/src/compiler.jl @@ -72,7 +72,7 @@ function model(expr, linenumbernode, warn) # Generate main body modelinfo[:body] = generate_mainbody( - modelinfo[:modeldef][:body], modelinfo[:allargs_syms], warn + modelinfo[:modeldef][:body], warn ) return build_output(modelinfo, linenumbernode) @@ -155,7 +155,7 @@ function build_model_info(input_expr) end """ - generate_mainbody(expr, args, warn) + generate_mainbody(expr, warn) Generate the body of the main evaluation function from expression `expr` and arguments `args`. @@ -163,56 +163,58 @@ Generate the body of the main evaluation function from expression `expr` and arg If `warn` is true, a warning is displayed if internal variables are used in the model definition. """ -generate_mainbody(expr, args, warn) = generate_mainbody!(Symbol[], expr, args, warn) +generate_mainbody(expr, warn) = generate_mainbody!(Symbol[], expr, warn) -generate_mainbody!(found, x, args, warn) = x -function generate_mainbody!(found, sym::Symbol, args, warn) +generate_mainbody!(found, x, warn) = x +function generate_mainbody!(found, sym::Symbol, warn) if warn && sym in INTERNALNAMES && sym ∉ found @warn "you are using the internal variable `$(sym)`" push!(found, sym) end return sym end -function generate_mainbody!(found, expr::Expr, args, warn) +function generate_mainbody!(found, expr::Expr, warn) # Do not touch interpolated expressions expr.head === :$ && return expr.args[1] # Apply the `@.` macro first. if Meta.isexpr(expr, :macrocall) && length(expr.args) > 1 && expr.args[1] === Symbol("@__dot__") - return generate_mainbody!(found, Base.Broadcast.__dot__(expr.args[end]), args, warn) + return generate_mainbody!(found, Base.Broadcast.__dot__(expr.args[end]), warn) end # Modify dotted tilde operators. args_dottilde = getargs_dottilde(expr) if args_dottilde !== nothing L, R = args_dottilde - return generate_dot_tilde(generate_mainbody!(found, L, args, warn), - generate_mainbody!(found, R, args, warn), - args) |> Base.remove_linenums! + return generate_dot_tilde( + generate_mainbody!(found, L, warn), + generate_mainbody!(found, R, warn) + ) |> Base.remove_linenums! end # Modify tilde operators. args_tilde = getargs_tilde(expr) if args_tilde !== nothing L, R = args_tilde - return generate_tilde(generate_mainbody!(found, L, args, warn), - generate_mainbody!(found, R, args, warn), - args) |> Base.remove_linenums! + return generate_tilde( + generate_mainbody!(found, L, warn), + generate_mainbody!(found, R, warn) + ) |> Base.remove_linenums! end - return Expr(expr.head, map(x -> generate_mainbody!(found, x, args, warn), expr.args)...) + return Expr(expr.head, map(x -> generate_mainbody!(found, x, warn), expr.args)...) end """ - generate_tilde(left, right, args) + generate_tilde(left, right) Generate an `observe` expression for data variables and `assume` expression for parameter variables. """ -function generate_tilde(left, right, args) +function generate_tilde(left, right) @gensym tmpright top = [:($tmpright = $right), :($tmpright isa Union{$Distribution,AbstractVector{<:$Distribution}} @@ -244,11 +246,11 @@ function generate_tilde(left, right, args) end """ - generate_dot_tilde(left, right, args) + generate_dot_tilde(left, right) Generate the expression that replaces `left .~ right` in the model body. """ -function generate_dot_tilde(left, right, args) +function generate_dot_tilde(left, right) @gensym tmpright top = [:($tmpright = $right), :($tmpright isa Union{$Distribution,AbstractVector{<:$Distribution}} From e29ef2ee6c1578aed64c10cebac38d775f7c354e Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Thu, 1 Apr 2021 12:11:39 +0200 Subject: [PATCH 3/9] Update src/compiler.jl Co-authored-by: David Widmann --- src/compiler.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/compiler.jl b/src/compiler.jl index 41c67cc8b..9b83099e6 100644 --- a/src/compiler.jl +++ b/src/compiler.jl @@ -227,13 +227,12 @@ function generate_tilde(left, right) return quote $(top...) $isassumption = $(DynamicPPL.isassumption(left)) - $left = if $isassumption - $(DynamicPPL.tilde_assume)( + if $isassumption + $left = $(DynamicPPL.tilde_assume)( _rng, _context, _sampler, $tmpright, $vn, $inds, _varinfo) else $(DynamicPPL.tilde_observe)( _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) - $left end end end From 8aefe12b78ae590cff143cfd35aad23106d2c5c7 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Fri, 2 Apr 2021 12:50:34 +0200 Subject: [PATCH 4/9] using Val to improve efficiency --- src/compiler.jl | 20 ++++++++++++++------ src/varname.jl | 8 ++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/compiler.jl b/src/compiler.jl index 9b83099e6..c0dfface8 100644 --- a/src/compiler.jl +++ b/src/compiler.jl @@ -37,6 +37,14 @@ end # failsafe: a literal is never an assumption isassumption(expr) = :(false) +function isassumption(vn::VarName, model::Model) + !inargnames(vn, model) || inmissings(vn, model) +end + +function isassumption(vn::Val, model::Model) + !inargnames(vn, model) || inmissings(vn, model) +end + ################# # Main Compiler # ################# @@ -221,12 +229,12 @@ function generate_tilde(left, right) || throw(ArgumentError($DISTMSG)))] if left isa Symbol || left isa Expr - @gensym out vn inds isassumption - push!(top, :($vn = $(varname(left))), :($inds = $(vinds(left)))) + @gensym out vn sym inds isassumption + push!(top, :($vn = $(varname(left))), :($sym = $(QuoteNode(vsym(left)))), :($inds = $(vinds(left)))) return quote $(top...) - $isassumption = $(DynamicPPL.isassumption(left)) + $isassumption = $(DynamicPPL.isassumption)(Val($sym), _model) || $left === missing if $isassumption $left = $(DynamicPPL.tilde_assume)( _rng, _context, _sampler, $tmpright, $vn, $inds, _varinfo) @@ -256,12 +264,12 @@ function generate_dot_tilde(left, right) || throw(ArgumentError($DISTMSG)))] if left isa Symbol || left isa Expr - @gensym out vn inds isassumption - push!(top, :($vn = $(varname(left))), :($inds = $(vinds(left)))) + @gensym out vn sym inds isassumption + push!(top, :($vn = $(varname(left))), :($sym = $(QuoteNode(vsym(left)))), :($inds = $(vinds(left)))) return quote $(top...) - $isassumption = $(DynamicPPL.isassumption(left)) + $isassumption = $(DynamicPPL.isassumption)(Val($sym), _model) || $left === missing if $isassumption $left .= $(DynamicPPL.dot_tilde_assume)( _rng, _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) diff --git a/src/varname.jl b/src/varname.jl index f45b0b430..fd181abf0 100644 --- a/src/varname.jl +++ b/src/varname.jl @@ -9,6 +9,10 @@ Possibly existing indices of `varname` are neglected. return s in argnames end +@generated function inargnames(::Val{s}, ::Model{_F, argnames}) where {s, argnames, _F} + return s in argnames +end + """ inmissings(varname::VarName, model::Model) @@ -21,3 +25,7 @@ Possibly existing indices of `varname` are neglected. @generated function inmissings(::VarName{s}, ::Model{_F, _a, _T, missings}) where {s, missings, _F, _a, _T} return s in missings end + +@generated function inmissings(::Val{s}, ::Model{_F, _a, _T, missings}) where {s, missings, _F, _a, _T} + return s in missings +end From b993af000c1add0c30c8c93eb11aaed290a3671b Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Fri, 2 Apr 2021 12:58:47 +0200 Subject: [PATCH 5/9] expand isassumption as before --- src/compiler.jl | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/compiler.jl b/src/compiler.jl index c0dfface8..926050f48 100644 --- a/src/compiler.jl +++ b/src/compiler.jl @@ -18,13 +18,13 @@ Let `expr` be `:(x[1])`. It is an assumption in the following cases: When `expr` is not an expression or symbol (i.e., a literal), this expands to `false`. """ function isassumption(expr::Union{Symbol, Expr}) - vn = gensym(:vn) + sym = gensym(:sym) return quote - let $vn = $(varname(expr)) + let $sym = $(QuoteNode(vsym(expr))) # This branch should compile nicely in all cases except for partial missing data # For example, when `expr` is `:(x[i])` and `x isa Vector{Union{Missing, Float64}}` - if !$(DynamicPPL.inargnames)($vn, _model) || $(DynamicPPL.inmissings)($vn, _model) + if !$(DynamicPPL.inargnames)(Val($sym), _model) || $(DynamicPPL.inmissings)(Val($sym), _model) true else # Evaluate the LHS @@ -37,14 +37,6 @@ end # failsafe: a literal is never an assumption isassumption(expr) = :(false) -function isassumption(vn::VarName, model::Model) - !inargnames(vn, model) || inmissings(vn, model) -end - -function isassumption(vn::Val, model::Model) - !inargnames(vn, model) || inmissings(vn, model) -end - ################# # Main Compiler # ################# @@ -229,12 +221,12 @@ function generate_tilde(left, right) || throw(ArgumentError($DISTMSG)))] if left isa Symbol || left isa Expr - @gensym out vn sym inds isassumption - push!(top, :($vn = $(varname(left))), :($sym = $(QuoteNode(vsym(left)))), :($inds = $(vinds(left)))) + @gensym out vn inds isassumption + push!(top, :($vn = $(varname(left))), :($inds = $(vinds(left)))) return quote $(top...) - $isassumption = $(DynamicPPL.isassumption)(Val($sym), _model) || $left === missing + $isassumption = $(DynamicPPL.isassumption(left)) if $isassumption $left = $(DynamicPPL.tilde_assume)( _rng, _context, _sampler, $tmpright, $vn, $inds, _varinfo) @@ -264,12 +256,12 @@ function generate_dot_tilde(left, right) || throw(ArgumentError($DISTMSG)))] if left isa Symbol || left isa Expr - @gensym out vn sym inds isassumption - push!(top, :($vn = $(varname(left))), :($sym = $(QuoteNode(vsym(left)))), :($inds = $(vinds(left)))) + @gensym out vn inds isassumption + push!(top, :($vn = $(varname(left))), :($inds = $(vinds(left)))) return quote $(top...) - $isassumption = $(DynamicPPL.isassumption)(Val($sym), _model) || $left === missing + $isassumption = $(DynamicPPL.isassumption(left)) || $left === missing if $isassumption $left .= $(DynamicPPL.dot_tilde_assume)( _rng, _context, _sampler, $tmpright, $left, $vn, $inds, _varinfo) From 6925db70809121b6b02ca664518654cba171345b Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Fri, 2 Apr 2021 18:25:13 +0200 Subject: [PATCH 6/9] reverted changes to isassumption since @devmotion upgraded AbstractPPL --- src/compiler.jl | 6 +++--- src/varname.jl | 16 ---------------- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/compiler.jl b/src/compiler.jl index 926050f48..7d50f961f 100644 --- a/src/compiler.jl +++ b/src/compiler.jl @@ -18,13 +18,13 @@ Let `expr` be `:(x[1])`. It is an assumption in the following cases: When `expr` is not an expression or symbol (i.e., a literal), this expands to `false`. """ function isassumption(expr::Union{Symbol, Expr}) - sym = gensym(:sym) + vn = gensym(:vn) return quote - let $sym = $(QuoteNode(vsym(expr))) + let $vn = $(varname(expr)) # This branch should compile nicely in all cases except for partial missing data # For example, when `expr` is `:(x[i])` and `x isa Vector{Union{Missing, Float64}}` - if !$(DynamicPPL.inargnames)(Val($sym), _model) || $(DynamicPPL.inmissings)(Val($sym), _model) + if !$(DynamicPPL.inargnames)($vn, _model) || $(DynamicPPL.inmissings)($vn, _model) true else # Evaluate the LHS diff --git a/src/varname.jl b/src/varname.jl index fd181abf0..8681c3ecf 100644 --- a/src/varname.jl +++ b/src/varname.jl @@ -1,19 +1,3 @@ -""" - inargnames(varname::VarName, model::Model) - -Statically check whether the variable of name `varname` is an argument of the `model`. - -Possibly existing indices of `varname` are neglected. -""" -@generated function inargnames(::VarName{s}, ::Model{_F, argnames}) where {s, argnames, _F} - return s in argnames -end - -@generated function inargnames(::Val{s}, ::Model{_F, argnames}) where {s, argnames, _F} - return s in argnames -end - - """ inmissings(varname::VarName, model::Model) From 726fca7cd868f90ae681156082309e6a25b0c0db Mon Sep 17 00:00:00 2001 From: David Widmann Date: Mon, 5 Apr 2021 15:16:18 +0200 Subject: [PATCH 7/9] Run Turing integration test with Julia 1.5 --- .github/workflows/IntegrationTest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/IntegrationTest.yml b/.github/workflows/IntegrationTest.yml index a15cf6e8e..28ed3570a 100644 --- a/.github/workflows/IntegrationTest.yml +++ b/.github/workflows/IntegrationTest.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/checkout@v2 - uses: julia-actions/setup-julia@v1 with: - version: 1 + version: 1.5 arch: x64 - uses: julia-actions/julia-buildpkg@latest - name: Clone Downstream From 9eae757b69077d44341dc67370fe9b83a455b852 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Wed, 7 Apr 2021 20:27:54 +0200 Subject: [PATCH 8/9] Update src/varname.jl Co-authored-by: David Widmann --- src/varname.jl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/varname.jl b/src/varname.jl index 37e99f2fc..ca5823a8a 100644 --- a/src/varname.jl +++ b/src/varname.jl @@ -38,7 +38,3 @@ Possibly existing indices of `varname` are neglected. @generated function inmissings(::VarName{s}, ::Model{_F, _a, _T, missings}) where {s, missings, _F, _a, _T} return s in missings end - -@generated function inmissings(::Val{s}, ::Model{_F, _a, _T, missings}) where {s, missings, _F, _a, _T} - return s in missings -end From 529d80029085c4435b30ec0a58f116ca653ad2b2 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Thu, 8 Apr 2021 01:11:06 +0200 Subject: [PATCH 9/9] Update Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 4b5926753..ec9ef4e96 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "DynamicPPL" uuid = "366bfd00-2699-11ea-058f-f148b4cae6d8" -version = "0.10.11" +version = "0.10.12" [deps] AbstractMCMC = "80f14c24-f653-4e6a-9b94-39d6b0f70001"