@@ -7,38 +7,40 @@ using ..GradedAxes: AbstractGradedUnitRange, GradedAxes, dual
77
88# ===================================== Definition =======================================
99struct SectorProduct{Sectors} <: AbstractSector
10- sectors :: Sectors
10+ product_sectors :: Sectors
1111 global _SectorProduct (l) = new {typeof(l)} (l)
1212end
1313
14- SectorProduct (c:: SectorProduct ) = _SectorProduct (sectors (c))
14+ SectorProduct (c:: SectorProduct ) = _SectorProduct (product_sectors (c))
1515
16- sectors (s:: SectorProduct ) = s. sectors
16+ product_sectors (s:: SectorProduct ) = s. product_sectors
1717
1818# ================================= Sectors interface ====================================
19- SymmetryStyle (T:: Type{<:SectorProduct} ) = sectors_symmetrystyle (sectors_type (T))
19+ function SymmetryStyle (T:: Type{<:SectorProduct} )
20+ return product_sectors_symmetrystyle (product_sectors_type (T))
21+ end
2022
2123function quantum_dimension (:: NotAbelianStyle , s:: SectorProduct )
22- return mapreduce (quantum_dimension, * , sectors (s))
24+ return mapreduce (quantum_dimension, * , product_sectors (s))
2325end
2426
2527# use map instead of broadcast to support both Tuple and NamedTuple
26- GradedAxes. dual (s:: SectorProduct ) = SectorProduct (map (dual, sectors (s)))
28+ GradedAxes. dual (s:: SectorProduct ) = SectorProduct (map (dual, product_sectors (s)))
2729
2830function trivial (type:: Type{<:SectorProduct} )
29- return SectorProduct (sectors_trivial ( sectors_type (type)))
31+ return SectorProduct (product_sectors_trivial ( product_sectors_type (type)))
3032end
3133
3234# =================================== Base interface =====================================
3335function Base.:(== )(A:: SectorProduct , B:: SectorProduct )
34- return sectors_isequal ( sectors (A), sectors (B))
36+ return product_sectors_isequal ( product_sectors (A), product_sectors (B))
3537end
3638
3739function Base. show (io:: IO , s:: SectorProduct )
38- (length (sectors (s)) < 2 ) && print (io, " sector" )
40+ (length (product_sectors (s)) < 2 ) && print (io, " sector" )
3941 print (io, " (" )
4042 symbol = " "
41- for p in pairs (sectors (s))
43+ for p in pairs (product_sectors (s))
4244 print (io, symbol)
4345 sector_show (io, p[1 ], p[2 ])
4446 symbol = " × "
@@ -50,75 +52,78 @@ sector_show(io::IO, ::Int, v) = print(io, v)
5052sector_show (io:: IO , k:: Symbol , v) = print (io, " ($k =$v ,)" )
5153
5254function Base. isless (s1:: SectorProduct , s2:: SectorProduct )
53- return sectors_isless ( sectors (s1), sectors (s2))
55+ return product_sectors_isless ( product_sectors (s1), product_sectors (s2))
5456end
5557
5658# ======================================= shared =========================================
5759# there are 2 implementations for SectorProduct
5860# - ordered-like with a Tuple
5961# - dictionary-like with a NamedTuple
6062
61- function sym_sectors_insert_unspecified (s1, s2)
62- return sectors_insert_unspecified (s1, s2), sectors_insert_unspecified (s2, s1)
63+ function sym_product_sectors_insert_unspecified (s1, s2)
64+ return product_sectors_insert_unspecified (s1, s2),
65+ product_sectors_insert_unspecified (s2, s1)
6366end
6467
65- function sectors_isequal (s1, s2)
66- return == (sym_sectors_insert_unspecified (s1, s2)... )
68+ function product_sectors_isequal (s1, s2)
69+ return == (sym_product_sectors_insert_unspecified (s1, s2)... )
6770end
6871
6972# get clean results when mixing implementations
70- function sectors_isequal (nt:: NamedTuple , :: Tuple{} )
71- return sectors_isequal (nt, (;))
73+ function product_sectors_isequal (nt:: NamedTuple , :: Tuple{} )
74+ return product_sectors_isequal (nt, (;))
7275end
73- function sectors_isequal (:: Tuple{} , nt:: NamedTuple )
74- return sectors_isequal ((;), nt)
76+ function product_sectors_isequal (:: Tuple{} , nt:: NamedTuple )
77+ return product_sectors_isequal ((;), nt)
7578end
76- function sectors_isequal (:: NamedTuple{()} , t:: Tuple )
77- return sectors_isequal ((), t)
79+ function product_sectors_isequal (:: NamedTuple{()} , t:: Tuple )
80+ return product_sectors_isequal ((), t)
7881end
79- function sectors_isequal (t:: Tuple , :: NamedTuple{()} )
80- return sectors_isequal (t, ())
82+ function product_sectors_isequal (t:: Tuple , :: NamedTuple{()} )
83+ return product_sectors_isequal (t, ())
8184end
82- sectors_isequal (:: Tuple{} , :: NamedTuple{()} ) = true
83- sectors_isequal (:: NamedTuple{()} , :: Tuple{} ) = true
84- sectors_isequal (:: Tuple , :: NamedTuple ) = false
85- sectors_isequal (:: NamedTuple , :: Tuple ) = false
85+ product_sectors_isequal (:: Tuple{} , :: NamedTuple{()} ) = true
86+ product_sectors_isequal (:: NamedTuple{()} , :: Tuple{} ) = true
87+ product_sectors_isequal (:: Tuple , :: NamedTuple ) = false
88+ product_sectors_isequal (:: NamedTuple , :: Tuple ) = false
8689
87- function sectors_isless (nt:: NamedTuple , :: Tuple{} )
88- return sectors_isless (nt, (;))
90+ function product_sectors_isless (nt:: NamedTuple , :: Tuple{} )
91+ return product_sectors_isless (nt, (;))
8992end
90- function sectors_isless (:: Tuple{} , nt:: NamedTuple )
91- return sectors_isless ((;), nt)
93+ function product_sectors_isless (:: Tuple{} , nt:: NamedTuple )
94+ return product_sectors_isless ((;), nt)
9295end
93- function sectors_isless (:: NamedTuple{()} , t:: Tuple )
94- return sectors_isless ((), t)
96+ function product_sectors_isless (:: NamedTuple{()} , t:: Tuple )
97+ return product_sectors_isless ((), t)
9598end
96- function sectors_isless (t:: Tuple , :: NamedTuple{()} )
97- return sectors_isless (t, ())
99+ function product_sectors_isless (t:: Tuple , :: NamedTuple{()} )
100+ return product_sectors_isless (t, ())
98101end
99- function sectors_isless (s1, s2)
100- return isless (sym_sectors_insert_unspecified (s1, s2)... )
102+ function product_sectors_isless (s1, s2)
103+ return isless (sym_product_sectors_insert_unspecified (s1, s2)... )
101104end
102105
103- sectors_isless (:: NamedTuple , :: Tuple ) = throw (ArgumentError (" Not implemented" ))
104- sectors_isless (:: Tuple , :: NamedTuple ) = throw (ArgumentError (" Not implemented" ))
106+ product_sectors_isless (:: NamedTuple , :: Tuple ) = throw (ArgumentError (" Not implemented" ))
107+ product_sectors_isless (:: Tuple , :: NamedTuple ) = throw (ArgumentError (" Not implemented" ))
105108
106- sectors_type (:: Type{<:SectorProduct{T}} ) where {T} = T
109+ product_sectors_type (:: Type{<:SectorProduct{T}} ) where {T} = T
107110
108- function sectors_fusion_rule (sects1, sects2)
109- shared_sect = shared_sectors_fusion_rule (sectors_common (sects1, sects2)... )
110- diff_sect = SectorProduct (sectors_diff (sects1, sects2))
111+ function product_sectors_fusion_rule (sects1, sects2)
112+ shared_sect = shared_product_sectors_fusion_rule (
113+ product_sectors_common (sects1, sects2)...
114+ )
115+ diff_sect = SectorProduct (product_sectors_diff (sects1, sects2))
111116 return shared_sect × diff_sect
112117end
113118
114- # edge case with empty sectors
115- sectors_fusion_rule (sects:: Tuple , :: NamedTuple{()} ) = SectorProduct (sects)
116- sectors_fusion_rule (:: NamedTuple{()} , sects:: Tuple ) = SectorProduct (sects)
117- sectors_fusion_rule (sects:: NamedTuple , :: Tuple{} ) = SectorProduct (sects)
118- sectors_fusion_rule (:: Tuple{} , sects:: NamedTuple ) = SectorProduct (sects)
119+ # edge case with empty product_sectors
120+ product_sectors_fusion_rule (sects:: Tuple , :: NamedTuple{()} ) = SectorProduct (sects)
121+ product_sectors_fusion_rule (:: NamedTuple{()} , sects:: Tuple ) = SectorProduct (sects)
122+ product_sectors_fusion_rule (sects:: NamedTuple , :: Tuple{} ) = SectorProduct (sects)
123+ product_sectors_fusion_rule (:: Tuple{} , sects:: NamedTuple ) = SectorProduct (sects)
119124
120125function recover_style (T:: Type , fused)
121- style = sectors_symmetrystyle (T)
126+ style = product_sectors_symmetrystyle (T)
122127 return recover_sector_product_type (style, T, fused)
123128end
124129
@@ -146,11 +151,11 @@ function recover_sector_product_type(T::Type, c::AbstractSector)
146151end
147152
148153function recover_sector_product_type (T:: Type , c:: SectorProduct )
149- return recover_sector_product_type (T, sectors (c))
154+ return recover_sector_product_type (T, product_sectors (c))
150155end
151156
152157function recover_sector_product_type (T:: Type{<:SectorProduct} , sects)
153- return recover_sector_product_type (sectors_type (T), sects)
158+ return recover_sector_product_type (product_sectors_type (T), sects)
154159end
155160
156161function recover_sector_product_type (T:: Type , sects)
160165# ================================= Cartesian Product ====================================
161166× (c1:: AbstractSector , c2:: AbstractSector ) = × (SectorProduct (c1), SectorProduct (c2))
162167function × (p1:: SectorProduct , p2:: SectorProduct )
163- return SectorProduct (sectors_product ( sectors (p1), sectors (p2)))
168+ return SectorProduct (product_sectors_product ( product_sectors (p1), product_sectors (p2)))
164169end
165170
166171× (a, g:: AbstractUnitRange ) = × (to_gradedrange (a), g)
@@ -194,12 +199,14 @@ end
194199
195200# generic case: fusion returns a GradedAxes, even for fusion with Empty
196201function fusion_rule (:: NotAbelianStyle , s1:: SectorProduct , s2:: SectorProduct )
197- return to_gradedrange (sectors_fusion_rule (sectors (s1), sectors (s2)))
202+ return to_gradedrange (
203+ product_sectors_fusion_rule (product_sectors (s1), product_sectors (s2))
204+ )
198205end
199206
200207# Abelian case: fusion returns SectorProduct
201208function fusion_rule (:: AbelianStyle , s1:: SectorProduct , s2:: SectorProduct )
202- return sectors_fusion_rule ( sectors (s1), sectors (s2))
209+ return product_sectors_fusion_rule ( product_sectors (s1), product_sectors (s2))
203210end
204211
205212# lift ambiguities for TrivialSector
@@ -212,41 +219,41 @@ fusion_rule(::NotAbelianStyle, ::TrivialSector, c::SectorProduct) = to_gradedran
212219SectorProduct (t:: Tuple ) = _SectorProduct (t)
213220SectorProduct (sects:: AbstractSector... ) = SectorProduct (sects)
214221
215- function sectors_symmetrystyle (T:: Type{<:Tuple} )
222+ function product_sectors_symmetrystyle (T:: Type{<:Tuple} )
216223 return mapreduce (SymmetryStyle, combine_styles, fieldtypes (T); init= AbelianStyle ())
217224end
218225
219- sectors_product (:: NamedTuple{()} , l1:: Tuple ) = l1
220- sectors_product (l2:: Tuple , :: NamedTuple{()} ) = l2
221- sectors_product (l1:: Tuple , l2:: Tuple ) = (l1... , l2... )
226+ product_sectors_product (:: NamedTuple{()} , l1:: Tuple ) = l1
227+ product_sectors_product (l2:: Tuple , :: NamedTuple{()} ) = l2
228+ product_sectors_product (l1:: Tuple , l2:: Tuple ) = (l1... , l2... )
222229
223- sectors_trivial (type:: Type{<:Tuple} ) = trivial .(fieldtypes (type))
230+ product_sectors_trivial (type:: Type{<:Tuple} ) = trivial .(fieldtypes (type))
224231
225- function sectors_common (t1:: Tuple , t2:: Tuple )
232+ function product_sectors_common (t1:: Tuple , t2:: Tuple )
226233 n = min (length (t1), length (t2))
227234 return t1[begin : n], t2[begin : n]
228235end
229236
230- function sectors_diff (t1:: Tuple , t2:: Tuple )
237+ function product_sectors_diff (t1:: Tuple , t2:: Tuple )
231238 n1 = length (t1)
232239 n2 = length (t2)
233240 return n1 < n2 ? t2[(n1 + 1 ): end ] : t1[(n2 + 1 ): end ]
234241end
235242
236- function shared_sectors_fusion_rule (shared1:: T , shared2:: T ) where {T<: Tuple }
243+ function shared_product_sectors_fusion_rule (shared1:: T , shared2:: T ) where {T<: Tuple }
237244 fused = map (fusion_rule, shared1, shared2)
238245 return recover_style (T, fused)
239246end
240247
241- function sectors_insert_unspecified (t1:: Tuple , t2:: Tuple )
248+ function product_sectors_insert_unspecified (t1:: Tuple , t2:: Tuple )
242249 n1 = length (t1)
243250 return (t1... , trivial .(t2[(n1 + 1 ): end ])... )
244251end
245252
246253# =========================== Dictionary-like implementation =============================
247254function SectorProduct (nt:: NamedTuple )
248- sectors = sort_keys (nt)
249- return _SectorProduct (sectors )
255+ product_sectors = sort_keys (nt)
256+ return _SectorProduct (product_sectors )
250257end
251258
252259SectorProduct (; kws... ) = SectorProduct ((; kws... ))
@@ -257,38 +264,38 @@ function SectorProduct(pairs::Pair...)
257264 return SectorProduct (NamedTuple {keys} (vals))
258265end
259266
260- function sectors_symmetrystyle (NT:: Type{<:NamedTuple} )
267+ function product_sectors_symmetrystyle (NT:: Type{<:NamedTuple} )
261268 return mapreduce (SymmetryStyle, combine_styles, fieldtypes (NT); init= AbelianStyle ())
262269end
263270
264- function sectors_insert_unspecified (nt1:: NamedTuple , nt2:: NamedTuple )
265- diff1 = sectors_trivial (typeof (setdiff_keys (nt2, nt1)))
271+ function product_sectors_insert_unspecified (nt1:: NamedTuple , nt2:: NamedTuple )
272+ diff1 = product_sectors_trivial (typeof (setdiff_keys (nt2, nt1)))
266273 return sort_keys (union_keys (nt1, diff1))
267274end
268275
269- sectors_product (l1:: NamedTuple , :: Tuple{} ) = l1
270- sectors_product (:: Tuple{} , l2:: NamedTuple ) = l2
271- function sectors_product (l1:: NamedTuple , l2:: NamedTuple )
276+ product_sectors_product (l1:: NamedTuple , :: Tuple{} ) = l1
277+ product_sectors_product (:: Tuple{} , l2:: NamedTuple ) = l2
278+ function product_sectors_product (l1:: NamedTuple , l2:: NamedTuple )
272279 if length (intersect_keys (l1, l2)) > 0
273280 throw (ArgumentError (" Cannot define product of shared keys" ))
274281 end
275282 return union_keys (l1, l2)
276283end
277284
278- function sectors_trivial (type:: Type{<:NamedTuple{Keys}} ) where {Keys}
285+ function product_sectors_trivial (type:: Type{<:NamedTuple{Keys}} ) where {Keys}
279286 return NamedTuple {Keys} (trivial .(fieldtypes (type)))
280287end
281288
282- function sectors_common (nt1:: NamedTuple , nt2:: NamedTuple )
289+ function product_sectors_common (nt1:: NamedTuple , nt2:: NamedTuple )
283290 # SectorProduct(nt::NamedTuple) sorts keys at init
284291 @assert issorted (keys (nt1))
285292 @assert issorted (keys (nt2))
286293 return intersect_keys (nt1, nt2), intersect_keys (nt2, nt1)
287294end
288295
289- sectors_diff (nt1:: NamedTuple , nt2:: NamedTuple ) = symdiff_keys (nt1, nt2)
296+ product_sectors_diff (nt1:: NamedTuple , nt2:: NamedTuple ) = symdiff_keys (nt1, nt2)
290297
291- function shared_sectors_fusion_rule (shared1:: T , shared2:: T ) where {T<: NamedTuple }
298+ function shared_product_sectors_fusion_rule (shared1:: T , shared2:: T ) where {T<: NamedTuple }
292299 fused = map (fusion_rule, values (shared1), values (shared2))
293300 return recover_style (T, fused)
294301end
0 commit comments