Skip to content

Commit 5db5015

Browse files
committed
rename product_sectors to arguments
1 parent 5260dbd commit 5db5015

File tree

2 files changed

+97
-101
lines changed

2 files changed

+97
-101
lines changed

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

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

88
# ===================================== Definition =======================================
99
struct SectorProduct{Sectors} <: AbstractSector
10-
product_sectors::Sectors
10+
arguments::Sectors
1111
global _SectorProduct(l) = new{typeof(l)}(l)
1212
end
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 ====================================
1919
function SymmetryStyle(T::Type{<:SectorProduct})
20-
return product_sectors_symmetrystyle(product_sectors_type(T))
20+
return arguments_symmetrystyle(arguments_type(T))
2121
end
2222

2323
function quantum_dimension(::NotAbelianStyle, s::SectorProduct)
24-
return mapreduce(quantum_dimension, *, product_sectors(s))
24+
return mapreduce(quantum_dimension, *, arguments(s))
2525
end
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

3030
function trivial(type::Type{<:SectorProduct})
31-
return SectorProduct(product_sectors_trivial(product_sectors_type(type)))
31+
return SectorProduct(arguments_trivial(arguments_type(type)))
3232
end
3333

3434
# =================================== Base interface =====================================
3535
function Base.:(==)(A::SectorProduct, B::SectorProduct)
36-
return product_sectors_isequal(product_sectors(A), product_sectors(B))
36+
return arguments_isequal(arguments(A), arguments(B))
3737
end
3838

3939
function 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)
5252
sector_show(io::IO, k::Symbol, v) = print(io, "($k=$v,)")
5353

5454
function 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))
5656
end
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)
6667
end
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)...)
7071
end
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
8182
end
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, (;))
8591
end
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)
8894
end
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)
9197
end
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, ())
94100
end
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)...)
97103
end
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))
116110
function ×(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)))
118112
end
119113

120114
×(a, g::AbstractUnitRange) = ×(to_gradedrange(a), g)
@@ -148,9 +142,7 @@ end
148142

149143
# generic case: fusion returns a GradedAxes, even for fusion with Empty
150144
function 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)))
154146
end
155147

156148
# Abelian case: fusion returns SectorProduct
@@ -164,32 +156,38 @@ fusion_rule(::AbelianStyle, ::TrivialSector, c::SectorProduct) = c
164156
fusion_rule(::NotAbelianStyle, c::SectorProduct, ::TrivialSector) = to_gradedrange(c)
165157
fusion_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 =================================
168168
SectorProduct(t::Tuple) = _SectorProduct(t)
169169
SectorProduct(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())
173173
end
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]
184182
end
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]
190188
end
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
)
200198
end
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])...)
205203
end
206204

207205
# =========================== Dictionary-like implementation =============================
208206
function SectorProduct(nt::NamedTuple)
209-
product_sectors = sort_keys(nt)
210-
return _SectorProduct(product_sectors)
207+
arguments = sort_keys(nt)
208+
return _SectorProduct(arguments)
211209
end
212210

213211
SectorProduct(; kws...) = SectorProduct((; kws...))
@@ -218,42 +216,40 @@ function SectorProduct(pairs::Pair...)
218216
return SectorProduct(NamedTuple{keys}(vals))
219217
end
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())
223221
end
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))
228226
end
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)
237233
end
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)))
241237
end
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)
248244
end
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

252248
function map_blocklabels(f, r::AbstractUnitRange)
253249
return gradedrange(labelled.(unlabel.(blocklengths(r)), f.(blocklabels(r))))
254250
end
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)
259255
end

0 commit comments

Comments
 (0)