diff --git a/Project.toml b/Project.toml index 4da2ca02..fa2c303a 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ITensorNetworksNext" uuid = "302f2e75-49f0-4526-aef7-d8ba550cb06c" -version = "0.10.4" +version = "0.10.5" authors = ["ITensor developers and contributors"] [workspace] @@ -36,7 +36,7 @@ Combinatorics = "1" DataGraphs = "0.6" Dictionaries = "0.4.5" Graphs = "1.13.1" -ITensorBase = "0.14.2" +ITensorBase = "0.15" LinearAlgebra = "1.10" MacroTools = "0.5.16" MatrixAlgebraKit = "0.6" diff --git a/src/ITensorNetworkGenerators/delta_network.jl b/src/ITensorNetworkGenerators/delta_network.jl index f2bb7524..ff784dba 100644 --- a/src/ITensorNetworkGenerators/delta_network.jl +++ b/src/ITensorNetworkGenerators/delta_network.jl @@ -1,6 +1,6 @@ using ..ITensorNetworksNext: tensornetwork using Graphs: AbstractGraph, vertices -using ITensorBase: NamedUnitRange, name, nameddims, unnamed +using ITensorBase: NamedTensor, NamedUnitRange, name, unnamed using NamedGraphs: incident_edges diaglength(a::AbstractArray) = minimum(size(a)) @@ -29,7 +29,7 @@ function diagonaltensor( diag::AbstractVector, is::Tuple{NamedUnitRange, Vararg{NamedUnitRange}} ) - return nameddims(diagonaltensor(diag, unnamed.(is)), name.(is)) + return NamedTensor(diagonaltensor(diag, unnamed.(is)), name.(is)) end delta(elt::Type, is) = diagonaltensor(ones(elt, minimum(length ∘ unnamed, is)), is) diff --git a/src/ITensorNetworkGenerators/ising_network.jl b/src/ITensorNetworkGenerators/ising_network.jl index 4b706b1f..702b8787 100644 --- a/src/ITensorNetworkGenerators/ising_network.jl +++ b/src/ITensorNetworkGenerators/ising_network.jl @@ -1,6 +1,6 @@ using ..ITensorNetworksNext using Graphs: degree, dst, edges, src -using ITensorBase: name, nameddims, uniquename +using ITensorBase: NamedTensor, name, uniquename using LinearAlgebra: Diagonal, eigen using NamedGraphs: vertextype @@ -45,7 +45,7 @@ function ising_network( m = sqrt_ising_bond(β; J, h, deg1, deg2) # Split the Ising bond as √b on each endpoint, contracting the delta-network bond # name `fp(e)` and renaming the shared bond to the requested name `f(e)`. - b = nameddims(m, (name(fp(e)), name(f(e)))) + b = NamedTensor(m, (name(fp(e)), name(f(e)))) tn[v1] = b * tn[v1] tn[v2] = b * tn[v2] end diff --git a/src/abstracttensornetwork.jl b/src/abstracttensornetwork.jl index 4ea4c34a..9515d084 100644 --- a/src/abstracttensornetwork.jl +++ b/src/abstracttensornetwork.jl @@ -4,7 +4,8 @@ using DataGraphs: DataGraphs, AbstractDataGraph, AbstractVertexDataGraph, edge_d using Dictionaries: Dictionary using Graphs: Graphs, AbstractEdge, AbstractGraph, add_edge!, add_vertex!, dst, edges, edgetype, ne, neighbors, nv, rem_edge!, src, vertices -using ITensorBase: dimnames, inds, name, named, nametype, prime, uniquename, unnamedtype +using ITensorBase: + NamedUnitRange, inds, name, names, nametype, prime, uniquename, unnamedtype using LinearAlgebra: LinearAlgebra using MacroTools: @capture using NamedGraphs: @@ -68,7 +69,7 @@ function linknames(tn::AbstractGraph, edge::Pair) return linknames(tn, edgetype(tn)(edge)) end function linknames(tn::AbstractGraph, edge::AbstractEdge) - return dimnames(tn[src(edge)]) ∩ dimnames(tn[dst(edge)]) + return names(tn[src(edge)]) ∩ names(tn[dst(edge)]) end function siteinds(tn::AbstractGraph, v) @@ -86,9 +87,9 @@ function siteaxes(tn::AbstractGraph, v) return s end function sitenames(tn::AbstractGraph, v) - s = dimnames(tn[v]) + s = names(tn[v]) for v′ in neighbors(tn, v) - s = setdiff(s, dimnames(tn[v′])) + s = setdiff(s, names(tn[v′])) end return s end @@ -98,7 +99,7 @@ function dimnamevertices(tn::AbstractGraph, name) sites = vertextype(tn)[] for v in vertices(tn) - if name ∈ dimnames(tn[v]) + if name ∈ names(tn[v]) push!(sites, v) end end @@ -108,7 +109,7 @@ end function has_dimname(tn::AbstractGraph, name) for v in vertices(tn) - if name ∈ dimnames(tn[v]) + if name ∈ names(tn[v]) return true end end @@ -120,7 +121,7 @@ has_ind(tn::AbstractGraph, ind) = has_dimname(tn, name(ind)) function insertlink!(tn::AbstractGraph, e) T = eltype(inds(tn[src(e)])) - linkind = named(trivialrange(unnamedtype(T)), uniquename(nametype(T))) + linkind = NamedUnitRange(trivialrange(unnamedtype(T)), uniquename(nametype(T))) x = similar(tn[src(e)], (linkind,)) fill!(x, true) diff --git a/src/apply/apply_operators.jl b/src/apply/apply_operators.jl index 3d87b10e..e029bcf9 100644 --- a/src/apply/apply_operators.jl +++ b/src/apply/apply_operators.jl @@ -2,7 +2,7 @@ using .AlgorithmsInterfaceExtensions: AlgorithmsInterfaceExtensions as AIE using AlgorithmsInterface: AlgorithmsInterface as AI using Base: @kwdef using Graphs: dst, src, vertices -using ITensorBase: AbstractITensor, apply, dimnames, inputnames, operator, replacedimnames +using ITensorBase: AbstractITensor, apply, inputnames, names, operator, rename using LinearAlgebra: norm using MatrixAlgebraKit: project_hermitian, qr_compact, svd_trunc using NamedGraphs: boundary_edges @@ -258,26 +258,26 @@ function apply_gate_bp_nsite!( ψ_v1 = foldl((ψ, m) -> apply(m, ψ), sqrt_messages_v1; init = state[v1]) ψ_v2 = foldl((ψ, m) -> apply(m, ψ), sqrt_messages_v2; init = state[v2]) - Q_v1, R_v1 = qr_compact(ψ_v1, setdiff(dimnames(ψ_v1), dimnames(ψ_v2), dimnames(op))) - Q_v2, R_v2 = qr_compact(ψ_v2, setdiff(dimnames(ψ_v2), dimnames(ψ_v1), dimnames(op))) + Q_v1, R_v1 = qr_compact(ψ_v1, setdiff(names(ψ_v1), names(ψ_v2), names(op))) + Q_v2, R_v2 = qr_compact(ψ_v2, setdiff(names(ψ_v2), names(ψ_v1), names(op))) op_R_v1v2 = apply(op, R_v1 * R_v2) - U_v1, S, U_v2 = svd_trunc(op_R_v1v2, setdiff(dimnames(R_v1), dimnames(R_v2)); trunc) + U_v1, S, U_v2 = svd_trunc(op_R_v1v2, setdiff(names(R_v1), names(R_v2)); trunc) if normalize S = S / norm(S) end - name_v1, name_v2 = dimnames(S) + name_v1, name_v2 = names(S) sqrt_S = sqrth_safe(S, (name_v1,), (name_v2,); atol = 0, rtol = 0) - R_v1 = replacedimnames(U_v1 * sqrt_S, name_v2 => name_v1) + R_v1 = rename(U_v1 * sqrt_S, name_v2 => name_v1) R_v2 = sqrt_S * U_v2 dest[v1] = foldl((ψ, m) -> apply(m, ψ), invsqrt_messages_v1; init = Q_v1 * R_v1) dest[v2] = foldl((ψ, m) -> apply(m, ψ), invsqrt_messages_v2; init = Q_v2 * R_v2) env[v1 => v2] = operator( - replacedimnames(conj(R_v1), name_v1 => name_v2) * R_v1, (name_v2,), (name_v1,) + rename(conj(R_v1), name_v1 => name_v2) * R_v1, (name_v2,), (name_v1,) ) env[v2 => v1] = operator( - replacedimnames(conj(R_v2), name_v1 => name_v2) * R_v2, (name_v2,), (name_v1,) + rename(conj(R_v2), name_v1 => name_v2) * R_v2, (name_v2,), (name_v1,) ) return dest end diff --git a/src/beliefpropagation/messagecache.jl b/src/beliefpropagation/messagecache.jl index 2e486bb2..c7c66c4f 100644 --- a/src/beliefpropagation/messagecache.jl +++ b/src/beliefpropagation/messagecache.jl @@ -120,14 +120,14 @@ function incoming_messages(cache::AbstractGraph, pair::Pair) return incoming_messages(cache, edge) end function incoming_messages(cache::AbstractGraph, edge::AbstractEdge) - dimnames = Indices(in_incident_edges(cache, src(edge))) - return getindices(cache, filter(e -> e != reverse(edge), dimnames)) + in_edges = Indices(in_incident_edges(cache, src(edge))) + return getindices(cache, filter(e -> e != reverse(edge), in_edges)) end # TODO: maybe this should be defined in `DataGraphs`. function incoming_edge_data(cache::AbstractGraph, vertices) - dimnames = Indices(boundary_edges(cache, vertices; dir = :in)) - return getindices(cache, dimnames) + in_edges = Indices(boundary_edges(cache, vertices; dir = :in)) + return getindices(cache, in_edges) end function vertex_scalar(factors, messages, vertex; kwargs...) diff --git a/src/contract_network.jl b/src/contract_network.jl index a48bdda9..f13b36c8 100644 --- a/src/contract_network.jl +++ b/src/contract_network.jl @@ -1,7 +1,7 @@ using Base.Broadcast: materialize using Base: @kwdef using ITensorBase: EvaluationOrderAlgorithm, Greedy, Mul, lazy, optimize_evaluation_order, - substitute, symnameddims + substitute, symnamedtensor # `contract_network` @kwdef struct Exact{Order, OrderAlg} @@ -26,7 +26,8 @@ function get_order(alg::Exact, tn) end # Contraction order may or may not have indices attached, canonicalize the format # by attaching indices. - subs = Dict(symnameddims(i) => symnameddims(i, Tuple(axes(t))) for (i, t) in pairs(tn)) + subs = + Dict(symnamedtensor(i) => symnamedtensor(i, Tuple(axes(t))) for (i, t) in pairs(tn)) return substitute(order, subs) end # Promote the operands to their common type before lowering to the lazy expression, so every lazy @@ -38,7 +39,7 @@ function contract_network(alg::Exact, tn) order = get_order(alg, tn) T = mapreduce(typeof, promote_type, tn) syms_to_ts = Dict( - symnameddims(i, Tuple(axes(t))) => lazy(convert(T, t)) for (i, t) in pairs(tn) + symnamedtensor(i, Tuple(axes(t))) => lazy(convert(T, t)) for (i, t) in pairs(tn) ) tn_expression = substitute(order, syms_to_ts) return materialize(tn_expression) @@ -53,12 +54,12 @@ end struct Flat end function contraction_order(alg::Flat, tn) # Same as: `reduce((a, b) -> *(a, b; flatten = true), syms)`. - syms = vec([symnameddims(i, Tuple(axes(tn[i]))) for i in keys(tn)]) + syms = vec([symnamedtensor(i, Tuple(axes(tn[i]))) for i in keys(tn)]) return lazy(Mul(syms)) end struct LeftAssociative end function contraction_order(alg::LeftAssociative, tn) - return prod(i -> symnameddims(i, Tuple(axes(tn[i]))), keys(tn)) + return prod(i -> symnamedtensor(i, Tuple(axes(tn[i]))), keys(tn)) end # Internal implementation shared with the OMEinsumContractionOrders extension. function _contraction_order(alg, tn) diff --git a/src/normnetwork.jl b/src/normnetwork.jl index c953b745..46725507 100644 --- a/src/normnetwork.jl +++ b/src/normnetwork.jl @@ -1,6 +1,5 @@ using Dictionaries: Dictionary -using ITensorBase: - LazyNamedTensor, lazy, replacedimnames, setname, similar_operator, uniquename +using ITensorBase: LazyNamedTensor, lazy, rename, setname, similar_operator, uniquename using ITensorNetworksNext """ @@ -76,7 +75,7 @@ indmap(nn::NormNetwork, ind) = setname(conj(ind), braname(nn, name(ind))) kettensor(nn::NormNetwork, vertex) = nn.ket[vertex] function conj_bratensor(nn::NormNetwork, vertex) - return replacedimnames(n -> braname(nn, n), kettensor(nn, vertex)) + return rename(n -> braname(nn, n), kettensor(nn, vertex)) end bratensor(nn::NormNetwork, vertex) = conj(conj_bratensor(nn, vertex)) diff --git a/src/tensornetwork.jl b/src/tensornetwork.jl index ba96462e..a2216cb7 100644 --- a/src/tensornetwork.jl +++ b/src/tensornetwork.jl @@ -4,8 +4,7 @@ using DataGraphs: DataGraphs, AbstractDataGraph, DataGraph, edge_data, get_verti vertex_data, vertex_data_type using Dictionaries: Dictionaries, AbstractDictionary, Indices, dictionary, set!, unset! using Graphs: AbstractSimpleGraph, has_vertex, rem_edge!, rem_vertex! -using ITensorBase: - ITensorBase, AbstractITensor, dim, dimnames, dimnametype, name, unnamedtype +using ITensorBase: ITensorBase, AbstractITensor, dim, name, names, nametype, unnamedtype using NamedGraphs: NamedGraphs, NamedEdge, NamedGraph, decoded_vertex, encoded_graph, encoded_vertex, vertextype using SplitApplyCombine: mapview @@ -27,19 +26,19 @@ function ITensorNetwork{T}(undef::UndefInitializer, vertices) where {T} end function ITensorNetwork{T, V}(undef::UndefInitializer, vertices) where {T, V} - return ITensorNetwork{T, V, dimnametype(T)}(undef, vertices) + return ITensorNetwork{T, V, nametype(T)}(undef, vertices) end ITensorNetwork(tensors) = ITensorNetwork{valtype(tensors)}(tensors) ITensorNetwork{T}(tensors) where {T} = ITensorNetwork{T, keytype(tensors)}(tensors) function ITensorNetwork{T, V}(tensors) where {T, V} - I = dimnametype(T) + I = nametype(T) tn = ITensorNetwork{T, V, I}(undef, keys(tensors)) copyto!(tn, tensors) return tn end -ITensorBase.dimnametype(::Type{<:ITensorNetwork{T, V, I}}) where {T, V, I} = I +ITensorBase.nametype(::Type{<:ITensorNetwork{T, V, I}}) where {T, V, I} = I Graphs.vertices(tn::ITensorNetwork) = vertices(tn.underlying_graph) @@ -63,7 +62,7 @@ function Graphs.rem_vertex!(tn::ITensorNetwork, vertex) tensor = tn.tensors[vertex] - for name in dimnames(tensor) + for name in names(tensor) # If `ind` is associated with an edge, remove the edge. delete_ind_edge!(tn, name) @@ -129,9 +128,9 @@ end # "upsert" function set!_tensornetwork(tn::ITensorNetwork, vertex, tensor) - newinds = dimnames(tensor) + newinds = names(tensor) - oldinds = get(mapview(dimnames, tn.tensors), vertex, Set()) + oldinds = get(mapview(names, tn.tensors), vertex, Set()) # Only have to deal with the indices that aren't shared. for ind in symdiff(oldinds, newinds) diff --git a/test/Project.toml b/test/Project.toml index d00bb34c..bffcfd9a 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -29,7 +29,7 @@ DataGraphs = "0.6" Dictionaries = "0.4.5" GradedArrays = "0.16.4" Graphs = "1.13.1" -ITensorBase = "0.14.2" +ITensorBase = "0.15" ITensorNetworksNext = "0.10" ITensorPkgSkeleton = "0.3.42" MatrixAlgebraKit = "0.6" diff --git a/test/test_basics.jl b/test/test_basics.jl index f82c3ba5..a975170c 100644 --- a/test/test_basics.jl +++ b/test/test_basics.jl @@ -1,6 +1,6 @@ using Dictionaries: Indices using Graphs: dst, edges, has_edge, ne, nv, src, vertices -using ITensorBase: Index, dimnames +using ITensorBase: Index using ITensorNetworksNext: ITensorNetwork, linkinds, siteinds, tensornetwork using NamedGraphs: arranged_edges, incident_edges, named_grid using Test: @test, @testset