Skip to content

Commit 3dc742a

Browse files
authored
Merge branch 'master' into sunxd/move_predict
2 parents fcd7c3d + 1110d30 commit 3dc742a

File tree

15 files changed

+1311
-1341
lines changed

15 files changed

+1311
-1341
lines changed

.github/workflows/CI.yml

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,53 @@ permissions:
1919

2020
jobs:
2121
test:
22-
runs-on: ${{ matrix.os }}
22+
runs-on: ${{ matrix.runner.os }}
2323
strategy:
2424
matrix:
25-
version:
26-
- 'min' # minimum supported version
27-
- '1' # current stable version
28-
os:
29-
- ubuntu-latest
30-
arch:
31-
- x64
32-
num_threads:
33-
- 1
34-
- 2
35-
include:
25+
runner:
26+
# Current stable version
27+
- version: '1'
28+
os: ubuntu-latest
29+
arch: x64
30+
num_threads: 2
31+
# Minimum supported version
32+
- version: 'min'
33+
os: ubuntu-latest
34+
arch: x64
35+
num_threads: 2
36+
# Single-threaded
37+
- version: '1'
38+
os: ubuntu-latest
39+
arch: x64
40+
num_threads: 1
41+
# Minimum supported version, single-threaded
42+
- version: 'min'
43+
os: ubuntu-latest
44+
arch: x64
45+
num_threads: 1
46+
# x86
3647
- version: '1'
3748
os: ubuntu-latest
3849
arch: x86
3950
num_threads: 2
51+
# Windows
4052
- version: '1'
4153
os: windows-latest
4254
arch: x64
4355
num_threads: 2
56+
# macOS
4457
- version: '1'
45-
os: macOS-latest
46-
arch: x64
58+
os: macos-latest
59+
arch: aarch64
4760
num_threads: 2
61+
4862
steps:
4963
- uses: actions/checkout@v4
5064

5165
- uses: julia-actions/setup-julia@v2
5266
with:
53-
version: ${{ matrix.version }}
54-
arch: ${{ matrix.arch }}
67+
version: ${{ matrix.runner.version }}
68+
arch: ${{ matrix.runner.arch }}
5569

5670
- uses: julia-actions/cache@v2
5771

@@ -60,7 +74,7 @@ jobs:
6074
- uses: julia-actions/julia-runtest@v1
6175
env:
6276
GROUP: All
63-
JULIA_NUM_THREADS: ${{ matrix.num_threads }}
77+
JULIA_NUM_THREADS: ${{ matrix.runner.num_threads }}
6478

6579
- uses: julia-actions/julia-processcoverage@v1
6680

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "DynamicPPL"
22
uuid = "366bfd00-2699-11ea-058f-f148b4cae6d8"
3-
version = "0.30.5"
3+
version = "0.30.6"
44

55
[deps]
66
ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b"

src/context_implementations.jl

