Skip to content

Commit ddb62d5

Browse files
committed
rename sectors product_sectors
1 parent 2fe8bbc commit ddb62d5

File tree

2 files changed

+120
-110
lines changed

2 files changed

+120
-110
lines changed

NDTensors/src/lib/SymmetrySectors/src/sector_product.jl

Lines changed: 82 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,40 @@ using ..GradedAxes: AbstractGradedUnitRange, GradedAxes, dual
77

88
# ===================================== Definition =======================================
99
struct SectorProduct{Sectors} <: AbstractSector
10-
sectors::Sectors
10+
product_sectors::Sectors
1111
global _SectorProduct(l) = new{typeof(l)}(l)
1212
end
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

2123
function quantum_dimension(::NotAbelianStyle, s::SectorProduct)
22-
return mapreduce(quantum_dimension, *, sectors(s))
24+
return mapreduce(quantum_dimension, *, product_sectors(s))
2325
end
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

2830
function trivial(type::Type{<:SectorProduct})
29-
return SectorProduct(sectors_trivial(sectors_type(type)))
31+
return SectorProduct(product_sectors_trivial(product_sectors_type(type)))
3032
end
3133

3234
# =================================== Base interface =====================================
3335
function Base.:(==)(A::SectorProduct, B::SectorProduct)
34-
return sectors_isequal(sectors(A), sectors(B))
36+
return product_sectors_isequal(product_sectors(A), product_sectors(B))
3537
end
3638

3739
function 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)
5052
sector_show(io::IO, k::Symbol, v) = print(io, "($k=$v,)")
5153

5254
function 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))
5456
end
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)
6366
end
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)...)
6770
end
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, (;))
7275
end
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)
7578
end
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)
7881
end
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, ())
8184
end
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, (;))
8992
end
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)
9295
end
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)
9598
end
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, ())
98101
end
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)...)
101104
end
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
112117
end
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

120125
function 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)
123128
end
124129

@@ -146,11 +151,11 @@ function recover_sector_product_type(T::Type, c::AbstractSector)
146151
end
147152

148153
function 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))
150155
end
151156

152157
function 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)
154159
end
155160

156161
function recover_sector_product_type(T::Type, sects)
@@ -160,7 +165,7 @@ end
160165
# ================================= Cartesian Product ====================================
161166
×(c1::AbstractSector, c2::AbstractSector) = ×(SectorProduct(c1), SectorProduct(c2))
162167
function ×(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)))
164169
end
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
196201
function 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+
)
198205
end
199206

200207
# Abelian case: fusion returns SectorProduct
201208
function 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))
203210
end
204211

205212
# lift ambiguities for TrivialSector
@@ -212,41 +219,41 @@ fusion_rule(::NotAbelianStyle, ::TrivialSector, c::SectorProduct) = to_gradedran
212219
SectorProduct(t::Tuple) = _SectorProduct(t)
213220
SectorProduct(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())
217224
end
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]
228235
end
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]
234241
end
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)
239246
end
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])...)
244251
end
245252

246253
# =========================== Dictionary-like implementation =============================
247254
function SectorProduct(nt::NamedTuple)
248-
sectors = sort_keys(nt)
249-
return _SectorProduct(sectors)
255+
product_sectors = sort_keys(nt)
256+
return _SectorProduct(product_sectors)
250257
end
251258

252259
SectorProduct(; kws...) = SectorProduct((; kws...))
@@ -257,38 +264,38 @@ function SectorProduct(pairs::Pair...)
257264
return SectorProduct(NamedTuple{keys}(vals))
258265
end
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())
262269
end
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))
267274
end
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)
276283
end
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)))
280287
end
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)
287294
end
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)
294301
end

0 commit comments

Comments
 (0)