Skip to content

Commit d84df4e

Browse files
committed
more tolerant on missing sectors
1 parent d0b81d9 commit d84df4e

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

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

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,31 +58,42 @@ end
5858
# - ordered-like with a Tuple
5959
# - dictionary-like with a NamedTuple
6060

61-
sectors_isequal(o1::Tuple, o2::Tuple) = (o1 == o2)
61+
function sectors_isequal(s1, s2)
62+
return ==(sym_sectors_insert_unspecified(s1, s2)...)
63+
end
64+
65+
# get clean results when mixing implementations
6266
function sectors_isequal(nt::NamedTuple, ::Tuple{})
6367
return sectors_isequal(nt, (;))
6468
end
6569
function sectors_isequal(::Tuple{}, nt::NamedTuple)
6670
return sectors_isequal((;), nt)
6771
end
68-
function sectors_isequal(nt1::NamedTuple, nt2::NamedTuple)
69-
return ==(sym_sectors_insert_unspecified(nt1, nt2)...)
72+
function sectors_isequal(::NamedTuple{()}, t::Tuple)
73+
return sectors_isequal((), t)
7074
end
71-
72-
# get clean results when mixing implementations
75+
function sectors_isequal(t::Tuple, ::NamedTuple{()})
76+
return sectors_isequal(t, ())
77+
end
78+
sectors_isequal(::Tuple{}, ::NamedTuple{()}) = true
79+
sectors_isequal(::NamedTuple{()}, ::Tuple{}) = true
7380
sectors_isequal(::Tuple, ::NamedTuple) = false
7481
sectors_isequal(::NamedTuple, ::Tuple) = false
7582

76-
sectors_isless(::Tuple, ::Tuple) = throw(ArgumentError("Not implemented"))
77-
sectors_isless(t1::T, t2::T) where {T<:Tuple} = t1 < t2
7883
function sectors_isless(nt::NamedTuple, ::Tuple{})
7984
return sectors_isless(nt, (;))
8085
end
8186
function sectors_isless(::Tuple{}, nt::NamedTuple)
8287
return sectors_isless((;), nt)
8388
end
84-
function sectors_isless(nt1::NamedTuple, nt2::NamedTuple)
85-
return isless(sym_sectors_insert_unspecified(nt1, nt2)...)
89+
function sectors_isless(::NamedTuple{()}, t::Tuple)
90+
return sectors_isless((), t)
91+
end
92+
function sectors_isless(t::Tuple, ::NamedTuple{()})
93+
return sectors_isless(t, ())
94+
end
95+
function sectors_isless(s1, s2)
96+
return isless(sym_sectors_insert_unspecified(s1, s2)...)
8697
end
8798

8899
sectors_isless(::NamedTuple, ::Tuple) = throw(ArgumentError("Not implemented"))
@@ -223,6 +234,12 @@ function shared_sectors_fusion_rule(shared1::T, shared2::T) where {T<:Tuple}
223234
return recover_style(T, fused)
224235
end
225236

237+
function sym_sectors_insert_unspecified(t1::Tuple, t2::Tuple)
238+
n1 = length(t1)
239+
n2 = length(t2)
240+
return (t1..., trivial.(t2[(n1 + 1):end])...), (t2..., trivial.(t1[(n2 + 1):end])...)
241+
end
242+
226243
# =========================== Dictionary-like implementation =============================
227244
function SectorProduct(nt::NamedTuple)
228245
sectors = sort_keys(nt)

NDTensors/src/lib/SymmetrySectors/test/test_sector_product.jl

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,22 @@ end
7171
end
7272

7373
@testset "Ordered comparisons" begin
74-
# convention: sectors must have same length to evaluate as equal
74+
# convention: missing sectors are filled with singlets
7575
@test SectorProduct(U1(1), SU2(1)) == SectorProduct(U1(1), SU2(1))
7676
@test SectorProduct(U1(1), SU2(0)) != SectorProduct(U1(1), SU2(1))
7777
@test SectorProduct(U1(0), SU2(1)) != SectorProduct(U1(1), SU2(1))
78-
@test SectorProduct(U1(1)) != SectorProduct(U1(1), U1(0))
78+
@test SectorProduct(U1(1)) != U1(1)
79+
@test SectorProduct(U1(1)) == SectorProduct(U1(1), U1(0))
80+
@test SectorProduct(U1(1)) != SectorProduct(U1(1), U1(1))
7981
@test SectorProduct(U1(0), SU2(0)) == TrivialSector()
82+
@test SectorProduct(U1(0), SU2(0)) == SectorProduct(TrivialSector(), SU2(0))
83+
@test SectorProduct(U1(0), SU2(0)) == SectorProduct(U1(0), TrivialSector())
84+
@test SectorProduct(U1(0), SU2(0)) == SectorProduct(TrivialSector(), TrivialSector())
8085

81-
# convention: sectors must have same length to be compared
8286
@test SectorProduct(U1(0)) < SectorProduct((U1(1)))
8387
@test SectorProduct(U1(0), U1(2)) < SectorProduct((U1(1)), U1(0))
84-
@test_throws ArgumentError SectorProduct(U1(0)) < SectorProduct(U1(1), U1(2))
88+
@test SectorProduct(U1(0)) < SectorProduct(U1(0), U1(1))
89+
@test SectorProduct(U1(0)) > SectorProduct(U1(0), U1(-1))
8590
end
8691

8792
@testset "Quantum dimension and GradedUnitRange" begin
@@ -596,13 +601,13 @@ end
596601

597602
# Empty behaves as empty NamedTuple
598603
@test s != U1(0)
599-
@test s != SectorProduct(U1(0))
604+
@test s == SectorProduct(U1(0))
600605
@test s != SectorProduct(; A=U1(1))
601606
@test s == SectorProduct(; A=U1(0))
602607
@test SectorProduct(; A=U1(0)) == s
603608

604609
@test !(s < s)
605-
@test_throws ArgumentError s < SectorProduct(U1(0))
610+
@test s < SectorProduct(U1(1))
606611
@test s < SectorProduct(; A=U1(1))
607612
@test s > SectorProduct(; A=U1(-1))
608613
@test !(s < SectorProduct(; A=U1(0)))

0 commit comments

Comments
 (0)