Lines changed: 10 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -77,49 +77,11 @@ function tilde_assume(
7777
return tilde_assume(rng, childcontext(context), args...)
7878
end
7979

80-
function tilde_assume(context::PriorContext{<:NamedTuple}, right, vn, vi)
81-
if haskey(context.vars, getsym(vn))
82-
vi = setindex!!(vi, tovec(get(context.vars, vn)), vn)
83-
settrans!!(vi, false, vn)
84-
end
85-
return tilde_assume(PriorContext(), right, vn, vi)
86-
end
87-
function tilde_assume(
88-
rng::Random.AbstractRNG, context::PriorContext{<:NamedTuple}, sampler, right, vn, vi
89-
)
90-
if haskey(context.vars, getsym(vn))
91-
vi = setindex!!(vi, tovec(get(context.vars, vn)), vn)
92-
settrans!!(vi, false, vn)
93-
end
94-
return tilde_assume(rng, PriorContext(), sampler, right, vn, vi)
95-
end
96-
97-
function tilde_assume(context::LikelihoodContext{<:NamedTuple}, right, vn, vi)
98-
if haskey(context.vars, getsym(vn))
99-
vi = setindex!!(vi, tovec(get(context.vars, vn)), vn)
100-
settrans!!(vi, false, vn)
101-
end
102-
return tilde_assume(LikelihoodContext(), right, vn, vi)
103-
end
104-
function tilde_assume(
105-
rng::Random.AbstractRNG,
106-
context::LikelihoodContext{<:NamedTuple},
107-
sampler,
108-
right,
109-
vn,
110-
vi,
111-
)
112-
if haskey(context.vars, getsym(vn))
113-
vi = setindex!!(vi, tovec(get(context.vars, vn)), vn)
114-
settrans!!(vi, false, vn)
115-
end
116-
return tilde_assume(rng, LikelihoodContext(), sampler, right, vn, vi)
117-
end
11880
function tilde_assume(::LikelihoodContext, right, vn, vi)
119-
return assume(NoDist(right), vn, vi)
81+
return assume(nodist(right), vn, vi)
12082
end
12183
function tilde_assume(rng::Random.AbstractRNG, ::LikelihoodContext, sampler, right, vn, vi)
122-
return assume(rng, sampler, NoDist(right), vn, vi)
84+
return assume(rng, sampler, nodist(right), vn, vi)
12385
end
12486

12587
function tilde_assume(context::PrefixContext, right, vn, vi)
@@ -257,7 +219,7 @@ function assume(
257219
else
258220
r = init(rng, dist, sampler)
259221
if istrans(vi)
260-
f = to_linked_internal_transform(vi, dist)
222+
f = to_linked_internal_transform(vi, vn, dist)
261223
push!!(vi, vn, f(r), dist, sampler)
262224
# By default `push!!` sets the transformed flag to `false`.
263225
settrans!!(vi, true, vn)
@@ -328,37 +290,6 @@ function dot_tilde_assume(
328290
end
329291

330292
# `LikelihoodContext`
331-
function dot_tilde_assume(context::LikelihoodContext{<:NamedTuple}, right, left, vn, vi)
332-
return if haskey(context.vars, getsym(vn))
333-
var = get(context.vars, vn)
334-
_right, _left, _vns = unwrap_right_left_vns(right, var, vn)
335-
set_val!(vi, _vns, _right, _left)
336-
settrans!!.((vi,), false, _vns)
337-
dot_tilde_assume(LikelihoodContext(), _right, _left, _vns, vi)
338-
else
339-
dot_tilde_assume(LikelihoodContext(), right, left, vn, vi)
340-
end
341-
end
342-
function dot_tilde_assume(
343-
rng::Random.AbstractRNG,
344-
context::LikelihoodContext{<:NamedTuple},
345-
sampler,
346-
right,
347-
left,
348-
vn,
349-
vi,
350-
)
351-
return if haskey(context.vars, getsym(vn))
352-
var = get(context.vars, vn)
353-
_right, _left, _vns = unwrap_right_left_vns(right, var, vn)
354-
set_val!(vi, _vns, _right, _left)
355-
settrans!!.((vi,), false, _vns)
356-
dot_tilde_assume(rng, LikelihoodContext(), sampler, _right, _left, _vns, vi)
357-
else
358-
dot_tilde_assume(rng, LikelihoodContext(), sampler, right, left, vn, vi)
359-
end
360-
end
361-
362293
function dot_tilde_assume(context::LikelihoodContext, right, left, vn, vi)
363294
return dot_assume(nodist(right), left, vn, vi)
364295
end
@@ -368,46 +299,16 @@ function dot_tilde_assume(
368299
return dot_assume(rng, sampler, nodist(right), vn, left, vi)
369300
end
370301

371-
# `PriorContext`
372-
function dot_tilde_assume(context::PriorContext{<:NamedTuple}, right, left, vn, vi)
373-
return if haskey(context.vars, getsym(vn))
374-
var = get(context.vars, vn)
375-
_right, _left, _vns = unwrap_right_left_vns(right, var, vn)
376-
set_val!(vi, _vns, _right, _left)
377-
settrans!!.((vi,), false, _vns)
378-
dot_tilde_assume(PriorContext(), _right, _left, _vns, vi)
379-
else
380-
dot_tilde_assume(PriorContext(), right, left, vn, vi)
381-
end
382-
end
383-
function dot_tilde_assume(
384-
rng::Random.AbstractRNG,
385-
context::PriorContext{<:NamedTuple},
386-
sampler,
387-
right,
388-
left,
389-
vn,
390-
vi,
391-
)
392-
return if haskey(context.vars, getsym(vn))
393-
var = get(context.vars, vn)
394-
_right, _left, _vns = unwrap_right_left_vns(right, var, vn)
395-
set_val!(vi, _vns, _right, _left)
396-
settrans!!.((vi,), false, _vns)
397-
dot_tilde_assume(rng, PriorContext(), sampler, _right, _left, _vns, vi)
398-
else
399-
dot_tilde_assume(rng, PriorContext(), sampler, right, left, vn, vi)
400-
end
401-
end
402-
403302
# `PrefixContext`
404303
function dot_tilde_assume(context::PrefixContext, right, left, vn, vi)
405-
return dot_tilde_assume(context.context, right, prefix.(Ref(context), vn), vi)
304+
return dot_tilde_assume(context.context, right, left, prefix.(Ref(context), vn), vi)
406305
end
407306

408-
function dot_tilde_assume(rng, context::PrefixContext, sampler, right, left, vn, vi)
307+
function dot_tilde_assume(
308+
rng::Random.AbstractRNG, context::PrefixContext, sampler, right, left, vn, vi
309+
)
409310
return dot_tilde_assume(
410-
rng, context.context, sampler, right, prefix.(Ref(context), vn), vi
311+
rng, context.context, sampler, right, left, prefix.(Ref(context), vn), vi
411312
)
412313
end
413314

@@ -500,7 +401,7 @@ end
500401
# HACK: These methods are only used in the `get_and_set_val!` methods below.
501402
# FIXME: Remove these.
502403
function _link_broadcast_new(vi, vn, dist, r)
503-
b = to_linked_internal_transform(vi, dist)
404+
b = to_linked_internal_transform(vi, vn, dist)
504405
return b(r)
505406
end
506407

@@ -591,7 +492,7 @@ function get_and_set_val!(
591492
push!!.((vi,), vns, _link_broadcast_new.((vi,), vns, dists, r), dists, (spl,))
592493
# NOTE: Need to add the correction.
593494
# FIXME: This is not great.
594-
acclogp_assume!!(vi, sum(logabsdetjac.(link_transform.(dists), r)))
495+
acclogp!!(vi, sum(logabsdetjac.(link_transform.(dists), r)))
595496
# `push!!` sets the trans-flag to `false` by default.
596497
settrans!!.((vi,), true, vns)
597498
else

src/contexts.jl

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ DefaultContext()
5353
julia> ctx_prior = DynamicPPL.setchildcontext(ctx, PriorContext()); # only compute the logprior
5454
5555
julia> DynamicPPL.childcontext(ctx_prior)
56-
PriorContext{Nothing}(nothing)
56+
PriorContext()
5757
```
5858
"""
5959
setchildcontext
@@ -97,7 +97,7 @@ ParentContext(ParentContext(DefaultContext()))
9797
9898
julia> # Replace the leaf context with another leaf.
9999
leafcontext(setleafcontext(ctx, PriorContext()))
100-
PriorContext{Nothing}(nothing)
100+
PriorContext()
101101
102102
julia> # Append another parent context.
103103
setleafcontext(ctx, ParentContext(DefaultContext()))
@@ -195,32 +195,19 @@ struct DefaultContext <: AbstractContext end
195195
NodeTrait(context::DefaultContext) = IsLeaf()
196196

197197
"""
198-
struct PriorContext{Tvars} <: AbstractContext
199-
vars::Tvars
200-
end
198+
PriorContext <: AbstractContext
201199
202-
The `PriorContext` enables the computation of the log prior of the parameters `vars` when
203-
running the model.
200+
A leaf context resulting in the exclusion of likelihood terms when running the model.
204201
"""
205-
struct PriorContext{Tvars} <: AbstractContext
206-
vars::Tvars
207-
end
208-
PriorContext() = PriorContext(nothing)
202+
struct PriorContext <: AbstractContext end
209203
NodeTrait(context::PriorContext) = IsLeaf()
210204

211205
"""
212-
struct LikelihoodContext{Tvars} <: AbstractContext
213-
vars::Tvars
214-
end
206+
LikelihoodContext <: AbstractContext
215207
216-
The `LikelihoodContext` enables the computation of the log likelihood of the parameters when
217-
running the model. `vars` can be used to evaluate the log likelihood for specific values
218-
of the model's parameters. If `vars` is `nothing`, the parameter values inside the `VarInfo` will be used by default.
208+
A leaf context resulting in the exclusion of prior terms when running the model.
219209
"""
220-
struct LikelihoodContext{Tvars} <: AbstractContext
221-
vars::Tvars
222-
end
223-
LikelihoodContext() = LikelihoodContext(nothing)
210+
struct LikelihoodContext <: AbstractContext end
224211
NodeTrait(context::LikelihoodContext) = IsLeaf()
225212

226213
"""

src/debug_utils.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,9 @@ function DynamicPPL.tilde_assume(context::DebugContext, right, vn, vi)
332332
record_post_tilde_assume!(context, vn, right, value, logp, vi)
333333
return value, logp, vi
334334
end
335-
function DynamicPPL.tilde_assume(rng, context::DebugContext, sampler, right, vn, vi)
335+
function DynamicPPL.tilde_assume(
336+
rng::Random.AbstractRNG, context::DebugContext, sampler, right, vn, vi
337+
)
336338
record_pre_tilde_assume!(context, vn, right, vi)
337339
value, logp, vi = DynamicPPL.tilde_assume(
338340
rng, childcontext(context), sampler, right, vn, vi
@@ -425,7 +427,7 @@ function DynamicPPL.dot_tilde_assume(context::DebugContext, right, left, vn, vi)
425427
end
426428

427429
function DynamicPPL.dot_tilde_assume(
428-
rng, context::DebugContext, sampler, right, left, vn, vi
430+
rng::Random.AbstractRNG, context::DebugContext, sampler, right, left, vn, vi
429431
)
430432
record_pre_dot_tilde_assume!(context, vn, left, right, vi)
431433
value, logp, vi = DynamicPPL.dot_tilde_assume(

src/distribution_wrappers.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ Base.length(dist::NoDist) = Base.length(dist.dist)
4242
Base.size(dist::NoDist) = Base.size(dist.dist)
4343

4444
Distributions.rand(rng::Random.AbstractRNG, d::NoDist) = rand(rng, d.dist)
45+
# NOTE(torfjelde): Need this to avoid stack overflow.
46+
function Distributions.rand!(
47+
rng::Random.AbstractRNG,
48+
d::NoDist{Distributions.ArrayLikeVariate{N}},
49+
x::AbstractArray{<:Real,N},
50+
) where {N}
51+
return Distributions.rand!(rng, d.dist, x)
52+
end
4553
Distributions.logpdf(d::NoDist{<:Univariate}, ::Real) = 0
4654
Distributions.logpdf(d::NoDist{<:Multivariate}, ::AbstractVector{<:Real}) = 0
4755
function Distributions.logpdf(d::NoDist{<:Multivariate}, x::AbstractMatrix{<:Real})

0 commit comments

Comments
 (0)