Skip to content

Commit e2584c7

Browse files
bors[bot]devmotion
andauthored
Merge #113
113: Add convenience functions r=devmotion a=devmotion Fixes #112. Co-authored-by: David Widmann <[email protected]>
2 parents 6b4be6b + d1a482a commit e2584c7

File tree

5 files changed

+76
-2
lines changed

5 files changed

+76
-2
lines changed

src/DynamicPPL.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,14 @@ export AbstractVarInfo,
9090
NoDist,
9191
# Prob macros
9292
@prob_str,
93-
@logprob_str
93+
@logprob_str,
94+
# Convenience functions
95+
logprior,
96+
logjoint
97+
98+
# Reexport
99+
using Distributions: loglikelihood
100+
export loglikelihood
94101

95102
const DEBUG = Bool(parse(Int, get(ENV, "DEBUG_DYNAMICPPL", "0")))
96103

src/model.jl

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,39 @@ getmissing(model::Model) = getmissings(model)
183183
Get the model generator associated with `model`.
184184
"""
185185
getgenerator(model::Model) = model.modelgen
186+
187+
"""
188+
logjoint(model::Model, varinfo::AbstractVarInfo)
189+
190+
Return the log joint probability of variables `varinfo` for the probabilistic `model`.
191+
192+
See [`logjoint`](@ref) and [`loglikelihood`](@ref).
193+
"""
194+
function logjoint(model::Model, varinfo::AbstractVarInfo)
195+
model(varinfo, SampleFromPrior(), DefaultContext())
196+
return getlogp(varinfo)
197+
end
198+
199+
"""
200+
logprior(model::Model, varinfo::AbstractVarInfo)
201+
202+
Return the log prior probability of variables `varinfo` for the probabilistic `model`.
203+
204+
See also [`logjoint`](@ref) and [`loglikelihood`](@ref).
205+
"""
206+
function logprior(model::Model, varinfo::AbstractVarInfo)
207+
model(varinfo, SampleFromPrior(), PriorContext())
208+
return getlogp(varinfo)
209+
end
210+
211+
"""
212+
loglikelihood(model::Model, varinfo::AbstractVarInfo)
213+
214+
Return the log likelihood of variables `varinfo` for the probabilistic `model`.
215+
216+
See also [`logjoint`](@ref) and [`logprior`](@ref).
217+
"""
218+
function Distributions.loglikelihood(model::Model, varinfo::AbstractVarInfo)
219+
model(varinfo, SampleFromPrior(), LikelihoodContext())
220+
return getlogp(varinfo)
221+
end

src/prob_macro.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ end
175175

176176
warn_msg(arg) = "Argument $arg is not defined. A value of `nothing` is used."
177177

178-
function loglikelihood(
178+
function Distributions.loglikelihood(
179179
left::NamedTuple,
180180
right::NamedTuple,
181181
modelgen::ModelGen,

test/model.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
Random.seed!(1234)
2+
3+
@testset "model.jl" begin
4+
@testset "convenience functions" begin
5+
model = gdemo_default
6+
7+
# sample from model and extract variables
8+
vi = VarInfo(model)
9+
model(vi, SampleFromPrior())
10+
s = vi[@varname(s)]
11+
m = vi[@varname(m)]
12+
13+
# extract log pdf of variable object
14+
lp = getlogp(vi)
15+
16+
# log prior probability
17+
lprior = logprior(model, vi)
18+
@test lprior logpdf(InverseGamma(2, 3), s) + logpdf(Normal(0, sqrt(s)), m)
19+
20+
# log likelihood
21+
llikelihood = loglikelihood(model, vi)
22+
@test llikelihood loglikelihood(Normal(m, sqrt(s)), [1.5, 2.0])
23+
24+
# log joint probability
25+
ljoint = logjoint(model, vi)
26+
@test ljoint lprior + llikelihood
27+
@test ljoint lp
28+
end
29+
end

test/runtests.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ using .Turing
1313

1414
turnprogress(false)
1515

16+
include("test_utils/AllUtils.jl")
1617
include("test_util.jl")
1718

1819
@testset "DynamicPPL.jl" begin
1920
include("utils.jl")
2021
include("compiler.jl")
2122
include("varinfo.jl")
23+
include("model.jl")
2224
include("sampler.jl")
2325
include("prob_macro.jl")
2426
include("independence.jl")

0 commit comments

Comments
 (0)