Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "ITensorNetworksNext"
uuid = "302f2e75-49f0-4526-aef7-d8ba550cb06c"
version = "0.10.4"
version = "0.10.5"
authors = ["ITensor developers <support@itensor.org> and contributors"]

[workspace]
Expand Down Expand Up @@ -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"
Expand Down
4 changes: 2 additions & 2 deletions src/ITensorNetworkGenerators/delta_network.jl
Original file line number Diff line number Diff line change
@@ -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))
Expand Down Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions src/ITensorNetworkGenerators/ising_network.jl
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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
Expand Down
15 changes: 8 additions & 7 deletions src/abstracttensornetwork.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand Down
16 changes: 8 additions & 8 deletions src/apply/apply_operators.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
8 changes: 4 additions & 4 deletions src/beliefpropagation/messagecache.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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...)
Expand Down
11 changes: 6 additions & 5 deletions src/contract_network.jl
Original file line number Diff line number Diff line change
@@ -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}
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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)
Expand Down
5 changes: 2 additions & 3 deletions src/normnetwork.jl
Original file line number Diff line number Diff line change
@@ -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

"""
Expand Down Expand Up @@ -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))
Expand Down
15 changes: 7 additions & 8 deletions src/tensornetwork.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)

Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion test/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion test/test_basics.jl
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Loading