@@ -7,40 +7,40 @@ using ..GradedAxes: AbstractGradedUnitRange, GradedAxes, dual
77
88# ===================================== Definition =======================================
99struct SectorProduct{Sectors} <: AbstractSector
10- product_sectors :: Sectors
10+ arguments :: Sectors
1111 global _SectorProduct (l) = new {typeof(l)} (l)
1212end
1313
14- SectorProduct (c:: SectorProduct ) = _SectorProduct (product_sectors (c))
14+ SectorProduct (c:: SectorProduct ) = _SectorProduct (arguments (c))
1515
16- product_sectors (s:: SectorProduct ) = s. product_sectors
16+ arguments (s:: SectorProduct ) = s. arguments
1717
1818# ================================= Sectors interface ====================================
1919function SymmetryStyle (T:: Type{<:SectorProduct} )
20- return product_sectors_symmetrystyle ( product_sectors_type (T))
20+ return arguments_symmetrystyle ( arguments_type (T))
2121end
2222
2323function quantum_dimension (:: NotAbelianStyle , s:: SectorProduct )
24- return mapreduce (quantum_dimension, * , product_sectors (s))
24+ return mapreduce (quantum_dimension, * , arguments (s))
2525end
2626
2727# use map instead of broadcast to support both Tuple and NamedTuple
28- GradedAxes. dual (s:: SectorProduct ) = SectorProduct (map (dual, product_sectors (s)))
28+ GradedAxes. dual (s:: SectorProduct ) = SectorProduct (map (dual, arguments (s)))
2929
3030function trivial (type:: Type{<:SectorProduct} )
31- return SectorProduct (product_sectors_trivial ( product_sectors_type (type)))
31+ return SectorProduct (arguments_trivial ( arguments_type (type)))
3232end
3333
3434# =================================== Base interface =====================================
3535function Base.:(== )(A:: SectorProduct , B:: SectorProduct )
36- return product_sectors_isequal ( product_sectors (A), product_sectors (B))
36+ return arguments_isequal ( arguments (A), arguments (B))
3737end
3838
3939function Base. show (io:: IO , s:: SectorProduct )
40- (length (product_sectors (s)) < 2 ) && print (io, " sector" )
40+ (length (arguments (s)) < 2 ) && print (io, " sector" )
4141 print (io, " (" )
4242 symbol = " "
43- for p in pairs (product_sectors (s))
43+ for p in pairs (arguments (s))
4444 print (io, symbol)
4545 sector_show (io, p[1 ], p[2 ])
4646 symbol = " × "
@@ -52,69 +52,63 @@ sector_show(io::IO, ::Int, v) = print(io, v)
5252sector_show (io:: IO , k:: Symbol , v) = print (io, " ($k =$v ,)" )
5353
5454function Base. isless (s1:: SectorProduct , s2:: SectorProduct )
55- return product_sectors_isless ( product_sectors (s1), product_sectors (s2))
55+ return arguments_isless ( arguments (s1), arguments (s2))
5656end
5757
5858# ======================================= shared =========================================
5959# there are 2 implementations for SectorProduct
6060# - ordered-like with a Tuple
6161# - dictionary-like with a NamedTuple
6262
63- function sym_product_sectors_insert_unspecified (s1, s2)
64- return product_sectors_insert_unspecified (s1, s2),
65- product_sectors_insert_unspecified (s2, s1)
63+ arguments_type (:: Type{<:SectorProduct{T}} ) where {T} = T
64+
65+ function sym_arguments_insert_unspecified (s1, s2)
66+ return arguments_insert_unspecified (s1, s2), arguments_insert_unspecified (s2, s1)
6667end
6768
68- function product_sectors_isequal (s1, s2)
69- return == (sym_product_sectors_insert_unspecified (s1, s2)... )
69+ function arguments_isequal (s1, s2)
70+ return == (sym_arguments_insert_unspecified (s1, s2)... )
7071end
7172
7273# get clean results when mixing implementations
73- product_sectors_isequal (nt:: NamedTuple , t:: Tuple ) = product_sectors_isequal (t, nt)
74- function product_sectors_isequal (t:: Tuple , nt:: NamedTuple )
74+ arguments_isequal (nt:: NamedTuple , t:: Tuple ) = arguments_isequal (t, nt)
75+ function arguments_isequal (t:: Tuple , nt:: NamedTuple )
7576 if isempty (t)
76- return product_sectors_isequal ((;), nt)
77+ return arguments_isequal ((;), nt)
7778 elseif isempty (nt)
78- return product_sectors_isequal (t, ())
79+ return arguments_isequal (t, ())
7980 end
8081 return false
8182end
8283
83- function product_sectors_isless (nt:: NamedTuple , :: Tuple{} )
84- return product_sectors_isless (nt, (;))
84+ arguments_product (:: NamedTuple{()} , t:: Tuple ) = t
85+ arguments_product (t:: Tuple , :: NamedTuple{()} ) = t
86+ arguments_product (:: Tuple{} , nt:: NamedTuple ) = nt
87+ arguments_product (nt:: NamedTuple , :: Tuple{} ) = nt
88+
89+ function arguments_isless (nt:: NamedTuple , :: Tuple{} )
90+ return arguments_isless (nt, (;))
8591end
86- function product_sectors_isless (:: Tuple{} , nt:: NamedTuple )
87- return product_sectors_isless ((;), nt)
92+ function arguments_isless (:: Tuple{} , nt:: NamedTuple )
93+ return arguments_isless ((;), nt)
8894end
89- function product_sectors_isless (:: NamedTuple{()} , t:: Tuple )
90- return product_sectors_isless ((), t)
95+ function arguments_isless (:: NamedTuple{()} , t:: Tuple )
96+ return arguments_isless ((), t)
9197end
92- function product_sectors_isless (t:: Tuple , :: NamedTuple{()} )
93- return product_sectors_isless (t, ())
98+ function arguments_isless (t:: Tuple , :: NamedTuple{()} )
99+ return arguments_isless (t, ())
94100end
95- function product_sectors_isless (s1, s2)
96- return isless (sym_product_sectors_insert_unspecified (s1, s2)... )
101+ function arguments_isless (s1, s2)
102+ return isless (sym_arguments_insert_unspecified (s1, s2)... )
97103end
98104
99- product_sectors_isless (:: NamedTuple , :: Tuple ) = throw (ArgumentError (" Not implemented" ))
100- product_sectors_isless (:: Tuple , :: NamedTuple ) = throw (ArgumentError (" Not implemented" ))
101-
102- product_sectors_type (:: Type{<:SectorProduct{T}} ) where {T} = T
103-
104- function product_sectors_fusion_rule (sects1, sects2)
105- isempty (sects1) && return SectorProduct (sects2)
106- isempty (sects2) && return SectorProduct (sects1)
107- shared_sect = shared_product_sectors_fusion_rule (
108- product_sectors_common (sects1, sects2)...
109- )
110- diff_sect = SectorProduct (product_sectors_diff (sects1, sects2))
111- return shared_sect × diff_sect
112- end
105+ arguments_isless (:: NamedTuple , :: Tuple ) = throw (ArgumentError (" Not implemented" ))
106+ arguments_isless (:: Tuple , :: NamedTuple ) = throw (ArgumentError (" Not implemented" ))
113107
114108# ================================= Cartesian Product ====================================
115109× (c1:: AbstractSector , c2:: AbstractSector ) = × (SectorProduct (c1), SectorProduct (c2))
116110function × (p1:: SectorProduct , p2:: SectorProduct )
117- return SectorProduct (product_sectors_product ( product_sectors (p1), product_sectors (p2)))
111+ return SectorProduct (arguments_product ( arguments (p1), arguments (p2)))
118112end
119113
120114× (a, g:: AbstractUnitRange ) = × (to_gradedrange (a), g)
148142
149143# generic case: fusion returns a GradedAxes, even for fusion with Empty
150144function fusion_rule (:: NotAbelianStyle , s1:: SectorProduct , s2:: SectorProduct )
151- return to_gradedrange (
152- product_sectors_fusion_rule (product_sectors (s1), product_sectors (s2))
153- )
145+ return to_gradedrange (arguments_fusion_rule (arguments (s1), arguments (s2)))
154146end
155147
156148# Abelian case: fusion returns SectorProduct
@@ -164,32 +156,38 @@ fusion_rule(::AbelianStyle, ::TrivialSector, c::SectorProduct) = c
164156fusion_rule (:: NotAbelianStyle , c:: SectorProduct , :: TrivialSector ) = to_gradedrange (c)
165157fusion_rule (:: NotAbelianStyle , :: TrivialSector , c:: SectorProduct ) = to_gradedrange (c)
166158
159+ function arguments_fusion_rule (sects1, sects2)
160+ isempty (sects1) && return SectorProduct (sects2)
161+ isempty (sects2) && return SectorProduct (sects1)
162+ shared_sect = shared_arguments_fusion_rule (arguments_common (sects1, sects2)... )
163+ diff_sect = SectorProduct (arguments_diff (sects1, sects2))
164+ return shared_sect × diff_sect
165+ end
166+
167167# =============================== Ordered implementation =================================
168168SectorProduct (t:: Tuple ) = _SectorProduct (t)
169169SectorProduct (sects:: AbstractSector... ) = SectorProduct (sects)
170170
171- function product_sectors_symmetrystyle (T:: Type{<:Tuple} )
171+ function arguments_symmetrystyle (T:: Type{<:Tuple} )
172172 return mapreduce (SymmetryStyle, combine_styles, fieldtypes (T); init= AbelianStyle ())
173173end
174174
175- product_sectors_product (:: NamedTuple{()} , l1:: Tuple ) = l1
176- product_sectors_product (l2:: Tuple , :: NamedTuple{()} ) = l2
177- product_sectors_product (l1:: Tuple , l2:: Tuple ) = (l1... , l2... )
175+ arguments_product (l1:: Tuple , l2:: Tuple ) = (l1... , l2... )
178176
179- product_sectors_trivial (T:: Type{<:Tuple} ) = trivial .(fieldtypes (T))
177+ arguments_trivial (T:: Type{<:Tuple} ) = trivial .(fieldtypes (T))
180178
181- function product_sectors_common (t1:: Tuple , t2:: Tuple )
179+ function arguments_common (t1:: Tuple , t2:: Tuple )
182180 n = min (length (t1), length (t2))
183181 return t1[begin : n], t2[begin : n]
184182end
185183
186- function product_sectors_diff (t1:: Tuple , t2:: Tuple )
184+ function arguments_diff (t1:: Tuple , t2:: Tuple )
187185 n1 = length (t1)
188186 n2 = length (t2)
189187 return n1 < n2 ? t2[(n1 + 1 ): end ] : t1[(n2 + 1 ): end ]
190188end
191189
192- function shared_product_sectors_fusion_rule (shared1:: T , shared2:: T ) where {T<: Tuple }
190+ function shared_arguments_fusion_rule (shared1:: T , shared2:: T ) where {T<: Tuple }
193191 return mapreduce (
194192 to_gradedrange ∘ fusion_rule,
195193 × ,
@@ -199,15 +197,15 @@ function shared_product_sectors_fusion_rule(shared1::T, shared2::T) where {T<:Tu
199197 )
200198end
201199
202- function product_sectors_insert_unspecified (t1:: Tuple , t2:: Tuple )
200+ function arguments_insert_unspecified (t1:: Tuple , t2:: Tuple )
203201 n1 = length (t1)
204202 return (t1... , trivial .(t2[(n1 + 1 ): end ])... )
205203end
206204
207205# =========================== Dictionary-like implementation =============================
208206function SectorProduct (nt:: NamedTuple )
209- product_sectors = sort_keys (nt)
210- return _SectorProduct (product_sectors )
207+ arguments = sort_keys (nt)
208+ return _SectorProduct (arguments )
211209end
212210
213211SectorProduct (; kws... ) = SectorProduct ((; kws... ))
@@ -218,42 +216,40 @@ function SectorProduct(pairs::Pair...)
218216 return SectorProduct (NamedTuple {keys} (vals))
219217end
220218
221- function product_sectors_symmetrystyle (NT:: Type{<:NamedTuple} )
219+ function arguments_symmetrystyle (NT:: Type{<:NamedTuple} )
222220 return mapreduce (SymmetryStyle, combine_styles, fieldtypes (NT); init= AbelianStyle ())
223221end
224222
225- function product_sectors_insert_unspecified (nt1:: NamedTuple , nt2:: NamedTuple )
226- diff1 = product_sectors_trivial (typeof (setdiff_keys (nt2, nt1)))
223+ function arguments_insert_unspecified (nt1:: NamedTuple , nt2:: NamedTuple )
224+ diff1 = arguments_trivial (typeof (setdiff_keys (nt2, nt1)))
227225 return sort_keys (union_keys (nt1, diff1))
228226end
229227
230- product_sectors_product (l1:: NamedTuple , :: Tuple{} ) = l1
231- product_sectors_product (:: Tuple{} , l2:: NamedTuple ) = l2
232- function product_sectors_product (l1:: NamedTuple , l2:: NamedTuple )
228+ function arguments_product (l1:: NamedTuple , l2:: NamedTuple )
233229 if length (intersect_keys (l1, l2)) > 0
234230 throw (ArgumentError (" Cannot define product of shared keys" ))
235231 end
236232 return union_keys (l1, l2)
237233end
238234
239- function product_sectors_trivial (NT:: Type{<:NamedTuple{Keys}} ) where {Keys}
235+ function arguments_trivial (NT:: Type{<:NamedTuple{Keys}} ) where {Keys}
240236 return NamedTuple {Keys} (trivial .(fieldtypes (NT)))
241237end
242238
243- function product_sectors_common (nt1:: NamedTuple , nt2:: NamedTuple )
239+ function arguments_common (nt1:: NamedTuple , nt2:: NamedTuple )
244240 # SectorProduct(nt::NamedTuple) sorts keys at init
245241 @assert issorted (keys (nt1))
246242 @assert issorted (keys (nt2))
247243 return intersect_keys (nt1, nt2), intersect_keys (nt2, nt1)
248244end
249245
250- product_sectors_diff (nt1:: NamedTuple , nt2:: NamedTuple ) = symdiff_keys (nt1, nt2)
246+ arguments_diff (nt1:: NamedTuple , nt2:: NamedTuple ) = symdiff_keys (nt1, nt2)
251247
252248function map_blocklabels (f, r:: AbstractUnitRange )
253249 return gradedrange (labelled .(unlabel .(blocklengths (r)), f .(blocklabels (r))))
254250end
255251
256- function shared_product_sectors_fusion_rule (shared1:: NT , shared2:: NT ) where {NT<: NamedTuple }
257- tuple_fused = shared_product_sectors_fusion_rule (values (shared1), values (shared2))
258- return map_blocklabels (SectorProduct ∘ NT ∘ product_sectors ∘ SectorProduct, tuple_fused)
252+ function shared_arguments_fusion_rule (shared1:: NT , shared2:: NT ) where {NT<: NamedTuple }
253+ tuple_fused = shared_arguments_fusion_rule (values (shared1), values (shared2))
254+ return map_blocklabels (SectorProduct ∘ NT ∘ arguments ∘ SectorProduct, tuple_fused)
259255end
0 commit comments