@@ -110,3 +110,32 @@ 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+ # Convert each varinfo into an OrderedDict of vns => params.
124+ # We have to use varname_and_value_leaves so that each parameter is a scalar
125+ dicts = map (varinfos) do t
126+ vals = DynamicPPL. values_as (t, OrderedDict)
127+ iters = map (DynamicPPL. varname_and_value_leaves, keys (vals), values (vals))
128+ tuples = mapreduce (collect, vcat, iters)
129+ OrderedDict (tuples)
130+ end
131+ # Extract all varnames found in any dictionary. Doing it this way guards
132+ # against the possibility of having different varnames in different
133+ # dictionaries, e.g. for models that have dynamic variables / array sizes
134+ all_varnames = collect (union (map (keys, dicts)... ))
135+ vals = [get (dict, vn, missing ) for dict in dicts, vn in all_varnames]
136+ # Construct and return the Chains object
137+ return Chains (vals, all_varnames)
138+ end
139+ function make_chain_from_prior (model:: Model , n_iters:: Int )
140+ return make_chain_from_prior (Random. default_rng (), model, n_iters)
141+ end
0 commit comments