Skip to content

Commit 8e02b43

Browse files
committed
Remove ModelGen
1 parent 700ae06 commit 8e02b43

File tree

5 files changed

+114
-163
lines changed

5 files changed

+114
-163
lines changed

src/DynamicPPL.jl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,20 @@ export AbstractVarInfo,
5151
inspace,
5252
subsumes,
5353
# Compiler
54-
ModelGen,
5554
@model,
5655
@varname,
5756
# Utilities
5857
vectorize,
5958
reconstruct,
6059
reconstruct!,
6160
Sample,
62-
Chain,
6361
init,
6462
vectorize,
6563
set_resume!,
6664
# Model
67-
ModelGen,
6865
Model,
6966
getmissings,
7067
getargnames,
71-
getdefaults,
72-
getgenerator,
7368
# Samplers
7469
Sampler,
7570
SampleFromPrior,

src/compiler.jl

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ function build_output(model_info)
330330
# Where parameters
331331
whereparams = model_info[:whereparams]
332332
# Model generator name
333-
model_gen = model_info[:name]
333+
model = model_info[:name]
334334
# Main body of the model
335335
main_body = model_info[:main_body]
336336

@@ -340,26 +340,26 @@ function build_output(model_info)
340340
:($var = $(DynamicPPL.matchingvalue)(_sampler, _varinfo, _model.args.$var)))
341341
end
342342

343-
@gensym(evaluator, generator)
344-
generator_kw_form = isempty(args) ? () : (:($generator(;$(args...)) = $generator($(arg_syms...))),)
345-
model_gen_constructor = :($(DynamicPPL.ModelGen){$(Tuple(arg_syms))}($generator, $defaults_nt))
343+
model_kwform = isempty(args) ? () : (:($model(;$(args...)) = $model($(arg_syms...))),)
344+
@gensym(evaluator)
346345

347346
return quote
348-
function $evaluator(
349-
_rng::$(Random.AbstractRNG),
350-
_model::$(DynamicPPL.Model),
351-
_varinfo::$(DynamicPPL.AbstractVarInfo),
352-
_sampler::$(DynamicPPL.AbstractSampler),
353-
_context::$(DynamicPPL.AbstractContext),
354-
)
355-
$unwrap_data_expr
356-
$main_body
347+
$(Base).@__doc__ function $model($(args...))
348+
$evaluator = let
349+
function (
350+
_rng::$(Random.AbstractRNG),
351+
_model::$(DynamicPPL.Model),
352+
_varinfo::$(DynamicPPL.AbstractVarInfo),
353+
_sampler::$(DynamicPPL.AbstractSampler),
354+
_context::$(DynamicPPL.AbstractContext),
355+
)
356+
$unwrap_data_expr
357+
$main_body
358+
end
359+
end
360+
return $(DynamicPPL.Model)($evaluator, $args_nt, $defaults_nt)
357361
end
358-
359-
$generator($(args...)) = $(DynamicPPL.Model)($evaluator, $args_nt, $model_gen_constructor)
360-
$(generator_kw_form...)
361-
362-
$(Base).@__doc__ $model_gen = $model_gen_constructor
362+
$(model_kwform...)
363363
end
364364
end
365365

src/model.jl

Lines changed: 40 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,70 @@
11
"""
2-
struct ModelGen{G, defaultnames, Tdefaults}
3-
generator::G
4-
defaults::Tdefaults
5-
end
6-
7-
A `ModelGen` struct with model generator function of type `G`, and default arguments `defaultnames`
8-
with values `Tdefaults`.
9-
"""
10-
struct ModelGen{G, argnames, defaultnames, Tdefaults}
11-
generator::G
12-
defaults::NamedTuple{defaultnames, Tdefaults}
13-
14-
function ModelGen{argnames}(
15-
generator::G,
16-
defaults::NamedTuple{defaultnames, Tdefaults}
17-
) where {G, argnames, defaultnames, Tdefaults}
18-
return new{G, argnames, defaultnames, Tdefaults}(generator, defaults)
2+
struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults}
3+
f::F
4+
args::NamedTuple{argnames,Targs}
5+
defaults::NamedTuple{defaultnames,Tdefaults}
196
end
20-
end
21-
22-
(m::ModelGen)(args...; kwargs...) = m.generator(args...; kwargs...)
23-
24-
25-
"""
26-
getdefaults(modelgen::ModelGen)
27-
28-
Get a named tuple of the default argument values defined for a model defined by a generating function.
29-
"""
30-
getdefaults(modelgen::ModelGen) = modelgen.defaults
31-
32-
"""
33-
getargnames(modelgen::ModelGen)
34-
35-
Get a tuple of the argument names of the `modelgen`.
36-
"""
37-
getargnames(model::ModelGen{_G, argnames}) where {argnames, _G} = argnames
387
8+
A `Model` struct with model evaluation function of type `F`, arguments of names `argnames`
9+
types `Targs`, default arguments of names `defaultnames` with types `Tdefaults`, and missing
10+
arguments `missings`.
3911
12+
Here `argnames`, `defaultargnames`, and `missings` are tuples of symbols, e.g. `(:a, :b)`.
4013
41-
"""
42-
struct Model{F, argnames, Targs, missings}
43-
f::F
44-
args::NamedTuple{argnames, Targs}
45-
modelgen::Tgen
46-
end
14+
An argument with a type of `Missing` will be in `missings` by default. However, in
15+
non-traditional use-cases `missings` can be defined differently. All variables in `missings`
16+
are treated as random variables rather than observations.
4717
48-
A `Model` struct with model evaluation function of type `F`, arguments names `argnames`, arguments
49-
types `Targs`, missing arguments `missings`, and corresponding model generator. `argnames` and
50-
`missings` are tuples of symbols, e.g. `(:a, :b)`. An argument with a type of `Missing` will be in
51-
`missings` by default. However, in non-traditional use-cases `missings` can be defined differently.
52-
All variables in `missings` are treated as random variables rather than observations.
18+
The default arguments are used internally when constructing instances of the same model with
19+
different arguments.
5320
54-
# Example
21+
# Examples
5522
5623
```julia
5724
julia> Model(f, (x = 1.0, y = 2.0))
58-
Model{typeof(f),(),(:x, :y),Tuple{Float64,Float64}}((x = 1.0, y = 2.0))
25+
Model{typeof(f),(:x, :y),(),(),Tuple{Float64,Float64},Tuple{}}(f, (x = 1.0, y = 2.0), NamedTuple())
26+
27+
julia> Model(f, (x = 1.0, y = 2.0), (x = 42,))
28+
Model{typeof(f),(:x, :y),(:x,),(),Tuple{Float64,Float64},Tuple{Int64}}(f, (x = 1.0, y = 2.0), (x = 42,))
5929
60-
julia> Model{(:y,)}(f, (x = 1.0, y = 2.0))
61-
Model{typeof(f),(:y,),(:x, :y),Tuple{Float64,Float64}}((x = 1.0, y = 2.0))
30+
julia> Model{(:y,)}(f, (x = 1.0, y = 2.0), (x = 42,))
31+
Model{typeof(f),(:x, :y),(:x,),(:y,),Tuple{Float64,Float64},Tuple{Int64}}(f, (x = 1.0, y = 2.0), (x = 42,))
6232
```
6333
"""
64-
struct Model{F, argnames, Targs, missings, Tgen} <: AbstractModel
34+
struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults} <: AbstractModel
6535
f::F
66-
args::NamedTuple{argnames, Targs}
67-
modelgen::Tgen
36+
args::NamedTuple{argnames,Targs}
37+
defaults::NamedTuple{defaultnames,Tdefaults}
6838

