4
4
args::NamedTuple{argnames,Targs}
5
5
defaults::NamedTuple{defaultnames,Tdefaults}
6
6
context::Ctx=DefaultContext()
7
+ tracked_varnames::Union{Nothing,Array{<:VarName}}
7
8
end
8
9
9
10
A `Model` struct with model evaluation function of type `F`, arguments of names `argnames`
10
11
types `Targs`, default arguments of names `defaultnames` with types `Tdefaults`, missing
11
12
arguments `missings`, and evaluation context of type `Ctx`.
12
13
14
+ `tracked_varnames` is an array of VarNames that should be tracked during sampling. During
15
+ model evaluation (with `DynamicPPL.evaluate!!`) all random variables are tracked; however,
16
+ at the end of each iteration of MCMC sampling, `DynamicPPL.values_as_in_model` is used to
17
+ extract the values of _only_ the tracked variables. This allows the user to control which
18
+ variables are ultimately stored in the chain. This field can be set using the
19
+ [`set_tracked_varnames`](@ref) function.
20
+
13
21
Here `argnames`, `defaultargnames`, and `missings` are tuples of symbols, e.g. `(:a, :b)`.
14
22
`context` is by default `DefaultContext()`.
15
23
@@ -23,14 +31,17 @@ different arguments.
23
31
# Examples
24
32
25
33
```julia
34
+ julia> f(x) = x + 1 # Dummy function
35
+ f (generic function with 1 method)
36
+
26
37
julia> Model(f, (x = 1.0, y = 2.0))
27
- Model{typeof(f),(:x, :y),(),(),Tuple{Float64,Float64},Tuple{}}(f, (x = 1.0, y = 2.0), NamedTuple())
38
+ Model{typeof(f), (:x, :y), (), (), Tuple{Float64, Float64}, Tuple{}, DefaultContext }(f, (x = 1.0, y = 2.0), NamedTuple(), DefaultContext(), nothing )
28
39
29
40
julia> Model(f, (x = 1.0, y = 2.0), (x = 42,))
30
- Model{typeof(f),(:x, :y),(:x,),(),Tuple{Float64,Float64},Tuple{Int64}}(f, (x = 1.0, y = 2.0), (x = 42,))
41
+ Model{typeof(f), (:x, :y), (:x,), (), Tuple{Float64, Float64}, Tuple{Int64}, DefaultContext }(f, (x = 1.0, y = 2.0), (x = 42,), DefaultContext(), nothing )
31
42
32
43
julia> Model{(:y,)}(f, (x = 1.0, y = 2.0), (x = 42,)) # with special definition of missings
33
- Model{typeof(f),(:x, :y),(:x,),(:y,),Tuple{Float64,Float64},Tuple{Int64}}(f, (x = 1.0, y = 2.0), (x = 42,))
44
+ Model{typeof(f), (:x, :y), (:x,), (:y,), Tuple{Float64, Float64}, Tuple{Int64}, DefaultContext }(f, (x = 1.0, y = 2.0), (x = 42,), DefaultContext(), nothing )
34
45
```
35
46
"""
36
47
struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx<: AbstractContext } < :
@@ -39,6 +50,7 @@ struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx<:AbstractConte
39
50
args:: NamedTuple{argnames,Targs}
40
51
defaults:: NamedTuple{defaultnames,Tdefaults}
41
52
context:: Ctx
53
+ tracked_varnames:: Union{Nothing,Array{<:VarName}}
42
54
43
55
@doc """
44
56
Model{missings}(f, args::NamedTuple, defaults::NamedTuple)
@@ -51,9 +63,10 @@ struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx<:AbstractConte
51
63
args:: NamedTuple{argnames,Targs} ,
52
64
defaults:: NamedTuple{defaultnames,Tdefaults} ,
53
65
context:: Ctx = DefaultContext (),
66
+ tracked_varnames:: Union{Nothing,Array{<:VarName}} = nothing ,
54
67
) where {missings,F,argnames,Targs,defaultnames,Tdefaults,Ctx}
55
68
return new {F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx} (
56
- f, args, defaults, context
69
+ f, args, defaults, context, tracked_varnames
57
70
)
58
71
end
59
72
end
@@ -71,22 +84,36 @@ model with different arguments.
71
84
args:: NamedTuple{argnames,Targs} ,
72
85
defaults:: NamedTuple{kwargnames,Tkwargs} ,
73
86
context:: AbstractContext = DefaultContext (),
87
+ tracked_varnames:: Union{Nothing,Array{<:VarName}} = nothing ,
74
88
) where {F,argnames,Targs,kwargnames,Tkwargs}
75
89
missing_args = Tuple (
76
90
name for (name, typ) in zip (argnames, Targs. types) if typ <: Missing
77
91
)
78
92
missing_kwargs = Tuple (
79
93
name for (name, typ) in zip (kwargnames, Tkwargs. types) if typ <: Missing
80
94
)
81
- return :(Model {$(missing_args..., missing_kwargs...)} (f, args, defaults, context))
95
+ return :(Model {$(missing_args..., missing_kwargs...)} (f, args, defaults, context, tracked_varnames ))
82
96
end
83
97
84
- function Model (f, args:: NamedTuple , context:: AbstractContext = DefaultContext (); kwargs... )
85
- return Model (f, args, NamedTuple (kwargs), context)
98
+ function Model (f, args:: NamedTuple , context:: AbstractContext = DefaultContext (), tracked_varnames :: Union{Nothing,Array{<:VarName}} = nothing ; kwargs... )
99
+ return Model (f, args, NamedTuple (kwargs), context, tracked_varnames )
86
100
end
87
101
88
102
function contextualize (model:: Model , context:: AbstractContext )
89
- return Model (model. f, model. args, model. defaults, context)
103
+ return Model (model. f, model. args, model. defaults, context, model. tracked_varnames)
104
+ end
105
+
106
+ """
107
+ set_tracked_varnames(model::Model, varnames::Union{Nothing,Array{<:VarName}})
108
+
109
+ Return a new `Model` which only tracks a subset of variables during sampling.
110
+
111
+ If `varnames` is `nothing`, then all variables will be tracked. Otherwise, only
112
+ the variables subsumed by `varnames` are tracked. For example, if `varnames =
113
+ [@varname(x)]`, then any variable `x`, `x[1]`, `x.a`, ... will be tracked.
114
+ """
115
+ function set_tracked_varnames (model:: Model , varnames:: Union{Nothing,Array{<:VarName}} )
116
+ return Model (model. f, model. args, model. defaults, model. context, varnames)
90
117
end
91
118
92
119
"""
0 commit comments