@@ -264,20 +264,24 @@ function subset(varinfo::TypedVarInfo, vns::AbstractVector{<:VarName})
264
264
return VarInfo (NamedTuple {syms} (metadatas), varinfo. logp, varinfo. num_produce)
265
265
end
266
266
267
- function subset (metadata:: Metadata , vns_given:: AbstractVector{<:VarName} )
267
+ function subset (metadata:: Metadata , vns_given:: AbstractVector{VN} ) where {VN <: VarName }
268
268
# TODO : Should we error if `vns` contains a variable that is not in `metadata`?
269
269
# For each `vn` in `vns`, get the variables subsumed by `vn`.
270
- vns = mapreduce (vcat, vns_given) do vn
270
+ vns = mapreduce (vcat, vns_given; init = VN[] ) do vn
271
271
filter (Base. Fix1 (subsumes, vn), metadata. vns)
272
272
end
273
273
indices_for_vns = map (Base. Fix1 (getindex, metadata. idcs), vns)
274
- indices = Dict (vn => i for (i, vn) in enumerate (vns))
274
+ indices = if isempty (vns)
275
+ Dict {VarName,Int} ()
276
+ else
277
+ Dict (vn => i for (i, vn) in enumerate (vns))
278
+ end
275
279
# Construct new `vals` and `ranges`.
276
280
vals_original = metadata. vals
277
281
ranges_original = metadata. ranges
278
282
# Allocate the new `vals`. and `ranges`.
279
- vals = similar (metadata. vals, sum (length, ranges_original[indices_for_vns]))
280
- ranges = similar (ranges_original)
283
+ vals = similar (metadata. vals, sum (length, ranges_original[indices_for_vns]; init = 0 ))
284
+ ranges = similar (ranges_original, length (vns) )
281
285
# The new range `r` for `vns[i]` is offset by `offset` and
282
286
# has the same length as the original range `r_original`.
283
287
# The new `indices` (from above) ensures ordering according to `vns`.
@@ -311,7 +315,7 @@ function subset(metadata::Metadata, vns_given::AbstractVector{<:VarName})
311
315
ranges,
312
316
vals,
313
317
metadata. dists[indices_for_vns],
314
- metadata. gids,
318
+ metadata. gids[indices_for_vns] ,
315
319
metadata. orders[indices_for_vns],
316
320
flags,
317
321
)
0 commit comments