|
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