|
1 | 1 | """
|
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} |
19 | 6 | 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 |
38 | 7 |
|
| 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`. |
39 | 11 |
|
| 12 | +Here `argnames`, `defaultargnames`, and `missings` are tuples of symbols, e.g. `(:a, :b)`. |
40 | 13 |
|
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. |
47 | 17 |
|
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. |
53 | 20 |
|
54 |
| -# Example |
| 21 | +# Examples |
55 | 22 |
|
56 | 23 | ```julia
|
57 | 24 | 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,)) |
59 | 29 |
|
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,)) |
62 | 32 | ```
|
63 | 33 | """
|
64 |
| -struct Model{F, argnames, Targs, missings, Tgen} <: AbstractModel |
| 34 | +struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults} <: AbstractModel |
65 | 35 | f::F
|
66 |
| - args::NamedTuple{argnames, Targs} |
67 |
| - modelgen::Tgen |
| 36 | + args::NamedTuple{argnames,Targs} |
| 37 | + defaults::NamedTuple{defaultnames,Tdefaults} |
68 | 38 |
|
69 | 39 | """
|
70 |
| - Model{missings}(f, args::NamedTuple, modelgen::ModelGen) |
| 40 | + Model{missings}(f, args::NamedTuple, defaults::NamedTuple) |
71 | 41 |
|
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`. |
73 | 43 | """
|
74 | 44 | function Model{missings}(
|
75 | 45 | 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) |
80 | 50 | end
|
81 | 51 | end
|
82 | 52 |
|
83 | 53 | """
|
84 |
| - Model(f, args::NamedTuple, modelgen::ModelGen) |
| 54 | + Model(f, args::NamedTuple[, defaults::NamedTuple = ()]) |
85 | 55 |
|
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. |
87 | 60 | """
|
88 | 61 | @generated function Model(
|
89 | 62 | 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} |
93 | 66 | 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)) |
110 | 68 | end
|
111 | 69 |
|
112 | 70 | """
|
@@ -184,27 +142,19 @@ end
|
184 | 142 |
|
185 | 143 | Get a tuple of the argument names of the `model`.
|
186 | 144 | """
|
187 |
| -getargnames(model::Model{_F, argnames}) where {argnames, _F} = argnames |
| 145 | +getargnames(model::Model{_F,argnames}) where {argnames,_F} = argnames |
188 | 146 |
|
189 | 147 |
|
190 | 148 | """
|
191 | 149 | getmissings(model::Model)
|
192 | 150 |
|
193 | 151 | Get a tuple of the names of the missing arguments of the `model`.
|
194 | 152 | """
|
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 |
196 | 154 |
|
197 | 155 | getmissing(model::Model) = getmissings(model)
|
198 | 156 | @deprecate getmissing(model) getmissings(model)
|
199 | 157 |
|
200 |
| - |
201 |
| -""" |
202 |
| - getgenerator(model::Model) |
203 |
| -
|
204 |
| -Get the model generator associated with `model`. |
205 |
| -""" |
206 |
| -getgenerator(model::Model) = model.modelgen |
207 |
| - |
208 | 158 | """
|
209 | 159 | logjoint(model::Model, varinfo::AbstractVarInfo)
|
210 | 160 |
|
|
0 commit comments