44 args::NamedTuple{argnames,Targs}
55 defaults::NamedTuple{defaultnames,Tdefaults}
66 context::Ctx=DefaultContext()
7+ tracked_varnames::Union{Nothing,Array{<:VarName}}
78 end
89
910A `Model` struct with model evaluation function of type `F`, arguments of names `argnames`
1011types `Targs`, default arguments of names `defaultnames` with types `Tdefaults`, missing
1112arguments `missings`, and evaluation context of type `Ctx`.
1213
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+
1321Here `argnames`, `defaultargnames`, and `missings` are tuples of symbols, e.g. `(:a, :b)`.
1422`context` is by default `DefaultContext()`.
1523
@@ -23,14 +31,17 @@ different arguments.
2331# Examples
2432
2533```julia
34+ julia> f(x) = x + 1 # Dummy function
35+ f (generic function with 1 method)
36+
2637julia> 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 )
2839
2940julia> 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 )
3142
3243julia> 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 )
3445```
3546"""
3647struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx<: AbstractContext } < :
@@ -39,6 +50,7 @@ struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx<:AbstractConte
3950 args:: NamedTuple{argnames,Targs}
4051 defaults:: NamedTuple{defaultnames,Tdefaults}
4152 context:: Ctx
53+ tracked_varnames:: Union{Nothing,Array{<:VarName}}
4254
4355 @doc """
4456 Model{missings}(f, args::NamedTuple, defaults::NamedTuple)
@@ -51,9 +63,10 @@ struct Model{F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx<:AbstractConte
5163 args:: NamedTuple{argnames,Targs} ,
5264 defaults:: NamedTuple{defaultnames,Tdefaults} ,
5365 context:: Ctx = DefaultContext (),
66+ tracked_varnames:: Union{Nothing,Array{<:VarName}} = nothing ,
5467 ) where {missings,F,argnames,Targs,defaultnames,Tdefaults,Ctx}
5568 return new {F,argnames,defaultnames,missings,Targs,Tdefaults,Ctx} (
56- f, args, defaults, context
69+ f, args, defaults, context, tracked_varnames
5770 )
5871 end
5972end
@@ -71,22 +84,44 @@ model with different arguments.
7184 args:: NamedTuple{argnames,Targs} ,
7285 defaults:: NamedTuple{kwargnames,Tkwargs} ,
7386 context:: AbstractContext = DefaultContext (),
87+ tracked_varnames:: Union{Nothing,Array{<:VarName}} = nothing ,
7488) where {F,argnames,Targs,kwargnames,Tkwargs}
7589 missing_args = Tuple (
7690 name for (name, typ) in zip (argnames, Targs. types) if typ <: Missing
7791 )
7892 missing_kwargs = Tuple (
7993 name for (name, typ) in zip (kwargnames, Tkwargs. types) if typ <: Missing
8094 )
81- return :(Model {$(missing_args..., missing_kwargs...)} (f, args, defaults, context))
95+ return :(Model {$(missing_args..., missing_kwargs...)} (
96+ f, args, defaults, context, tracked_varnames
97+ ))
8298end
8399
84- function Model (f, args:: NamedTuple , context:: AbstractContext = DefaultContext (); kwargs... )
85- return Model (f, args, NamedTuple (kwargs), context)
100+ function Model (
101+ f,
102+ args:: NamedTuple ,
103+ context:: AbstractContext = DefaultContext (),
104+ tracked_varnames:: Union{Nothing,Array{<:VarName}} = nothing ;
105+ kwargs... ,
106+ )
107+ return Model (f, args, NamedTuple (kwargs), context, tracked_varnames)
86108end
87109
88110function contextualize (model:: Model , context:: AbstractContext )
89- return Model (model. f, model. args, model. defaults, context)
111+ return Model (model. f, model. args, model. defaults, context, model. tracked_varnames)
112+ end
113+
114+ """
115+ set_tracked_varnames(model::Model, varnames::Union{Nothing,Array{<:VarName}})
116+
117+ Return a new `Model` which only tracks a subset of variables during sampling.
118+
119+ If `varnames` is `nothing`, then all variables will be tracked. Otherwise, only
120+ the variables subsumed by `varnames` are tracked. For example, if `varnames =
121+ [@varname(x)]`, then any variable `x`, `x[1]`, `x.a`, ... will be tracked.
122+ """
123+ function set_tracked_varnames (model:: Model , varnames:: Union{Nothing,Array{<:VarName}} )
124+ return Model (model. f, model. args, model. defaults, model. context, varnames)
90125end
91126
92127"""
0 commit comments