diff --git a/Project.toml b/Project.toml index bf82db8..bb91db9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ITensorBase" uuid = "4795dd04-0d67-49bb-8f44-b89c448a1dc7" authors = ["ITensor developers and contributors"] -version = "0.2.14" +version = "0.2.15" [deps] Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" @@ -34,7 +34,7 @@ FillArrays = "1.13" GradedArrays = "0.4" LinearAlgebra = "1.10" MapBroadcast = "0.1.5" -NamedDimsArrays = "0.7" +NamedDimsArrays = "0.8" Random = "1.10" SparseArraysBase = "0.7" TensorAlgebra = "0.3, 0.4" diff --git a/docs/Project.toml b/docs/Project.toml index 4e9903b..f03ebb5 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -8,4 +8,4 @@ NamedDimsArrays = "60cbd0c0-df58-4cb7-918c-6f5607b73fde" ITensorBase = "0.2" Documenter = "1" Literate = "2" -NamedDimsArrays = "0.7" +NamedDimsArrays = "0.8" diff --git a/examples/Project.toml b/examples/Project.toml index 2b876e5..eff2cfd 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -6,4 +6,4 @@ NamedDimsArrays = "60cbd0c0-df58-4cb7-918c-6f5607b73fde" [compat] ITensorBase = "0.2" LinearAlgebra = "1.10" -NamedDimsArrays = "0.7" +NamedDimsArrays = "0.8" diff --git a/src/abstractitensor.jl b/src/abstractitensor.jl index 825cfe6..3702a4a 100644 --- a/src/abstractitensor.jl +++ b/src/abstractitensor.jl @@ -5,14 +5,12 @@ using NamedDimsArrays: NamedDimsArray, dename, dimnames, - mapnameddimsindices, - nameddimsindices, - replacenameddimsindices, - setnameddimsindices + inds, + mapinds abstract type AbstractITensor <: AbstractNamedDimsArray{Any, Any} end -NamedDimsArrays.nameddimsarraytype(::Type{<:IndexName}) = ITensor +NamedDimsArrays.nameddimstype(::Type{<:IndexName}) = ITensor Base.ndims(::Type{<:AbstractITensor}) = Any @@ -82,15 +80,15 @@ end mutable struct ITensor <: AbstractITensor parent::AbstractArray - nameddimsindices + inds function ITensor(parent::AbstractArray, dims) # This checks the shapes of the inputs. - nameddimsindices = NamedDimsArrays.to_nameddimsindices(parent, dims) - return new(parent, nameddimsindices) + inds = NamedDimsArrays.to_inds(parent, dims) + return new(parent, inds) end end Base.parent(a::ITensor) = getfield(a, :parent) -NamedDimsArrays.nameddimsindices(a::ITensor) = getfield(a, :nameddimsindices) +NamedDimsArrays.inds(a::ITensor) = getfield(a, :inds) NamedDimsArrays.dename(a::ITensor) = parent(a) function ITensor(parent::AbstractArray, i1::Index, i_rest::Index...) @@ -118,38 +116,3 @@ end function ITensor() return ITensor(Zeros{UnspecifiedZero}(), ()) end - -inds(a::AbstractITensor) = nameddimsindices(a) -setinds(a::AbstractITensor, inds) = setnameddimsindices(a, inds) - -function uniqueinds(a1::AbstractITensor, a_rest::AbstractITensor...) - return setdiff(inds(a1), inds.(a_rest)...) -end -function uniqueind(a1::AbstractITensor, a_rest::AbstractITensor...) - return only(uniqueinds(a1, a_rest...)) -end - -function commoninds(a1::AbstractITensor, a_rest::AbstractITensor...) - return intersect(inds(a1), inds.(a_rest)...) -end -function commonind(a1::AbstractITensor, a_rest::AbstractITensor...) - return only(commoninds(a1, a_rest...)) -end - -function replaceinds(a::AbstractITensor, replacements::Pair...) - return replacenameddimsindices(a, replacements...) -end -function replaceinds(f, a::AbstractITensor) - return replacenameddimsindices(f, a) -end - -function mapinds(f, a::AbstractITensor) - return mapnameddimsindices(f, a) -end - -prime(a::AbstractITensor) = replaceinds(prime, a) -noprime(a::AbstractITensor) = replaceinds(noprime, a) -sim(a::AbstractITensor) = replaceinds(sim, a) - -using VectorInterface: VectorInterface, scalartype -VectorInterface.scalartype(a::AbstractITensor) = scalartype(unallocatable(a)) diff --git a/src/index.jl b/src/index.jl index adf2089..4778d9e 100644 --- a/src/index.jl +++ b/src/index.jl @@ -33,13 +33,20 @@ function IndexName( ) return IndexName(id, Dict{String, String}(tags), plev) end -NamedDimsArrays.randname(rng::AbstractRNG, ::Type{<:IndexName}) = IndexName(rng) +function NamedDimsArrays.randname(rng::AbstractRNG, n::IndexName) + return setid(n, rand(rng, UInt64)) +end +function NamedDimsArrays.randname(rng::AbstractRNG, ::Type{<:IndexName}) + return IndexName(rng) +end -id(n::IndexName) = n.id -tags(n::IndexName) = n.tags -plev(n::IndexName) = n.plev +id(n::IndexName) = getfield(n, :id) +tags(n::IndexName) = getfield(n, :tags) +plev(n::IndexName) = getfield(n, :plev) +setid(n::IndexName, id) = @set n.id = id settags(n::IndexName, tags) = @set n.tags = tags +setplev(n::IndexName, plev) = @set n.plev = plev hastag(n::IndexName, tagname::String) = haskey(tags(n), tagname) @@ -56,10 +63,8 @@ function unsettag(n::IndexName, tagname::String) return settags(n, newtags) end -setprime(n::IndexName, plev) = @set n.plev = plev -prime(n::IndexName) = setprime(n, plev(n) + 1) -noprime(n::IndexName) = setprime(n, 0) -sim(n::IndexName) = randname(n) +prime(n::IndexName) = setplev(n, plev(n) + 1) +noprime(n::IndexName) = setplev(n, 0) function Base.show(io::IO, i::IndexName) idstr = "id=$(id(i) % 1000)" @@ -82,7 +87,9 @@ NamedDimsArrays.name(i::IndexVal) = i.name # Constructor NamedDimsArrays.named(i::Integer, name::IndexName) = IndexVal(i, name) -struct Index{T, Value <: AbstractUnitRange{T}} <: AbstractNamedUnitRange{T, Value, IndexName} +struct Index{ + T, Value <: AbstractUnitRange{T}, + } <: AbstractNamedUnitRange{T, Value, IndexName} value::Value name::IndexName end @@ -117,13 +124,9 @@ gettag(i::Index, tagname::String, default) = gettag(name(i), tagname, default) settag(i::Index, tagname::String, tag::String) = setname(i, settag(name(i), tagname, tag)) unsettag(i::Index, tagname::String) = setname(i, unsettag(name(i), tagname)) -setprime(i::Index, plev) = setname(i, setprime(name(i), plev)) +setplev(i::Index, plev) = setname(i, setplev(name(i), plev)) prime(i::Index) = setname(i, prime(name(i))) noprime(i::Index) = setname(i, noprime(name(i))) -sim(i::Index) = setname(i, sim(name(i))) - -# TODO: Delete this definition? -Base.adjoint(i::Index) = prime(i) # Interface # TODO: Overload `Base.parent` instead. diff --git a/src/quirks.jl b/src/quirks.jl index 111ba09..d8c6ba8 100644 --- a/src/quirks.jl +++ b/src/quirks.jl @@ -10,6 +10,32 @@ dim(i::Index) = Int(length(i)) # `unname(length(i))` directly. dim(a::AbstractITensor) = Int(length(a)) +# TODO: Delete this definition? +Base.adjoint(i::Index) = prime(i) + +# TODO: Deprecate, just use `randname` directly. +sim(n::IndexName) = randname(n) +sim(i::Index) = setname(i, sim(name(i))) +sim(a::AbstractITensor) = mapinds(sim, a) + +# TODO: Maybe deprecate these and use `mapinds` directly? +prime(a::AbstractITensor) = mapinds(prime, a) +noprime(a::AbstractITensor) = mapinds(noprime, a) + +# TODO: Delete these and just use set operations on `inds` directly. +function uniqueinds(a1::AbstractITensor, a_rest::AbstractITensor...) + return setdiff(inds(a1), inds.(a_rest)...) +end +function uniqueind(a1::AbstractITensor, a_rest::AbstractITensor...) + return only(uniqueinds(a1, a_rest...)) +end +function commoninds(a1::AbstractITensor, a_rest::AbstractITensor...) + return intersect(inds(a1), inds.(a_rest)...) +end +function commonind(a1::AbstractITensor, a_rest::AbstractITensor...) + return only(commoninds(a1, a_rest...)) +end + # TODO: Replace with a more general functionality in # `GradedArrays`, like `isgraded`. hasqns(r::AbstractUnitRange) = false diff --git a/test/Project.toml b/test/Project.toml index 74a46fd..5c0e6c3 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -20,7 +20,7 @@ BlockSparseArrays = "0.8, 0.9, 0.10" DiagonalArrays = "0.3" GradedArrays = "0.4" ITensorBase = "0.2" -NamedDimsArrays = "0.7" +NamedDimsArrays = "0.8" SafeTestsets = "0.1" SparseArraysBase = "0.7" Suppressor = "0.2" diff --git a/test/test_basics.jl b/test/test_basics.jl index fb458e7..db6f639 100644 --- a/test/test_basics.jl +++ b/test/test_basics.jl @@ -12,7 +12,7 @@ using ITensorBase: inds, plev, prime, - setprime, + setplev, settag, tags, unsettag @@ -65,7 +65,7 @@ const elts = (Float32, Float64, Complex{Float32}, Complex{Float64}) i = Index(2) @test plev(i) == 0 - i = setprime(i, 2) + i = setplev(i, 2) @test plev(i) == 2 i = Index(2)