Skip to content

Commit 8abad01

Browse files
committed
split gradedisequal into labelled_isequal and space_isequal
1 parent 0f485a2 commit 8abad01

File tree

7 files changed

+126
-127
lines changed

7 files changed

+126
-127
lines changed

NDTensors/src/lib/GradedAxes/src/gradedunitrange.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,13 @@ function Base.OrdinalRange{T,T}(a::GradedOneTo{<:LabelledInteger{T}}) where {T}
3838
end
3939

4040
# == is just a range comparison that ignores labels. Need dedicated function to check equality.
41-
function gradedisequal(a1::AbstractUnitRange, a2::AbstractUnitRange)
42-
return blockisequal(a1, a2)
41+
blocklabels(::AbstractUnitRange) = nothing
42+
function labelled_isequal(a1::AbstractUnitRange, a2::AbstractUnitRange)
43+
return blockisequal(a1, a2) && (blocklabels(a1) == blocklabels(a2))
4344
end
4445

45-
function gradedisequal(a1::AbstractGradedUnitRange, a2::AbstractGradedUnitRange)
46-
return blockisequal(a1, a2) && (blocklabels(a1) == blocklabels(a2))
46+
function space_isequal(a1::AbstractUnitRange, a2::AbstractUnitRange)
47+
return (isdual(a1) == isdual(a2)) && labelled_isequal(a1, a2)
4748
end
4849

4950
# This is only needed in certain Julia versions below 1.10

