Skip to content

Commit 1a2712c

Browse files
committed
Add missing functionality like tagging and priming
1 parent 0fd1ea2 commit 1a2712c

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

src/ITensorBase.jl

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module ITensorBase
22

3+
using Accessors: @set
34
using MapBroadcast: Mapped
45
using NamedDimsArrays:
56
NamedDimsArrays,
@@ -14,16 +15,29 @@ using NamedDimsArrays:
1415
name,
1516
named,
1617
nameddimsindices,
18+
setname,
1719
unname
1820

21+
const Tag = String
22+
const TagSet = Set{Tag}
23+
24+
tagset(tags::String) = Set(filter(!isempty, String.(strip.(split(tags, ",")))))
25+
1926
@kwdef struct IndexName <: AbstractName
2027
id::UInt64 = rand(UInt64)
2128
plev::Int = 0
22-
tags::Set{String} = Set{String}()
23-
namedtags::Dict{Symbol,String} = Dict{Symbol,String}()
29+
tags::TagSet = TagSet()
2430
end
2531
NamedDimsArrays.randname(n::IndexName) = IndexName()
2632

33+
tags(n::IndexName) = n.tags
34+
settags(n::IndexName, tags) = @set n.tags = tags
35+
addtags(n::IndexName, ts) = settags(n, tags(n) tagset(ts))
36+
37+
plev(n::IndexName) = n.plev
38+
setprime(n::IndexName, plev) = @set n.plev = plev
39+
prime(n::IndexName) = setprime(n, plev(n) + 1)
40+
2741
struct IndexVal{Value<:Integer} <: AbstractNamedInteger{Value,IndexName}
2842
value::Value
2943
name::IndexName
@@ -41,7 +55,15 @@ struct Index{T,Value<:AbstractUnitRange{T}} <: AbstractNamedUnitRange{T,Value,In
4155
name::IndexName
4256
end
4357

44-
Index(length::Int) = Index(Base.OneTo(length), IndexName())
58+
Index(length::Int; kwargs...) = Index(Base.OneTo(length), IndexName(; kwargs...))
59+
function Index(length::Int, tags::String; kwargs...)
60+
return Index(Base.OneTo(length), IndexName(; kwargs..., tags=tagset(tags)))
61+
end
62+
63+
tags(i::Index) = tags(name(i))
64+
addtags(i::Index, tags) = setname(i, addtags(name(i), tags))
65+
prime(i::Index) = setname(i, prime(name(i)))
66+
Base.adjoint(i::Index) = prime(i)
4567

4668
# Interface
4769
# TODO: Overload `Base.parent` instead.
@@ -127,9 +149,21 @@ using Accessors: @set
127149
setdenamed(a::ITensor, denamed) = (@set a.parent = denamed)
128150
setdenamed!(a::ITensor, denamed) = (a.parent = denamed)
129151

152+
function ITensor(elt::Type, I1::Index, I_rest::Index...)
153+
I = (I1, I_rest...)
154+
# TODO: Use `FillArrays.Zeros`.
155+
return ITensor(zeros(elt, length.(dename.(I))...), I)
156+
end
157+
130158
function ITensor(I1::Index, I_rest::Index...)
131159
I = (I1, I_rest...)
132160
return ITensor(Zeros{UnspecifiedZero}(length.(dename.(I))...), I)
133161
end
134162

163+
function ITensor()
164+
return ITensor(Zeros{UnspecifiedZero}(), ())
165+
end
166+
167+
include("quirks.jl")
168+
135169
end

src/quirks.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# TODO: Define this properly.
2+
dag(i::Index) = i
3+
hasqns(i::Index) = false
4+
dim(i::Index) = length(i)

0 commit comments

Comments
 (0)