@@ -526,10 +526,6 @@ function _recursive_repartition(f₁::FusionTree{I,N₁},
526526 end
527527end
528528
529- # transpose double fusion tree
530- const transposecache = LRU {Any,Any} (; maxsize= 10 ^ 5 )
531- const usetransposecache = Ref {Bool} (true )
532-
533529"""
534530 transpose(f₁::FusionTree{I}, f₂::FusionTree{I},
535531 p1::NTuple{N₁, Int}, p2::NTuple{N₂, Int}) where {I, N₁, N₂}
@@ -548,28 +544,24 @@ function Base.transpose(f₁::FusionTree{I}, f₂::FusionTree{I},
548544 @assert length (f₁) + length (f₂) == N
549545 p = linearizepermutation (p1, p2, length (f₁), length (f₂))
550546 @assert iscyclicpermutation (p)
551- if usetransposecache[]
552- T = sectorscalartype (I)
553- F₁ = fusiontreetype (I, N₁)
554- F₂ = fusiontreetype (I, N₂)
555- D = fusiontreedict (I){Tuple{F₁,F₂},T}
556- return _get_transpose (D, (f₁, f₂, p1, p2))
557- else
558- return _transpose ((f₁, f₂, p1, p2))
559- end
547+ return fstranspose ((f₁, f₂, p1, p2))
560548end
561549
562- @noinline function _get_transpose (:: Type{D} , @nospecialize (key)) where {D}
563- d:: D = get! (transposecache, key) do
564- return _transpose (key)
565- end
566- return d
567- end
550+ const FSTransposeKey{I<: Sector ,N₁,N₂} = Tuple{<: FusionTree{I} ,<: FusionTree{I} ,
551+ IndexTuple{N₁},IndexTuple{N₂}}
568552
569- const TransposeKey{I<: Sector ,N₁,N₂} = Tuple{<: FusionTree{I} ,<: FusionTree{I} ,
570- IndexTuple{N₁},IndexTuple{N₂}}
553+ function _fsdicttype (I, N₁, N₂)
554+ F₁ = fusiontreetype (I, N₁)
555+ F₂ = fusiontreetype (I, N₂)
556+ T = sectorscalartype (I)
557+ return fusiontreedict (I){Tuple{F₁,F₂},T}
558+ end
571559
572- function _transpose ((f₁, f₂, p1, p2):: TransposeKey{I,N₁,N₂} ) where {I<: Sector ,N₁,N₂}
560+ @cached function fstranspose (key:: FSTransposeKey{I,N₁,N₂} ):: _fsdicttype (I, N₁,
561+ N₂) where {I<: Sector ,
562+ N₁,
563+ N₂}
564+ f₁, f₂, p1, p2 = key
573565 N = N₁ + N₂
574566 p = linearizepermutation (p1, p2, length (f₁), length (f₂))
575567 newtrees = repartition (f₁, f₂, N₁)
@@ -611,6 +603,14 @@ function _transpose((f₁, f₂, p1, p2)::TransposeKey{I,N₁,N₂}) where {I<:S
611603 return newtrees
612604end
613605
606+ function CacheStyle (:: typeof (fstranspose), k:: FSTransposeKey{I} ) where {I<: Sector }
607+ if FusionStyle (I) isa UniqueFusion
608+ return NoCache ()
609+ else
610+ return GlobalLRUCache ()
611+ end
612+ end
613+
614614# COMPOSITE DUALITY MANIPULATIONS PART 2: Planar traces
615615# -------------------------------------------------------------------
616616# -> composite manipulations that depend on the duality (rigidity) and pivotal structure
@@ -1015,10 +1015,6 @@ function permute(f::FusionTree{I,N}, p::NTuple{N,Int}) where {I<:Sector,N}
10151015end
10161016
10171017# braid double fusion tree
1018- const braidcache = LRU {Any,Any} (; maxsize= 10 ^ 5 )
1019- const usebraidcache_abelian = Ref {Bool} (false )
1020- const usebraidcache_nonabelian = Ref {Bool} (true )
1021-
10221018"""
10231019 braid(f₁::FusionTree{I}, f₂::FusionTree{I},
10241020 levels1::IndexTuple, levels2::IndexTuple,
@@ -1043,42 +1039,15 @@ function braid(f₁::FusionTree{I}, f₂::FusionTree{I},
10431039 @assert length (f₁) + length (f₂) == N₁ + N₂
10441040 @assert length (f₁) == length (levels1) && length (f₂) == length (levels2)
10451041 @assert TupleTools. isperm ((p1... , p2... ))
1046- if FusionStyle (f₁) isa UniqueFusion &&
1047- BraidingStyle (f₁) isa SymmetricBraiding
1048- if usebraidcache_abelian[]
1049- T = Int # do we hardcode this ?
1050- F₁ = fusiontreetype (I, N₁)
1051- F₂ = fusiontreetype (I, N₂)
1052- D = SingletonDict{Tuple{F₁,F₂},T}
1053- return _get_braid (D, (f₁, f₂, levels1, levels2, p1, p2))
1054- else
1055- return _braid ((f₁, f₂, levels1, levels2, p1, p2))
1056- end
1057- else
1058- if usebraidcache_nonabelian[]
1059- T = sectorscalartype (I)
1060- F₁ = fusiontreetype (I, N₁)
1061- F₂ = fusiontreetype (I, N₂)
1062- D = FusionTreeDict{Tuple{F₁,F₂},T}
1063- return _get_braid (D, (f₁, f₂, levels1, levels2, p1, p2))
1064- else
1065- return _braid ((f₁, f₂, levels1, levels2, p1, p2))
1066- end
1067- end
1042+ return fsbraid ((f₁, f₂, levels1, levels2, p1, p2))
10681043end
1044+ const FSBraidKey{I<: Sector ,N₁,N₂} = Tuple{<: FusionTree{I} ,<: FusionTree{I} ,
1045+ IndexTuple,IndexTuple,
1046+ IndexTuple{N₁},IndexTuple{N₂}}
10691047
1070- @noinline function _get_braid (:: Type{D} , @nospecialize (key)) where {D}
1071- d:: D = get! (braidcache, key) do
1072- return _braid (key)
1073- end
1074- return d
1075- end
1076-
1077- const BraidKey{I<: Sector ,N₁,N₂} = Tuple{<: FusionTree{I} ,<: FusionTree{I} ,
1078- IndexTuple,IndexTuple,
1079- IndexTuple{N₁},IndexTuple{N₂}}
1080-
1081- function _braid ((f₁, f₂, l1, l2, p1, p2):: BraidKey{I,N₁,N₂} ) where {I<: Sector ,N₁,N₂}
1048+ @cached function fsbraid (key:: FSBraidKey{I,N₁,N₂} ):: _fsdicttype (I, N₁,
1049+ N₂) where {I<: Sector ,N₁,N₂}
1050+ (f₁, f₂, l1, l2, p1, p2) = key
10821051 p = linearizepermutation (p1, p2, length (f₁), length (f₂))
10831052 levels = (l1... , reverse (l2)... )
10841053 local newtrees
@@ -1097,6 +1066,14 @@ function _braid((f₁, f₂, l1, l2, p1, p2)::BraidKey{I,N₁,N₂}) where {I<:S
10971066 return newtrees
10981067end
10991068
1069+ function CacheStyle (:: typeof (fsbraid), k:: FSBraidKey{I} ) where {I<: Sector }
1070+ if FusionStyle (I) isa UniqueFusion
1071+ return NoCache ()
1072+ else
1073+ return GlobalLRUCache ()
1074+ end
1075+ end
1076+
11001077"""
11011078 permute(f₁::FusionTree{I}, f₂::FusionTree{I},
11021079 p1::NTuple{N₁, Int}, p2::NTuple{N₂, Int}) where {I, N₁, N₂}
0 commit comments