Skip to content

Commit a9614a1

Browse files
authored
site[s] convenient constructors for unit ranges/axes (#21)
1 parent e08b46e commit a9614a1

File tree

5 files changed

+90
-5
lines changed

5 files changed

+90
-5
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "QuantumOperatorDefinitions"
22
uuid = "826dd319-6fd5-459a-a990-3a4f214664bf"
33
authors = ["ITensor developers <[email protected]> and contributors"]
4-
version = "0.1.5"
4+
version = "0.1.6"
55

66
[deps]
77
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

ext/QuantumOperatorDefinitionsITensorBaseExt/QuantumOperatorDefinitionsITensorBaseExt.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ function QuantumOperatorDefinitions.SiteType(r::Index)
2323
end
2424

2525
function (rangetype::Type{<:Index})(t::SiteType)
26-
return settag(rangetype(AbstractUnitRange(t)), "sitetype", String(name(t)))
26+
i = rangetype(AbstractUnitRange(t))
27+
i = settag(i, "sitetype", String(name(t)))
28+
if haskey(t, :site)
29+
i = settag(i, "site", string(t.site))
30+
end
31+
return i
2732
end
2833

2934
# TODO: Define in terms of `OpName` directly, and define a generic

src/sitetype.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,26 @@ to_dim(d::Integer) = d
9595
# TODO: Decide on this.
9696
# TODO: Move to `sitetype.jl`.
9797
default_sitetype() = SiteType"Qubit"()
98+
99+
# TODO: Do we want to define this?
100+
# (t::SiteType)() = AbstractUnitRange(t)
101+
102+
function site(rangetype::Type{<:AbstractUnitRange}, name::String; kwargs...)
103+
return rangetype(SiteType(name; kwargs...))
104+
end
105+
site(name::String; kwargs...) = site(AbstractUnitRange, name; kwargs...)
106+
107+
function sites(rangetype::Type{<:AbstractUnitRange}, name::String, positions; kwargs...)
108+
return map(position -> site(rangetype, name; site=position, kwargs...), positions)
109+
end
110+
function sites(
111+
rangetype::Type{<:AbstractUnitRange}, name::String, npositions::Integer; kwargs...
112+
)
113+
return sites(rangetype, name, Base.OneTo(npositions); kwargs...)
114+
end
115+
function sites(name::String, positions; kwargs...)
116+
return sites(AbstractUnitRange, name, positions; kwargs...)
117+
end
118+
function sites(name::String, npositions::Integer; kwargs...)
119+
return sites(AbstractUnitRange, name, Base.OneTo(npositions); kwargs...)
120+
end

test/test_basics.jl

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using QuantumOperatorDefinitions: OpName, SiteType, , expand, op, opexpr, state, nsites
1+
using QuantumOperatorDefinitions:
2+
OpName, SiteType, , expand, nsites, op, opexpr, site, sites, state
23
using LinearAlgebra: Diagonal, I
34
using Test: @test, @testset
45

@@ -217,6 +218,35 @@ const elts = (real_elts..., complex_elts...)
217218
@test op("X", 2) == op("X", Base.OneTo(2))
218219
@test op("X", 3) == op("X", Base.OneTo(3))
219220
end
221+
@testset "site, sites" begin
222+
s = site("Qudit"; dim=3)
223+
@test s === Base.OneTo(3)
224+
225+
s = site(AbstractUnitRange{Int32}, "Qudit"; dim=3)
226+
@test s === Base.OneTo(Int32(3))
227+
228+
for ss in (sites("Qudit", 4; dim=3), sites("Qudit", 2:5; dim=3))
229+
@test length(ss) == 4
230+
@test ss == map(Returns(Base.OneTo(3)), 1:4)
231+
for s in ss
232+
@test s === Base.OneTo(3)
233+
end
234+
end
235+
236+
for ss in (
237+
sites(AbstractUnitRange{Int32}, "Qudit", 4; dim=3),
238+
sites(AbstractUnitRange{Int32}, "Qudit", 2:5; dim=3),
239+
)
240+
@test length(ss) == 4
241+
@test ss == map(Returns(Base.OneTo(3)), 1:4)
242+
for s in ss
243+
@test s === Base.OneTo(Int32(3))
244+
end
245+
end
246+
247+
ss = sites("Qudit", (1, 2, 3); dim=3)
248+
@test ss === (Base.OneTo(3), Base.OneTo(3), Base.OneTo(3))
249+
end
220250
@testset "Electron/tJ" begin
221251
for (ns, x) in (
222252
(("0", "Emp"), [1, 0, 0, 0]),

test/test_itensorbaseext.jl

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
using ITensorBase: ITensor, Index, gettag, prime, settag
2-
using QuantumOperatorDefinitions: OpName, SiteType, StateName, op, state
1+
using ITensorBase: ITensor, Index, gettag, hastag, prime, settag
2+
using NamedDimsArrays: dename
3+
using QuantumOperatorDefinitions: OpName, SiteType, StateName, op, site, sites, state
34
using Test: @test, @testset
45

56
@testset "ITensorBaseExt" begin
@@ -61,4 +62,30 @@ using Test: @test, @testset
6162
@test a[i1′[2], i2′, i1[1], i2] == zeros(i2′, i2)
6263
@test a[i1′[1], i2′, i1[2], i2] == zeros(i2′, i2)
6364
@test a[i1′[2], i2′, i1[2], i2] == op("X", i2)
65+
66+
i = site(Index, "Qudit"; dim=3)
67+
@test dename(i) == Base.OneTo(3)
68+
@test gettag(i, "sitetype") == "Qudit"
69+
@test !hastag(i, "site")
70+
71+
for is in (
72+
sites(Index, "Qudit", 3; dim=3),
73+
sites(Index, "Qudit", 1:3; dim=3),
74+
sites(Index, "Qudit", (1, 2, 3); dim=3),
75+
)
76+
@test length(is) == 3
77+
for (pos, i) in pairs(is)
78+
@test dename(i) == Base.OneTo(3)
79+
@test gettag(i, "sitetype") == "Qudit"
80+
@test gettag(i, "site") == "$pos"
81+
end
82+
end
83+
84+
is = sites(Index, "Qudit", 2:4; dim=3)
85+
@test dename(is[1]) == Base.OneTo(3)
86+
@test gettag(is[1], "site") == "2"
87+
@test dename(is[2]) == Base.OneTo(3)
88+
@test gettag(is[2], "site") == "3"
89+
@test dename(is[3]) == Base.OneTo(3)
90+
@test gettag(is[3], "site") == "4"
6491
end

0 commit comments

Comments
 (0)