Skip to content

Commit 4294dea

Browse files
committed
refactor label_fusion_rule
1 parent d5630db commit 4294dea

File tree

8 files changed

+26
-15
lines changed

8 files changed

+26
-15
lines changed

NDTensors/src/lib/Sectors/src/abstractcategory.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,14 @@ function fusion_rule(c1::AbstractCategory, c2::AbstractCategory)
5454
end
5555

5656
function fusion_rule(::NotAbelianStyle, c1::C, c2::C) where {C<:AbstractCategory}
57-
degen, labels = label_fusion_rule(C, category_label(c1), category_label(c2))
58-
return gradedrange(labelled.(degen, C.(labels)))
57+
degen, sectors = label_fusion_rule(C, category_label(c1), category_label(c2))
58+
return gradedrange(labelled.(degen, sectors))
5959
end
6060

6161
# abelian case: return Category
6262
function fusion_rule(::AbelianStyle, c1::C, c2::C) where {C<:AbstractCategory}
63-
return C(label_fusion_rule(C, category_label(c1), category_label(c2)))
63+
_, sectors = label_fusion_rule(C, category_label(c1), category_label(c2))
64+
return only(sectors)
6465
end
6566

6667
function label_fusion_rule(category_type::Type{<:AbstractCategory}, ::Any, ::Any)

NDTensors/src/lib/Sectors/src/category_definitions/fib.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ trivial(::Type{Fib}) = Fib(0)
3030
quantum_dimension(::NotAbelianStyle, f::Fib) = istrivial(f) ? 1.0 : ((1 + 5) / 2)
3131

3232
# Fusion rules identical to su2₃
33-
label_fusion_rule(::Type{Fib}, l1, l2) = label_fusion_rule(su2{3}, l1, l2)
33+
function label_fusion_rule(::Type{Fib}, l1, l2)
34+
degen, suk_sectors = label_fusion_rule(su2{3}, l1, l2)
35+
sectors = Fib.(category_label.(suk_sectors))
36+
return degen, sectors
37+
end
3438

3539
label_to_str(f::Fib) = istrivial(f) ? "1" : "τ"
3640

NDTensors/src/lib/Sectors/src/category_definitions/ising.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ trivial(::Type{Ising}) = Ising(0)
3030
quantum_dimension(::NotAbelianStyle, i::Ising) = (category_label(i) == 1//2) ? 2 : 1.0
3131

3232
# Fusion rules identical to su2₂
33-
label_fusion_rule(::Type{Ising}, l1, l2) = label_fusion_rule(su2{2}, l1, l2)
33+
function label_fusion_rule(::Type{Ising}, l1, l2)
34+
degen, suk_sectors = label_fusion_rule(su2{2}, l1, l2)
35+
sectors = Ising.(category_label.(suk_sectors))
36+
return degen, sectors
37+
end
3438

3539
# TODO: Use `Val` dispatch here?
3640
label_to_str(i::Ising) = ("1", "σ", "ψ")[twice(category_label(i)) + 1]

NDTensors/src/lib/Sectors/src/category_definitions/o2.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,5 @@ function label_fusion_rule(::Type{O2}, l1, l2)
7171
end
7272
end
7373
end
74-
return degens, labels
74+
return degens, O2.(labels)
7575
end

NDTensors/src/lib/Sectors/src/category_definitions/su.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ quantum_dimension(s::SU{2}) = category_label(s)[1] + 1
9292
GradedAxes.dual(s::SU{2}) = s
9393

9494
function label_fusion_rule(::Type{<:SU{2}}, s1, s2)
95-
labels = collect((i,) for i in (abs(s1[1] - s2[1])):2:(s1[1] + s2[1]))
96-
degen = ones(Int, length(labels))
97-
return degen, labels
95+
irreps = collect(SU{2}((i,)) for i in (abs(s1[1] - s2[1])):2:(s1[1] + s2[1]))
96+
degen = ones(Int, length(irreps))
97+
return degen, irreps
9898
end
9999

100100
# define angular momentum-like interface using half-integers
@@ -123,7 +123,7 @@ function label_fusion_rule(::Type{<:SU{3}}, left, right)
123123
end
124124

125125
if right[1] == 0 # avoid issues with singlet
126-
return [1], [left]
126+
return [1], [SU{3}(left)]
127127
end
128128

129129
left_row1 = left[1]
@@ -172,6 +172,6 @@ function label_fusion_rule(::Type{<:SU{3}}, left, right)
172172

173173
unique_labels = sort(unique(irreps))
174174
degen = [count(==(irr), irreps) for irr in unique_labels]
175-
176-
return degen, unique_labels
175+
sectors = SU{3}.(unique_labels)
176+
return degen, sectors
177177
end

NDTensors/src/lib/Sectors/src/category_definitions/su2k.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ trivial(::Type{su2{k}}) where {k} = su2{k}(0)
2222
function label_fusion_rule(::Type{su2{k}}, j1, j2) where {k}
2323
labels = collect(abs(j1 - j2):min(k - j1 - j2, j1 + j2))
2424
degen = ones(Int, length(labels))
25-
return degen, labels
25+
sectors = su2{k}.(labels)
26+
return degen, sectors
2627
end

NDTensors/src/lib/Sectors/src/category_definitions/u1.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ category_label(u::U1) = u.n
1919
trivial(::Type{U1}) = trivial(U1{Int})
2020
trivial(::Type{U1{T}}) where {T} = U1(T(0))
2121

22-
label_fusion_rule(::Type{<:U1}, n1, n2) = n1 + n2
22+
label_fusion_rule(T::Type{<:U1}, n1, n2) = [1], [T(n1 + n2)]
2323

2424
# hide label type in printing
2525
function Base.show(io::IO, u::U1)

NDTensors/src/lib/Sectors/src/category_definitions/zn.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ modulus(c::Z) = modulus(typeof(c))
1919
trivial(category_type::Type{<:Z}) = category_type(0)
2020

2121
function label_fusion_rule(category_type::Type{<:Z}, n1, n2)
22-
return (n1 + n2) % modulus(category_type)
22+
irrep = category_type((n1 + n2) % modulus(category_type))
23+
return [1], [irrep]
2324
end
2425

2526
GradedAxes.dual(c::Z) = typeof(c)(mod(-category_label(c), modulus(c)))

0 commit comments

Comments
 (0)