@@ -3,11 +3,11 @@ struct FusionTreeBlock{I,N₁,N₂,F<:FusionTreePair{I,N₁,N₂}}
33end
44
55function FusionTreeBlock {I} (uncoupled:: Tuple{NTuple{N₁,I},NTuple{N₂,I}} ,
6- isdual:: Tuple{NTuple{N₁,Bool},NTuple{N₂,Bool}} ) where {I <: Sector ,
7- N₁,N₂}
8- F₁ = fusiontreetype (I, N₁)
9- F₂ = fusiontreetype (I, N₂ )
10- trees = Vector {Tuple{F₁,F₂}} (undef, 0 )
6+ isdual:: Tuple{NTuple{N₁,Bool},NTuple{N₂,Bool}} ;
7+ sizehint :: Int = 0 ) where {I <: Sector , N₁,N₂}
8+ F = fusiontreetype (I, N₁, N₂ )
9+ trees = Vector {F} (undef, 0 )
10+ sizehint > 0 && sizehint! (trees, sizehint )
1111
1212 if N₁ == N₂ == 0
1313 return FusionTreeBlock (trees)
@@ -97,7 +97,7 @@ function bendright(src::FusionTreeBlock)
9797 N₂ = numin (src)
9898 @assert N₁ > 0
9999
100- dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst)
100+ dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst; sizehint = length (src) )
101101 indexmap = treeindex_map (dst)
102102 U = zeros (sectorscalartype (I), length (dst), length (src))
103103
@@ -156,7 +156,7 @@ function bendleft(src::FusionTreeBlock)
156156 N₂ = numout (src)
157157 @assert N₁ > 0
158158
159- dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst)
159+ dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst; sizehint = length (src) )
160160 indexmap = treeindex_map (dst)
161161 U = zeros (sectorscalartype (I), length (dst), length (src))
162162
@@ -211,9 +211,8 @@ function foldright(src::FusionTreeBlock)
211211 N₁ = numout (src)
212212 N₂ = numin (src)
213213 @assert N₁ > 0
214- dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst)
215214
216- dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst)
215+ dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst; sizehint = length (src) )
217216 indexmap = treeindex_map (dst)
218217 U = zeros (sectorscalartype (I), length (dst), length (src))
219218
@@ -282,7 +281,7 @@ function foldleft(src::FusionTreeBlock)
282281 N₂ = numout (src)
283282 @assert N₁ > 0
284283
285- dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst)
284+ dst = FusionTreeBlock {I} (uncoupled_dst, isdual_dst; sizehint = length (src) )
286285 indexmap = treeindex_map (dst)
287286 U = zeros (sectorscalartype (I), length (dst), length (src))
288287
@@ -464,7 +463,7 @@ function artin_braid(src::FusionTreeBlock{I,N,0}, i; inv::Bool=false) where {I,N
464463 isdual = src. isdual[1 ]
465464 isdual′ = TupleTools. setindex (isdual, isdual[i], i + 1 )
466465 isdual′ = TupleTools. setindex (isdual′, isdual[i + 1 ], i)
467- dst = FusionTreeBlock {I} ((uncoupled′, ()), (isdual′, ()))
466+ dst = FusionTreeBlock {I} ((uncoupled′, ()), (isdual′, ()); sizehint = length (src) )
468467
469468 oneT = one (sectorscalartype (I))
470469
@@ -596,7 +595,7 @@ function braid(src::FusionTreeBlock{I,N,0}, p::NTuple{N,Int},
596595 if FusionStyle (I) isa UniqueFusion && BraidingStyle (I) isa SymmetricBraiding
597596 uncoupled′ = TupleTools. _permute (src. uncoupled[1 ], p)
598597 isdual′ = TupleTools. _permute (src. isdual[1 ], p)
599- dst = FusionTreeBlock {I} (uncoupled′, isdual′)
598+ dst = FusionTreeBlock {I} (uncoupled′, isdual′; sizehint = length (src) )
600599 U = transformation_matrix (dst, src) do (f₁, f₂)
601600 return ((f₁′, f₂) => c for (f₁′, c) in braid (f₁, p, levels))
602601 end
0 commit comments