6939
"""
70-
Model{missings}(f, args::NamedTuple, modelgen::ModelGen)
40+
Model{missings}(f, args::NamedTuple, defaults::NamedTuple)
7141
72-
Create a model with evalutation function `f` and missing arguments overwritten by `missings`.
42+
Create a model with evaluation function `f` and missing arguments overwritten by `missings`.
7343
"""
7444
function Model{missings}(
7545
f::F,
76-
args::NamedTuple{argnames, Targs},
77-
modelgen::Tgen
78-
) where {missings, F, argnames, Targs, Tgen<:ModelGen}
79-
return new{F, argnames, Targs, missings, Tgen}(f, args, modelgen)
46+
args::NamedTuple{argnames,Targs},
47+
defaults::NamedTuple{defaultnames,Tdefaults},
48+
) where {missings,F,argnames,Targs,defaultnames,Tdefaults}
49+
return new{F,argnames,defaultnames,missings,Targs,Tdefaults}(f, args, defaults)
8050
end
8151
end
8252

8353
"""
84-
Model(f, args::NamedTuple, modelgen::ModelGen)
54+
Model(f, args::NamedTuple[, defaults::NamedTuple = ()])
8555
86-
Create a model with evalutation function `f` and missing arguments deduced from `args`.
56+
Create a model with evaluation function `f` and missing arguments deduced from `args`.
57+
58+
Default arguments `defaults` are used internally when constructing instances of the same
59+
model with different arguments.
8760
"""
8861
@generated function Model(
8962
f::F,
90-
args::NamedTuple{argnames, Targs},
91-
modelgen::ModelGen{_G, argnames}
92-
) where {F, argnames, Targs, _G}
63+
args::NamedTuple{argnames,Targs},
64+
defaults::NamedTuple = NamedTuple(),
65+
) where {F,argnames,Targs}
9366
missings = Tuple(name for (name, typ) in zip(argnames, Targs.types) if typ <: Missing)
94-
return :(Model{$missings}(f, args, modelgen))
95-
end
96-
97-
98-
"""
99-
Model{missings}(modelgen::ModelGen, args::NamedTuple)
100-
101-
Create a copy of the model described by `modelgen(args...)`, with missing arguments
102-
overwritten by `missings`.
103-
"""
104-
function Model{missings}(
105-
modelgen::ModelGen,
106-
args::NamedTuple{argnames, Targs}
107-
) where {missings, argnames, Targs}
108-
model = modelgen(args...)
109-
return Model{missings}(model.f, args, modelgen)
67+
return :(Model{$missings}(f, args, defaults))
11068
end
11169

11270
"""
@@ -184,27 +142,19 @@ end
184142
185143
Get a tuple of the argument names of the `model`.
186144
"""
187-
getargnames(model::Model{_F, argnames}) where {argnames, _F} = argnames
145+
getargnames(model::Model{_F,argnames}) where {argnames,_F} = argnames
188146

189147

190148
"""
191149
getmissings(model::Model)
192150
193151
Get a tuple of the names of the missing arguments of the `model`.
194152
"""
195-
getmissings(model::Model{_F, _a, _T, missings}) where {missings, _F, _a, _T} = missings
153+
getmissings(model::Model{_F,_a,_d,missings}) where {missings,_F,_a,_d} = missings
196154

197155
getmissing(model::Model) = getmissings(model)
198156
@deprecate getmissing(model) getmissings(model)
199157

200-
201-
"""
202-
getgenerator(model::Model)
203-
204-
Get the model generator associated with `model`.
205-
"""
206-
getgenerator(model::Model) = model.modelgen
207-
208158
"""
209159
logjoint(model::Model, varinfo::AbstractVarInfo)
210160

0 commit comments

Comments
 (0)