@@ -110,3 +110,36 @@ function modify_value_representation(nt::NamedTuple)
110110 end
111111 return modified_nt
112112end
113+
114+ """
115+ make_chain_from_prior([rng,] model, n_iters)
116+
117+ Construct an MCMCChains.Chains object by sampling from the prior of `model` for
118+ `n_iters` iterations.
119+ """
120+ function make_chain_from_prior (rng:: Random.AbstractRNG , model:: Model , n_iters:: Int )
121+ # Sample from the prior
122+ varinfos = [VarInfo (rng, model) for _ in 1 : n_iters]
123+ # Extract all varnames found in any dictionary. Doing it this way guards
124+ # against the possibility of having different varnames in different
125+ # dictionaries, e.g. for models that have dynamic variables / array sizes
126+ varnames = OrderedSet {VarName} ()
127+ # Convert each varinfo into an OrderedDict of vns => params.
128+ # We have to use varname_and_value_leaves so that each parameter is a scalar
129+ dicts = map (varinfos) do t
130+ vals = DynamicPPL. values_as (t, OrderedDict)
131+ iters = map (DynamicPPL. varname_and_value_leaves, keys (vals), values (vals))
132+ tuples = mapreduce (collect, vcat, iters)
133+ push! (varnames, map (first, tuples)... )
134+ OrderedDict (tuples)
135+ end
136+ # Convert back to list
137+ varnames = collect (varnames)
138+ # Construct matrix of values
139+ vals = [get (dict, vn, missing ) for dict in dicts, vn in varnames]
140+ # Construct and return the Chains object
141+ return Chains (vals, varnames)
142+ end
143+ function make_chain_from_prior (model:: Model , n_iters:: Int )
144+ return make_chain_from_prior (Random. default_rng (), model, n_iters)
145+ end
0 commit comments