NDTensors/src/lib/GradedAxes/src/unitrangedual.jl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,6 @@ BlockArrays.findblock(a::UnitRangeDual, index::Integer) = findblock(nondual(a),
108108

109109
blocklabels(a::UnitRangeDual) = dual.(blocklabels(nondual(a)))
110110

111-
gradedisequal(::UnitRangeDual, ::AbstractGradedUnitRange) = false
112-
gradedisequal(::AbstractGradedUnitRange, ::UnitRangeDual) = false
113-
function gradedisequal(a1::UnitRangeDual, a2::UnitRangeDual)
114-
return gradedisequal(nondual(a1), nondual(a2))
115-
end
116111
function BlockArrays.combine_blockaxes(a1::UnitRangeDual, a2::UnitRangeDual)
117112
return dual(combine_blockaxes(dual(a1), dual(a2)))
118113
end

NDTensors/src/lib/GradedAxes/test/test_basics.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ using BlockArrays:
1010
blocklengths,
1111
blocks
1212
using NDTensors.GradedAxes:
13-
GradedOneTo, GradedUnitRange, blocklabels, gradedisequal, gradedrange
13+
GradedOneTo, GradedUnitRange, blocklabels, labelled_isequal, gradedrange
1414
using NDTensors.LabelledNumbers: LabelledUnitRange, islabelled, label, labelled, unlabel
1515
using Test: @test, @test_broken, @testset
1616
@testset "GradedAxes basics" begin
@@ -41,7 +41,7 @@ using Test: @test, @test_broken, @testset
4141
@test label(x) == "y"
4242
end
4343
@test isnothing(iterate(a, labelled(5, "y")))
44-
@test gradedisequal(a, a)
44+
@test labelled_isequal(a, a)
4545
@test length(a) == 5
4646
@test step(a) == 1
4747
@test !islabelled(step(a))

NDTensors/src/lib/GradedAxes/test/test_dual.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using NDTensors.GradedAxes:
99
blocksortperm,
1010
dual,
1111
flip,
12-
gradedisequal,
12+
space_isequal,
1313
gradedrange,
1414
isdual,
1515
nondual
@@ -25,12 +25,12 @@ Base.isless(c1::U1, c2::U1) = c1.n < c2.n
2525
ad = dual(a)
2626
@test eltype(ad) == LabelledInteger{Int,U1}
2727

28-
@test gradedisequal(dual(ad), a)
29-
@test gradedisequal(nondual(ad), a)
30-
@test gradedisequal(nondual(a), a)
31-
@test gradedisequal(ad, ad)
32-
@test !gradedisequal(a, ad)
33-
@test !gradedisequal(ad, a)
28+
@test space_isequal(dual(ad), a)
29+
@test space_isequal(nondual(ad), a)
30+
@test space_isequal(nondual(a), a)
31+
@test space_isequal(ad, ad)
32+
@test !space_isequal(a, ad)
33+
@test !space_isequal(ad, a)
3434

3535
@test isdual(ad)
3636
@test !isdual(a)
@@ -66,8 +66,8 @@ end
6666
@testset "flip" begin
6767
a = gradedrange([U1(0) => 2, U1(1) => 3])
6868
ad = dual(a)
69-
@test gradedisequal(flip(a), dual(gradedrange([U1(0) => 2, U1(-1) => 3])))
70-
@test gradedisequal(flip(ad), gradedrange([U1(0) => 2, U1(-1) => 3]))
69+
@test space_isequal(flip(a), dual(gradedrange([U1(0) => 2, U1(-1) => 3])))
70+
@test space_isequal(flip(ad), gradedrange([U1(0) => 2, U1(-1) => 3]))
7171

7272
@test blocklabels(a) == [U1(0), U1(1)]
7373
@test blocklabels(dual(a)) == [U1(0), U1(-1)]

NDTensors/src/lib/GradedAxes/test/test_tensor_product.jl

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ using NDTensors.GradedAxes:
1111
fusion_product,
1212
flip,
1313
gradedrange,
14-
gradedisequal,
14+
labelled_isequal,
15+
space_isequal,
1516
isdual,
1617
tensor_product
1718

@@ -26,15 +27,15 @@ GradedAxes.fuse_labels(x::U1, y::U1) = U1(x.n + y.n)
2627
GradedAxes.fuse_labels(x::String, y::String) = x * y
2728

2829
g0 = OneToOne()
29-
@test gradedisequal(tensor_product(g0, g0), g0)
30+
@test labelled_isequal(tensor_product(g0, g0), g0)
3031

3132
a = gradedrange(["x" => 2, "y" => 3])
3233
b = tensor_product(a, a)
3334
@test b isa GradedOneTo
3435
@test length(b) == 25
3536
@test blocklength(b) == 4
3637
@test blocklengths(b) == [4, 6, 6, 9]
37-
@test gradedisequal(b, gradedrange(["xx" => 4, "yx" => 6, "xy" => 6, "yy" => 9]))
38+
@test labelled_isequal(b, gradedrange(["xx" => 4, "yx" => 6, "xy" => 6, "yy" => 9]))
3839

3940
c = tensor_product(a, a, a)
4041
@test c isa GradedOneTo
@@ -44,18 +45,20 @@ end
4445

4546
@testset "GradedAxes.fusion_product" begin
4647
g0 = OneToOne()
47-
@test gradedisequal(fusion_product(g0, g0), g0)
48+
@test labelled_isequal(fusion_product(g0, g0), g0)
4849

4950
a = gradedrange([U1(1) => 1, U1(2) => 3, U1(1) => 1])
5051

5152
b = fusion_product(a)
52-
@test gradedisequal(b, gradedrange([U1(1) => 2, U1(2) => 3]))
53+
@test labelled_isequal(b, gradedrange([U1(1) => 2, U1(2) => 3]))
5354

5455
c = fusion_product(a, a)
55-
@test gradedisequal(c, gradedrange([U1(2) => 4, U1(3) => 12, U1(4) => 9]))
56+
@test labelled_isequal(c, gradedrange([U1(2) => 4, U1(3) => 12, U1(4) => 9]))
5657

5758
d = fusion_product(a, a, a)
58-
@test gradedisequal(d, gradedrange([U1(3) => 8, U1(4) => 36, U1(5) => 54, U1(6) => 27]))
59+
@test labelled_isequal(
60+
d, gradedrange([U1(3) => 8, U1(4) => 36, U1(5) => 54, U1(6) => 27])
61+
)
5962
end
6063

6164
@testset "dual and tensor_product" begin
@@ -65,19 +68,19 @@ end
6568
b = fusion_product(ad)
6669
@test b isa GradedOneTo
6770
@test !isdual(b)
68-
@test gradedisequal(b, gradedrange([U1(-2) => 3, U1(-1) => 2]))
71+
@test space_isequal(b, gradedrange([U1(-2) => 3, U1(-1) => 2]))
6972

7073
c = fusion_product(ad, ad)
7174
@test c isa GradedOneTo
7275
@test !isdual(c)
73-
@test gradedisequal(c, gradedrange([U1(-4) => 9, U1(-3) => 12, U1(-2) => 4]))
76+
@test space_isequal(c, gradedrange([U1(-4) => 9, U1(-3) => 12, U1(-2) => 4]))
7477

7578
d = fusion_product(ad, a)
7679
@test !isdual(d)
77-
@test gradedisequal(d, gradedrange([U1(-1) => 6, U1(0) => 13, U1(1) => 6]))
80+
@test space_isequal(d, gradedrange([U1(-1) => 6, U1(0) => 13, U1(1) => 6]))
7881

7982
e = fusion_product(a, ad)
8083
@test !isdual(d)
81-
@test gradedisequal(e, d)
84+
@test space_isequal(e, d)
8285
end
8386
end

NDTensors/src/lib/Sectors/test/test_category_product.jl

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ using NDTensors.Sectors:
1414
recover_category_product_type,
1515
sector,
1616
trivial
17-
using NDTensors.GradedAxes: dual, fusion_product, gradedisequal, gradedrange
17+
using NDTensors.GradedAxes: dual, fusion_product, space_isequal, gradedrange
1818
using Test: @inferred, @test, @testset, @test_throws
1919

2020
macro inferred_latest(ex)
@@ -150,10 +150,10 @@ end
150150
@testset "Fusion of NonAbelian products" begin
151151
p0 = sector(SU2(0))
152152
ph = sector(SU2(1//2))
153-
@test gradedisequal((@inferred p0 ph), gradedrange([sector(SU2(1//2)) => 1]))
153+
@test space_isequal((@inferred p0 ph), gradedrange([sector(SU2(1//2)) => 1]))
154154

155155
phh = SU2(1//2) × SU2(1//2)
156-
@test gradedisequal(
156+
@test space_isequal(
157157
phh phh,
158158
gradedrange([
159159
(SU2(0) × SU2(0)) => 1,
@@ -162,7 +162,7 @@ end
162162
(SU2(1) × SU2(1)) => 1,
163163
]),
164164
)
165-
@test gradedisequal(
165+
@test space_isequal(
166166
(@inferred phh phh),
167167
gradedrange([
168168
(SU2(0) × SU2(0)) => 1,
@@ -177,10 +177,10 @@ end
177177
ı = Fib("1")
178178
τ = Fib("τ")
179179
s = ı × ı
180-
@test gradedisequal((@inferred s s), gradedrange([s => 1]))
180+
@test space_isequal((@inferred s s), gradedrange([s => 1]))
181181

182182
s = τ × τ
183-
@test gradedisequal(
183+
@test space_isequal(
184184
(@inferred s s),
185185
gradedrange([(ı × ı) => 1, (τ × ı) => 1, (ı × τ) => 1, (τ × τ) => 1]),
186186
)
@@ -191,26 +191,26 @@ end
191191
g = gradedrange([
192192
× Ising("1")) => 1, (τ × Ising("1")) => 1, (ı × ψ) => 1, (τ × ψ) => 1
193193
])
194-
@test gradedisequal((@inferred s s), g)
194+
@test space_isequal((@inferred s s), g)
195195
end
196196

197197
@testset "Fusion of mixed Abelian and NonAbelian products" begin
198198
p2h = U1(2) × SU2(1//2)
199199
p1h = U1(1) × SU2(1//2)
200-
@test gradedisequal(
200+
@test space_isequal(
201201
(@inferred p2h p1h), gradedrange([(U1(3) × SU2(0)) => 1, (U1(3) × SU2(1)) => 1])
202202
)
203203

204204
p1h1 = U1(1) × SU2(1//2) × Z{2}(1)
205-
@test gradedisequal(
205+
@test space_isequal(
206206
(@inferred p1h1 p1h1),
207207
gradedrange([(U1(2) × SU2(0) × Z{2}(0)) => 1, (U1(2) × SU2(1) × Z{2}(0)) => 1]),
208208
)
209209
end
210210

211211
@testset "Fusion of fully mixed products" begin
212212
s = U1(1) × SU2(1//2) × Ising("σ")
213-
@test gradedisequal(
213+
@test space_isequal(
214214
(@inferred s s),
215215
gradedrange([
216216
(U1(2) × SU2(0) × Ising("1")) => 1,
@@ -223,7 +223,7 @@ end
223223
ı = Fib("1")
224224
τ = Fib("τ")
225225
s = SU2(1//2) × U1(1) × τ
226-
@test gradedisequal(
226+
@test space_isequal(
227227
(@inferred s s),
228228
gradedrange([
229229
(SU2(0) × U1(2) × ı) => 1,
@@ -234,23 +234,23 @@ end
234234
)
235235

236236
s = U1(1) × ı × τ
237-
@test gradedisequal(
237+
@test space_isequal(
238238
(@inferred s s), gradedrange([(U1(2) × ı × ı) => 1, (U1(2) × ı × τ) => 1])
239239
)
240240
end
241241

242242
@testset "Fusion of different length Categories" begin
243243
@test sector(U1(1) × U1(0)) sector(U1(1)) == sector(U1(2) × U1(0))
244-
@test gradedisequal(
244+
@test space_isequal(
245245
(@inferred sector(SU2(0) × SU2(0)) sector(SU2(1))),
246246
gradedrange([sector(SU2(1) × SU2(0)) => 1]),
247247
)
248248

249-
@test gradedisequal(
249+
@test space_isequal(
250250
(@inferred sector(SU2(1) × U1(1)) sector(SU2(0))),
251251
gradedrange([sector(SU2(1) × U1(1)) => 1]),
252252
)
253-
@test gradedisequal(
253+
@test space_isequal(
254254
(@inferred sector(U1(1) × SU2(1)) sector(U1(2))),
255255
gradedrange([sector(U1(3) × SU2(1)) => 1]),
256256
)
@@ -266,7 +266,7 @@ end
266266
s2 = U1(0) × SU2(1//2) × Ising("1")
267267
g1 = gradedrange([s1 => 2])
268268
g2 = gradedrange([s2 => 1])
269-
@test gradedisequal(
269+
@test space_isequal(
270270
(@inferred fusion_product(g1, g2)),
271271
gradedrange([U1(1) × SU2(0) × Ising("σ") => 2, U1(1) × SU2(1) × Ising("σ") => 2]),
272272
)
@@ -418,14 +418,14 @@ end
418418
phb = sector(; B=SU2(1//2))
419419
phab = sector(; A=SU2(1//2), B=SU2(1//2))
420420

421-
@test gradedisequal(
421+
@test space_isequal(
422422
(@inferred pha pha), gradedrange([sector(; A=SU2(0)) => 1, sector(; A=SU2(1)) => 1])
423423
)
424-
@test gradedisequal((@inferred pha p0), gradedrange([pha => 1]))
425-
@test gradedisequal((@inferred p0 phb), gradedrange([phb => 1]))
426-
@test gradedisequal((@inferred pha phb), gradedrange([phab => 1]))
424+
@test space_isequal((@inferred pha p0), gradedrange([pha => 1]))
425+
@test space_isequal((@inferred p0 phb), gradedrange([phb => 1]))
426+
@test space_isequal((@inferred pha phb), gradedrange([phab => 1]))
427427

428-
@test gradedisequal(
428+
@test space_isequal(
429429
(@inferred phab phab),
430430
gradedrange([
431431
sector(; A=SU2(0), B=SU2(0)) => 1,
@@ -440,10 +440,10 @@ end
440440
ı = Fib("1")
441441
τ = Fib("τ")
442442
s = sector(; A=ı, B=ı)
443-
@test gradedisequal((@inferred s s), gradedrange([s => 1]))
443+
@test space_isequal((@inferred s s), gradedrange([s => 1]))
444444

445445
s = sector(; A=τ, B=τ)
446-
@test gradedisequal(
446+
@test space_isequal(
447447
(@inferred s s),
448448
gradedrange([
449449
sector(; A=ı, B=ı) => 1,
@@ -462,7 +462,7 @@ end
462462
sector(; A=ı, B=ψ) => 1,
463463
sector(; A=τ, B=ψ) => 1,
464464
])
465-
@test gradedisequal((@inferred s s), g)
465+
@test space_isequal((@inferred s s), g)
466466
end
467467

468468
@testset "Fusion of mixed Abelian and NonAbelian products" begin
@@ -476,15 +476,15 @@ end
476476
q21 = (N=U1(2),) × (J=SU2(1),)
477477
q22 = (N=U1(2),) × (J=SU2(2),)
478478

479-
@test gradedisequal((@inferred q1h q1h), gradedrange([q20 => 1, q21 => 1]))
480-
@test gradedisequal((@inferred q10 q1h), gradedrange([q2h => 1]))
481-
@test gradedisequal((@inferred q0h q1h), gradedrange([q10 => 1, q11 => 1]))
482-
@test gradedisequal((@inferred q11 q11), gradedrange([q20 => 1, q21 => 1, q22 => 1]))
479+
@test space_isequal((@inferred q1h q1h), gradedrange([q20 => 1, q21 => 1]))
480+
@test space_isequal((@inferred q10 q1h), gradedrange([q2h => 1]))
481+
@test space_isequal((@inferred q0h q1h), gradedrange([q10 => 1, q11 => 1]))
482+
@test space_isequal((@inferred q11 q11), gradedrange([q20 => 1, q21 => 1, q22 => 1]))
483483
end
484484

485485
@testset "Fusion of fully mixed products" begin
486486
s = sector(; A=U1(1), B=SU2(1//2), C=Ising("σ"))
487-
@test gradedisequal(
487+
@test space_isequal(
488488
(@inferred s s),
489489
gradedrange([
490490
sector(; A=U1(2), B=SU2(0), C=Ising("1")) => 1,
@@ -497,7 +497,7 @@ end
497497
ı = Fib("1")
498498
τ = Fib("τ")
499499
s = sector(; A=SU2(1//2), B=U1(1), C=τ)
500-
@test gradedisequal(
500+
@test space_isequal(
501501
(@inferred s s),
502502
gradedrange([
503503
sector(; A=SU2(0), B=U1(2), C=ı) => 1,
@@ -508,7 +508,7 @@ end
508508
)
509509

510510
s = sector(; A=τ, B=U1(1), C=ı)
511-
@test gradedisequal(
511+
@test space_isequal(
512512
(@inferred s s),
513513
gradedrange([sector(; B=U1(2), A=ı, C=ı) => 1, sector(; B=U1(2), A=τ, C=ı) => 1]),
514514
)
@@ -520,7 +520,7 @@ end
520520
g2 = gradedrange([s2 => 1])
521521
s3 = sector(; A=U1(1), B=SU2(0), C=Ising("σ"))
522522
s4 = sector(; A=U1(1), B=SU2(1), C=Ising("σ"))
523-
@test gradedisequal(
523+
@test space_isequal(
524524
(@inferred_latest fusion_product(g1, g2)), gradedrange([s3 => 2, s4 => 2])
525525
)
526526

@@ -529,7 +529,7 @@ end
529529
sAB = sector(; A=U1(1), B=SU2(1//2))
530530
gA = gradedrange([sA => 2])
531531
gB = gradedrange([sB => 1])
532-
@test gradedisequal((@inferred fusion_product(gA, gB)), gradedrange([sAB => 2]))
532+
@test space_isequal((@inferred fusion_product(gA, gB)), gradedrange([sAB => 2]))
533533
end
534534
end
535535

@@ -545,7 +545,7 @@ end
545545
@test typeof(s) == typeof(sector((;))) # empty NamedTuple is cast to Tuple{}
546546

547547
g0 = gradedrange([s => 2])
548-
@test gradedisequal((@inferred fusion_product(g0, g0)), gradedrange([s => 4]))
548+
@test space_isequal((@inferred fusion_product(g0, g0)), gradedrange([s => 4]))
549549

550550
@test (@inferred s × U1(1)) == sector(U1(1))
551551
@test (@inferred s × sector(U1(1))) == sector(U1(1))

0 commit comments

Comments
 (0)