@@ -368,20 +368,24 @@ function subset(varinfo::TypedVarInfo, vns::AbstractVector{<:VarName})
368
368
)
369
369
end
370
370
371
- function subset (metadata:: Metadata , vns_given:: AbstractVector{<:VarName} )
371
+ function subset (metadata:: Metadata , vns_given:: AbstractVector{VN} ) where {VN <: VarName }
372
372
# TODO : Should we error if `vns` contains a variable that is not in `metadata`?
373
373
# For each `vn` in `vns`, get the variables subsumed by `vn`.
374
- vns = mapreduce (vcat, vns_given) do vn
374
+ vns = mapreduce (vcat, vns_given; init = VN[] ) do vn
375
375
filter (Base. Fix1 (subsumes, vn), metadata. vns)
376
376
end
377
377
indices_for_vns = map (Base. Fix1 (getindex, metadata. idcs), vns)
378
- indices = Dict (vn => i for (i, vn) in enumerate (vns))
378
+ indices = if isempty (vns)
379
+ Dict {VarName,Int} ()
380
+ else
381
+ Dict (vn => i for (i, vn) in enumerate (vns))
382
+ end
379
383
# Construct new `vals` and `ranges`.
380
384
vals_original = metadata. vals
381
385
ranges_original = metadata. ranges
382
386
# Allocate the new `vals`. and `ranges`.
383
- vals = similar (metadata. vals, sum (length, ranges_original[indices_for_vns]))
384
- ranges = similar (ranges_original)
387
+ vals = similar (metadata. vals, sum (length, ranges_original[indices_for_vns]; init = 0 ))
388
+ ranges = similar (ranges_original, length (vns) )
385
389
# The new range `r` for `vns[i]` is offset by `offset` and
386
390
# has the same length as the original range `r_original`.
387
391
# The new `indices` (from above) ensures ordering according to `vns`.
@@ -415,7 +419,7 @@ function subset(metadata::Metadata, vns_given::AbstractVector{<:VarName})
415
419
ranges,
416
420
vals,
417
421
metadata. dists[indices_for_vns],
418
- metadata. gids,
422
+ metadata. gids[indices_for_vns] ,
419
423
metadata. orders[indices_for_vns],
420
424
flags,
421
425
)
@@ -490,7 +494,7 @@ function merge_metadata(metadata_left::Metadata, metadata_right::Metadata)
490
494
ranges = Vector {UnitRange{Int}} ()
491
495
vals = T[]
492
496
dists = D[]
493
- gids = metadata_right . gids # NOTE: giving precedence to `metadata_right`
497
+ gids = Set{Selector}[]
494
498
orders = Int[]
495
499
flags = Dict {String,BitVector} ()
496
500
# Initialize the `flags`.
@@ -520,6 +524,8 @@ function merge_metadata(metadata_left::Metadata, metadata_right::Metadata)
520
524
dist_right = getdist (metadata_right, vn)
521
525
# Give precedence to `metadata_right`.
522
526
push! (dists, dist_right)
527
+ gid = metadata_right. gids[getidx (metadata_right, vn)]
528
+ push! (gids, gid)
523
529
# `orders`: giving precedence to `metadata_right`
524
530
push! (orders, getorder (metadata_right, vn))
525
531
# `flags`
@@ -539,6 +545,8 @@ function merge_metadata(metadata_left::Metadata, metadata_right::Metadata)
539
545
# `dists`
540
546
dist_left = getdist (metadata_left, vn)
541
547
push! (dists, dist_left)
548
+ gid = metadata_left. gids[getidx (metadata_left, vn)]
549
+ push! (gids, gid)
542
550
# `orders`
543
551
push! (orders, getorder (metadata_left, vn))
544
552
# `flags`
@@ -557,6 +565,8 @@ function merge_metadata(metadata_left::Metadata, metadata_right::Metadata)
557
565
# `dists`
558
566
dist_right = getdist (metadata_right, vn)
559
567
push! (dists, dist_right)
568
+ gid = metadata_right. gids[getidx (metadata_right, vn)]
569
+ push! (gids, gid)
560
570
# `orders`
561
571
push! (orders, getorder (metadata_right, vn))
562
572
# `flags`
@@ -1826,14 +1836,31 @@ function BangBang.push!!(
1826
1836
vi:: VarInfo , vn:: VarName , r, dist:: Distribution , gidset:: Set{Selector}
1827
1837
)
1828
1838
if vi isa UntypedVarInfo
1829
- @assert ~ (vn in keys (vi)) " [push!!] attempt to add an exisitng variable $(getsym (vn)) ($(vn) ) to VarInfo (keys=$(keys (vi)) ) with dist=$dist , gid=$gidset "
1839
+ @assert ~ (vn in keys (vi)) " [push!!] attempt to add an existing variable $(getsym (vn)) ($(vn) ) to VarInfo (keys=$(keys (vi)) ) with dist=$dist , gid=$gidset "
1830
1840
elseif vi isa TypedVarInfo
1831
- @assert ~ (haskey (vi, vn)) " [push!!] attempt to add an exisitng variable $(getsym (vn)) ($(vn) ) to TypedVarInfo of syms $(syms (vi)) with dist=$dist , gid=$gidset "
1841
+ @assert ~ (haskey (vi, vn)) " [push!!] attempt to add an existing variable $(getsym (vn)) ($(vn) ) to TypedVarInfo of syms $(syms (vi)) with dist=$dist , gid=$gidset "
1842
+ end
1843
+
1844
+ sym = getsym (vn)
1845
+ if vi isa TypedVarInfo && ~ haskey (vi. metadata, sym)
1846
+ # The NamedTuple doesn't have an entry for this variable, let's add one.
1847
+ val = tovec (r)
1848
+ md = Metadata (
1849
+ Dict (vn => 1 ),
1850
+ [vn],
1851
+ [1 : length (val)],
1852
+ val,
1853
+ [dist],
1854
+ [gidset],
1855
+ [get_num_produce (vi)],
1856
+ Dict {String,BitVector} (" trans" => [false ], " del" => [false ]),
1857
+ )
1858
+ vi = Accessors. @set vi. metadata[sym] = md
1859
+ else
1860
+ meta = getmetadata (vi, vn)
1861
+ push! (meta, vn, r, dist, gidset, get_num_produce (vi))
1832
1862
end
1833
1863
1834
- meta = getmetadata (vi, vn)
1835
- push! (meta, vn, r, dist, gidset, get_num_produce (vi))
1836
-
1837
1864
return vi
1838
1865
end
1839
1866
@@ -1864,7 +1891,6 @@ function Base.push!(meta::Metadata, vn, r, dist, gidset, num_produce)
1864
1891
push! (meta. orders, num_produce)
1865
1892
push! (meta. flags[" del" ], false )
1866
1893
push! (meta. flags[" trans" ], false )
1867
-
1868
1894
return meta
1869
1895
end
1870
1896
0 commit comments