Skip to content

Commit 21ae82b

Browse files
authored
Add delta constructors and other missing constructors (#22)
1 parent 4b837c2 commit 21ae82b

File tree

6 files changed

+84
-37
lines changed

6 files changed

+84
-37
lines changed

Project.toml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ITensorBase"
22
uuid = "4795dd04-0d67-49bb-8f44-b89c448a1dc7"
33
authors = ["ITensor developers <[email protected]> and contributors"]
4-
version = "0.1.10"
4+
version = "0.1.11"
55

66
[deps]
77
Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
@@ -14,9 +14,16 @@ UnallocatedArrays = "43c9e47c-e622-40fb-bf18-a09fc8c466b6"
1414
UnspecifiedTypes = "42b3faec-625b-4613-8ddc-352bf9672b8d"
1515
VectorInterface = "409d34a3-91d5-4945-b6ec-7529ddf182d8"
1616

17+
[weakdeps]
18+
DiagonalArrays = "74fd4be6-21e2-4f6f-823a-4360d37c7a77"
19+
20+
[extensions]
21+
ITensorBaseDiagonalArraysExt = "DiagonalArrays"
22+
1723
[compat]
1824
Accessors = "0.1.39"
1925
DerivableInterfaces = "0.3.7"
26+
DiagonalArrays = "0.2.3"
2027
FillArrays = "1.13.0"
2128
LinearAlgebra = "1.10"
2229
MapBroadcast = "0.1.5"
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module ITensorBaseDiagonalArraysExt
2+
3+
using DiagonalArrays: DiagonalArrays, δ, delta
4+
using ITensorBase: ITensor, Index
5+
6+
# TODO: Define more generic definitions in `NamedDimsArraysDiagonalArraysExt`.
7+
function DiagonalArrays.delta(elt::Type{<:Number}, is::Tuple{Index,Vararg{Index}})
8+
return ITensor(delta(elt, Int.(length.(is))), is)
9+
end
10+
function DiagonalArrays.δ(elt::Type{<:Number}, is::Tuple{Index,Vararg{Index}})
11+
return delta(elt, is)
12+
end
13+
DiagonalArrays.delta(is::Tuple{Index,Vararg{Index}}) = delta(Bool, is)
14+
DiagonalArrays.δ(is::Tuple{Index,Vararg{Index}}) = delta(is)
15+
function DiagonalArrays.delta(elt::Type{<:Number}, i1::Index, i_rest::Index...)
16+
return delta(elt, (i1, i_rest...))
17+
end
18+
function DiagonalArrays.δ(elt::Type{<:Number}, i1::Index, i_rest::Index...)
19+
return delta(elt, i1, i_rest...)
20+
end
21+
function DiagonalArrays.delta(i1::Index, i_rest::Index...)
22+
return delta((i1, i_rest...))
23+
end
24+
function DiagonalArrays.δ(i1::Index, i_rest::Index...)
25+
return delta(i1, i_rest...)
26+
end
27+
28+
end

src/abstractitensor.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ end
8484
Base.parent(a::ITensor) = a.parent
8585
NamedDimsArrays.nameddimsindices(a::ITensor) = a.nameddimsindices
8686

87+
function ITensor(parent::AbstractArray, i1::Index, i_rest::Index...)
88+
return ITensor(parent, (i1, i_rest...))
89+
end
90+
function ITensor(parent::AbstractArray)
91+
return ITensor(parent, ())
92+
end
93+
8794
using Accessors: @set
8895
setdenamed(a::ITensor, denamed) = (@set a.parent = denamed)
8996
setdenamed!(a::ITensor, denamed) = (a.parent = denamed)

src/quirks.jl

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,6 @@ dim(a::AbstractITensor) = Int(length(a))
1212
hasqns(i::Index) = false
1313
# TODO: Define this properly.
1414
hasqns(i::AbstractITensor) = false
15-
# TODO: Deprecate, and/or decide on aliasing behavior of `ITensor`.
16-
itensor(parent::AbstractArray, nameddimsindices) = ITensor(parent, nameddimsindices)
17-
function itensor(parent::AbstractArray, i1::Index, i_rest::Index...)
18-
return ITensor(parent, (i1, i_rest...))
19-
end
20-
# TODO: Deprecate.
21-
order(a::AbstractArray) = ndims(a)
22-
# TODO: Deprecate.
23-
using NamedDimsArrays: aligndims
24-
permute(a::AbstractITensor, dimnames) = aligndims(a, dimnames)
2515

2616
# This seems to be needed to get broadcasting working.
2717
# TODO: Investigate this and see if we can get rid of it.
@@ -30,11 +20,12 @@ Base.Broadcast.extrude(a::AbstractITensor) = a
3020
# TODO: Generalize this.
3121
# Maybe define it as `oneelement`, and base it on
3222
# `FillArrays.OneElement` (https://juliaarrays.github.io/FillArrays.jl/stable/#FillArrays.OneElement).
33-
function onehot(iv::Pair{<:Index,<:Int})
23+
function onehot(elt::Type{<:Number}, iv::Pair{<:Index,<:Int})
3424
a = ITensor(first(iv))
35-
a[last(iv)] = one(Bool)
25+
a[last(iv)] = one(elt)
3626
return a
3727
end
28+
onehot(iv::Pair{<:Index,<:Int}) = onehot(Bool, iv)
3829

3930
# TODO: This is just a stand-in for truncated SVD
4031
# that only makes use of `maxdim`, just to get some
@@ -79,12 +70,3 @@ function factorize(
7970
end
8071
return F1, F2, (; truncerr=zero(Bool),)
8172
end
82-
83-
# TODO: Used in `ITensorMPS.jl`, decide where or if to define it.
84-
# Ideally this would just be a zero-dimensional `ITensor` wrapping
85-
# a special type, like `Zeros{UnspecifiedZero()}()`.
86-
struct OneITensor <: AbstractITensor end
87-
Base.size(::OneITensor) = ()
88-
Base.:*(::OneITensor, ::OneITensor) = OneITensor()
89-
Base.:*(::OneITensor, a::ITensor) = a
90-
Base.:*(a::ITensor, ::OneITensor) = a

test/Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[deps]
22
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
3+
DiagonalArrays = "74fd4be6-21e2-4f6f-823a-4360d37c7a77"
34
ITensorBase = "4795dd04-0d67-49bb-8f44-b89c448a1dc7"
45
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
56
NamedDimsArrays = "60cbd0c0-df58-4cb7-918c-6f5607b73fde"

test/test_basics.jl

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,43 @@
11
using ITensorBase: ITensorBase, ITensor, Index, gettag, inds, plev, prime, settag, unsettag
2+
using DiagonalArrays: δ, delta, diagview
23
using NamedDimsArrays: unname
3-
using Test: @test, @testset
4+
using Test: @test, @test_broken, @testset
45

56
@testset "ITensorBase" begin
6-
i, j = Index.((2, 2))
7-
x = randn(2, 2)
8-
a = ITensor(x, (i, j))
9-
@test unname(a) == x
10-
@test plev(i) == 0
11-
@test plev(prime(i)) == 1
12-
a′ = prime(a)
13-
@test unname(a′) == x
14-
@test issetequal(inds(a′), (prime(i), prime(j)))
7+
@testset "Basics" begin
8+
i, j = Index.((2, 2))
9+
x = randn(2, 2)
10+
for a in (ITensor(x, i, j), ITensor(x, (i, j)))
11+
@test unname(a) == x
12+
@test plev(i) == 0
13+
@test plev(prime(i)) == 1
14+
a′ = prime(a)
15+
@test unname(a′) == x
16+
@test issetequal(inds(a′), (prime(i), prime(j)))
17+
end
1518

16-
i = Index(2)
17-
i = settag(i, "X", "x")
18-
@test gettag(i, "X") == "x"
19-
i = unsettag(i, "X")
20-
@test isnothing(gettag(i, "X", nothing))
19+
i = Index(2)
20+
i = settag(i, "X", "x")
21+
@test gettag(i, "X") == "x"
22+
i = unsettag(i, "X")
23+
@test isnothing(gettag(i, "X", nothing))
24+
end
25+
@testset "delta" begin
26+
i, j = Index.((2, 2))
27+
for a in (
28+
delta(i, j),
29+
delta(Bool, i, j),
30+
delta((i, j)),
31+
delta(Bool, (i, j)),
32+
δ(i, j),
33+
δ(Bool, i, j),
34+
δ((i, j)),
35+
δ(Bool, (i, j)),
36+
)
37+
@test eltype(a) === Bool
38+
# TODO: Fix this.
39+
@test_broken diagview(a)
40+
@test diagview(unname(a)) == ones(2)
41+
end
42+
end
2143
end

0 commit comments

Comments
 (0)