Skip to content

Commit be9276f

Browse files
authored
Equality and hashing of IndexName (#90)
1 parent 22e2dc7 commit be9276f

File tree

3 files changed

+86
-63
lines changed

3 files changed

+86
-63
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
name = "ITensorBase"
22
uuid = "4795dd04-0d67-49bb-8f44-b89c448a1dc7"
33
authors = ["ITensor developers <support@itensor.org> and contributors"]
4-
version = "0.3.0"
4+
version = "0.3.1"
55

66
[deps]
77
Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
8+
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
89
DerivableInterfaces = "6c5e35bf-e59e-4898-b73c-732dcc4ba65f"
910
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
1011
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
@@ -26,6 +27,7 @@ ITensorBaseSparseArraysBaseExt = ["NamedDimsArrays", "SparseArraysBase"]
2627

2728
[compat]
2829
Accessors = "0.1.39"
30+
ConstructionBase = "1.6.0"
2931
DerivableInterfaces = "0.5"
3032
DiagonalArrays = "0.3"
3133
FillArrays = "1.13"

src/index.jl

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
using Accessors: @set
2-
using NamedDimsArrays:
3-
NamedDimsArrays,
4-
AbstractName,
5-
AbstractNamedInteger,
6-
AbstractNamedUnitRange,
7-
AbstractNamedVector,
8-
dename,
9-
name,
10-
randname,
11-
setname
2+
using NamedDimsArrays: NamedDimsArrays, AbstractName, AbstractNamedInteger,
3+
AbstractNamedUnitRange, AbstractNamedVector, dename, name, randname, setname
124
using Random: Random, AbstractRNG
135

146
tagpairstring(pair::Pair) = repr(first(pair)) * "=>" * repr(last(pair))
@@ -26,10 +18,8 @@ struct IndexName <: AbstractName
2618
plev::Int
2719
end
2820
function IndexName(
29-
rng::AbstractRNG = Random.default_rng();
30-
id::UInt64 = rand(rng, UInt64),
31-
tags = Dict{String, String}(),
32-
plev::Int = 0,
21+
rng::AbstractRNG = Random.default_rng(); id::UInt64 = rand(rng, UInt64),
22+
tags = Dict{String, String}(), plev::Int = 0,
3323
)
3424
return IndexName(id, Dict{String, String}(tags), plev)
3525
end
@@ -44,6 +34,22 @@ id(n::IndexName) = getfield(n, :id)
4434
tags(n::IndexName) = getfield(n, :tags)
4535
plev(n::IndexName) = getfield(n, :plev)
4636

37+
using ConstructionBase: getfields
38+
Base.:(==)(n1::IndexName, n2::IndexName) = getfields(n1) == getfields(n2)
39+
Base.isequal(n1::IndexName, n2::IndexName) = isequal(getfields(n1), getfields(n2))
40+
function Base.isless(n1::IndexName, n2::IndexName)
41+
t1 = (id(n1), plev(n1), keys(tags(n1)), collect(values(tags(n1))))
42+
t2 = (id(n2), plev(n2), keys(tags(n2)), collect(values(tags(n2))))
43+
return isless(t1, t2)
44+
end
45+
function Base.hash(n::IndexName, h::UInt)
46+
h = hash(:IndexName, h)
47+
h = hash(id(n), h)
48+
h = hash(tags(n), h)
49+
h = hash(plev(n), h)
50+
return h
51+
end
52+
4753
setid(n::IndexName, id) = @set n.id = id
4854
settags(n::IndexName, tags) = @set n.tags = tags
4955
setplev(n::IndexName, plev) = @set n.plev = plev

test/test_basics.jl

Lines changed: 63 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,74 @@
11
using DiagonalArrays: δ, delta, diagview
2-
using ITensorBase:
3-
ITensorBase,
4-
ITensor,
5-
Index,
6-
gettag,
7-
hastag,
8-
plev,
9-
prime,
10-
setplev,
11-
settag,
12-
tags,
13-
unsettag
2+
using ITensorBase: ITensorBase, ITensor, Index, IndexName, gettag, hastag, plev, prime,
3+
setplev, settag, tags, unsettag
144
using NamedDimsArrays: dename, inds, mapinds, name, named
155
using SparseArraysBase: oneelement
166
using LinearAlgebra: factorize
177
using Test: @test, @test_broken, @test_throws, @testset
188

199
const elts = (Float32, Float64, Complex{Float32}, Complex{Float64})
2010
@testset "ITensorBase" begin
21-
@testset "Basics" begin
11+
@testset "IndexName" begin
12+
n1 = IndexName(; id = UInt64(0))
13+
n2 = IndexName(; id = UInt64(0))
14+
@test n1 == n2
15+
@test isequal(n1, n2)
16+
@test hash(n1) hash(n2)
17+
18+
n1 = IndexName(; id = UInt64(0))
19+
n2 = IndexName(; id = UInt64(1))
20+
@test n1 n2
21+
@test !isequal(n1, n2)
22+
@test n1 < n2
23+
@test isless(n1, n2)
24+
@test hash(n1) hash(n2)
25+
26+
n1 = IndexName(; id = UInt64(0), plev = 0)
27+
n2 = IndexName(; id = UInt64(0), plev = 1)
28+
@test n1 n2
29+
@test !isequal(n1, n2)
30+
@test n1 < n2
31+
@test isless(n1, n2)
32+
@test hash(n1) hash(n2)
33+
end
34+
@testset "Index basics" begin
35+
i = Index(2)
36+
@test plev(i) == 0
37+
i = setplev(i, 2)
38+
@test plev(i) == 2
39+
40+
i = Index(2)
41+
i = settag(i, "X", "x")
42+
@test hastag(i, "X")
43+
@test !hastag(i, "Y")
44+
@test gettag(i, "X") == "x"
45+
i = unsettag(i, "X")
46+
@test isnothing(gettag(i, "X", nothing))
47+
@test !hastag(i, "X")
48+
@test !hastag(i, "Y")
49+
50+
i = Index(Base.OneTo(2))
51+
@test length(i) == named(2, name(i))
52+
@test dename(length(i)) == 2
53+
@test dename(i) == 1:2
54+
@test plev(i) == 0
55+
@test length(tags(i)) == 0
56+
57+
for i in (
58+
Index(2; tags = Dict(["X" => "Y"])),
59+
Index(2; tags = ["X" => "Y"]),
60+
Index(2; tags = ("X" => "Y",)),
61+
Index(2; tags = "X" => "Y"),
62+
)
63+
@test Int(length(i)) == 2
64+
@test hastag(i, "X")
65+
@test gettag(i, "X") == "Y"
66+
@test plev(i) == 0
67+
@test length(tags(i)) == 1
68+
end
69+
70+
end
71+
@testset "ITensor basics" begin
2272
elt = Float64
2373
i, j = Index.((2, 2))
2474
x = randn(elt, 2, 2)
@@ -57,41 +107,6 @@ const elts = (Float32, Float64, Complex{Float32}, Complex{Float64})
57107
@test a == b
58108
@test dename(a) == dename(b, (i, j, k))
59109
@test dename(a) == permutedims(dename(b), (2, 3, 1))
60-
61-
i = Index(2)
62-
@test plev(i) == 0
63-
i = setplev(i, 2)
64-
@test plev(i) == 2
65-
66-
i = Index(2)
67-
i = settag(i, "X", "x")
68-
@test hastag(i, "X")
69-
@test !hastag(i, "Y")
70-
@test gettag(i, "X") == "x"
71-
i = unsettag(i, "X")
72-
@test isnothing(gettag(i, "X", nothing))
73-
@test !hastag(i, "X")
74-
@test !hastag(i, "Y")
75-
76-
i = Index(Base.OneTo(2))
77-
@test length(i) == named(2, name(i))
78-
@test dename(length(i)) == 2
79-
@test dename(i) == 1:2
80-
@test plev(i) == 0
81-
@test length(tags(i)) == 0
82-
83-
for i in (
84-
Index(2; tags = Dict(["X" => "Y"])),
85-
Index(2; tags = ["X" => "Y"]),
86-
Index(2; tags = ("X" => "Y",)),
87-
Index(2; tags = "X" => "Y"),
88-
)
89-
@test Int(length(i)) == 2
90-
@test hastag(i, "X")
91-
@test gettag(i, "X") == "Y"
92-
@test plev(i) == 0
93-
@test length(tags(i)) == 1
94-
end
95110
end
96111
@testset "show" begin
97112
id = rand(UInt64)

0 commit comments

Comments
 (0)