From c8459471e67c4163539808b8d432032bdde93838 Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 13 Sep 2024 10:19:49 -0400 Subject: [PATCH 01/11] Blah --- examples/test.jl | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 examples/test.jl diff --git a/examples/test.jl b/examples/test.jl new file mode 100644 index 00000000..6bf1bfcf --- /dev/null +++ b/examples/test.jl @@ -0,0 +1,21 @@ +using ITensorNetworks: IndsNetwork, siteinds, ttn +using ITensorNetworks.ModelHamiltonians: ising +using ITensors: Index, OpSum, terms, sites +using NamedGraphs.NamedGraphGenerators: named_grid +using NamedGraphs.GraphsExtensions: rem_vertex + +function filter_terms(H, verts) + H_new = OpSum() + for term in terms(H) + if isempty(filter(v -> v ∈ verts, sites(term))) + H_new += term + end + end + return H_new +end + +g = named_grid((8,1)) +s = siteinds("S=1/2", g) +H = ising(s) +H_mod = filter_terms(H, [(4,1)]) +ttno = ttn(H_mod, s) \ No newline at end of file From 6ff0cd572c947e9b1ed3642e690b43233277beb0 Mon Sep 17 00:00:00 2001 From: Joey Date: Thu, 17 Oct 2024 14:56:22 +0100 Subject: [PATCH 02/11] Bug fix in current ortho. Change test --- .../alternating_update/region_update.jl | 45 ++++++++----------- .../test_solvers/test_dmrg.jl | 12 ++--- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/solvers/alternating_update/region_update.jl b/src/solvers/alternating_update/region_update.jl index b92adc8c..97241c20 100644 --- a/src/solvers/alternating_update/region_update.jl +++ b/src/solvers/alternating_update/region_update.jl @@ -7,36 +7,27 @@ function current_ortho(sweep_plan, which_region_update) if !isa(region, AbstractEdge) && length(region) == 1 return only(current_verts) end - if which_region_update == length(regions) - # look back by one should be sufficient, but may be brittle? - overlapping_vertex = only( - intersect(current_verts, support(regions[which_region_update - 1])) - ) - return overlapping_vertex - else - # look forward - other_regions = filter( - x -> !(issetequal(x, current_verts)), support.(regions[(which_region_update + 1):end]) + # look forward + other_regions = filter( + x -> !(issetequal(x, current_verts)), support.(regions[(which_region_update + 1):end]) + ) + # find the first region that has overlapping support with current region + ind = findfirst(x -> !isempty(intersect(support(x), support(region))), other_regions) + if isnothing(ind) + # look backward + other_regions = reverse( + filter( + x -> !(issetequal(x, current_verts)), support.(regions[1:(which_region_update - 1)]) + ), ) - # find the first region that has overlapping support with current region ind = findfirst(x -> !isempty(intersect(support(x), support(region))), other_regions) - if isnothing(ind) - # look backward - other_regions = reverse( - filter( - x -> !(issetequal(x, current_verts)), - support.(regions[1:(which_region_update - 1)]), - ), - ) - ind = findfirst(x -> !isempty(intersect(support(x), support(region))), other_regions) - end - @assert !isnothing(ind) - future_verts = union(support(other_regions[ind])) - # return ortho_ceter as the vertex in current region that does not overlap with following one - overlapping_vertex = intersect(current_verts, future_verts) - nonoverlapping_vertex = only(setdiff(current_verts, overlapping_vertex)) - return nonoverlapping_vertex end + @assert !isnothing(ind) + future_verts = union(support(other_regions[ind])) + # return ortho_ceter as the vertex in current region that does not overlap with following one + overlapping_vertex = intersect(current_verts, future_verts) + nonoverlapping_vertex = only(setdiff(current_verts, overlapping_vertex)) + return nonoverlapping_vertex end function region_update( diff --git a/test/test_treetensornetworks/test_solvers/test_dmrg.jl b/test/test_treetensornetworks/test_solvers/test_dmrg.jl index cf8a1caf..004ec561 100644 --- a/test/test_treetensornetworks/test_solvers/test_dmrg.jl +++ b/test/test_treetensornetworks/test_solvers/test_dmrg.jl @@ -1,7 +1,7 @@ @eval module $(gensym()) using DataGraphs: edge_data, vertex_data using Dictionaries: Dictionary -using Graphs: nv, vertices +using Graphs: nv, vertices, uniform_tree using ITensorMPS: ITensorMPS using ITensorNetworks: ITensorNetworks, @@ -19,6 +19,7 @@ using ITensorNetworks.ITensorsExtensions: replace_vertices using ITensorNetworks.ModelHamiltonians: ModelHamiltonians using ITensors: ITensors using KrylovKit: eigsolve +using NamedGraphs: NamedGraph, rename_vertices using NamedGraphs.NamedGraphGenerators: named_comb_tree using Observers: observer using StableRNGs: StableRNG @@ -313,11 +314,12 @@ end nsites = 2 nsweeps = 10 - c = named_comb_tree((3, 2)) - s = siteinds("S=1/2", c) - os = ModelHamiltonians.heisenberg(c) - H = ttn(os, s) rng = StableRNG(1234) + g = NamedGraph(uniform_tree(10)) + g = rename_vertices(v -> (v, 1), g) + s = siteinds("S=1/2", g) + os = ModelHamiltonians.heisenberg(g) + H = ttn(os, s) psi = random_ttn(rng, s; link_space=5) e, psi = dmrg(H, psi; nsweeps, maxdim, nsites) From d0967229e2c9c0d645ad110bb3944566b52d3385 Mon Sep 17 00:00:00 2001 From: Joey Date: Tue, 26 Nov 2024 13:50:41 -0500 Subject: [PATCH 03/11] Fix bug --- src/abstractitensornetwork.jl | 40 ++++++++++++------- .../abstracttreetensornetwork.jl | 12 ++++-- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/abstractitensornetwork.jl b/src/abstractitensornetwork.jl index fc0edce4..afdbbb41 100644 --- a/src/abstractitensornetwork.jl +++ b/src/abstractitensornetwork.jl @@ -19,6 +19,7 @@ using Graphs: using ITensors: ITensors, ITensor, + @Algorithm_str, addtags, combiner, commoninds, @@ -44,7 +45,7 @@ using MacroTools: @capture using NamedGraphs: NamedGraphs, NamedGraph, not_implemented, steiner_tree using NamedGraphs.GraphsExtensions: ⊔, directed_graph, incident_edges, rename_vertices, vertextype -using NDTensors: NDTensors, dim +using NDTensors: NDTensors, dim, Algorithm using SplitApplyCombine: flatten abstract type AbstractITensorNetwork{V} <: AbstractDataGraph{V,ITensor,ITensor} end @@ -585,17 +586,22 @@ function LinearAlgebra.factorize(tn::AbstractITensorNetwork, edge::Pair; kwargs. end # For ambiguity error; TODO: decide whether to use graph mutating methods when resulting graph is unchanged? -function orthogonalize_walk(tn::AbstractITensorNetwork, edge::AbstractEdge; kwargs...) - return orthogonalize_walk(tn, [edge]; kwargs...) +function gauge_walk( + alg::Algorithm, tn::AbstractITensorNetwork, edge::AbstractEdge; kwargs... +) + return gauge_walk(tn, [edge]; kwargs...) end -function orthogonalize_walk(tn::AbstractITensorNetwork, edge::Pair; kwargs...) - return orthogonalize_walk(tn, edgetype(tn)(edge); kwargs...) +function gauge_walk(alg::Algorithm, tn::AbstractITensorNetwork, edge::Pair; kwargs...) + return gauge_walk(alg::Algorithm, tn, edgetype(tn)(edge); kwargs...) end # For ambiguity error; TODO: decide whether to use graph mutating methods when resulting graph is unchanged? -function orthogonalize_walk( - tn::AbstractITensorNetwork, edges::Vector{<:AbstractEdge}; kwargs... +function gauge_walk( + alg::Algorithm"orthogonalize", + tn::AbstractITensorNetwork, + edges::Vector{<:AbstractEdge}; + kwargs..., ) # tn = factorize(tn, edge; kwargs...) # # TODO: Implement as `only(common_neighbors(tn, src(edge), dst(edge)))` @@ -612,22 +618,28 @@ function orthogonalize_walk( return tn end -function orthogonalize_walk(tn::AbstractITensorNetwork, edges::Vector{<:Pair}; kwargs...) - return orthogonalize_walk(tn, edgetype(tn).(edges); kwargs...) +function gauge_walk( + alg::Algorithm, tn::AbstractITensorNetwork, edges::Vector{<:Pair}; kwargs... +) + return gauge_walk(alg, tn, edgetype(tn).(edges); kwargs...) end -# Orthogonalize an ITensorNetwork towards a region, treating +# Gauge a ITensorNetwork towards a region, treating # the network as a tree spanned by a spanning tree. -function tree_orthogonalize(ψ::AbstractITensorNetwork, region::Vector) +function tree_gauge(alg::Algorithm, ψ::AbstractITensorNetwork, region::Vector) region_center = length(region) != 1 ? first(center(steiner_tree(ψ, region))) : only(region) path = post_order_dfs_edges(bfs_tree(ψ, region_center), region_center) path = filter(e -> !((src(e) ∈ region) && (dst(e) ∈ region)), path) - return orthogonalize_walk(ψ, path) + return gauge_walk(alg, ψ, path) +end + +function tree_gauge(alg::Algorithm, ψ::AbstractITensorNetwork, region) + return tree_gauge(alg, ψ, [region]) end -function tree_orthogonalize(ψ::AbstractITensorNetwork, region) - return tree_orthogonalize(ψ, [region]) +function tree_orthogonalize(ψ::AbstractITensorNetwork, region; kwargs...) + return tree_gauge(Algorithm("orthogonalize"), ψ, region; kwargs...) end # TODO: decide whether to use graph mutating methods when resulting graph is unchanged? diff --git a/src/treetensornetworks/abstracttreetensornetwork.jl b/src/treetensornetworks/abstracttreetensornetwork.jl index 8815b33f..f6c8f49f 100644 --- a/src/treetensornetworks/abstracttreetensornetwork.jl +++ b/src/treetensornetworks/abstracttreetensornetwork.jl @@ -8,7 +8,7 @@ using NamedGraphs.GraphsExtensions: a_star using NamedGraphs: namedgraph_a_star, steiner_tree using IsApprox: IsApprox, Approx -using ITensors: ITensors, @Algorithm_str, directsum, hasinds, permute, plev +using ITensors: ITensors, Algorithm, @Algorithm_str, directsum, hasinds, permute, plev using ITensorMPS: ITensorMPS, linkind, loginner, lognorm, orthogonalize using TupleTools: TupleTools @@ -35,19 +35,23 @@ function set_ortho_region(tn::AbstractTTN, new_region) return error("Not implemented") end -function ITensorMPS.orthogonalize(ttn::AbstractTTN, region::Vector; kwargs...) +function gauge(alg::Algorithm, ttn::AbstractTTN, region::Vector; kwargs...) issetequal(region, ortho_region(ttn)) && return ttn st = steiner_tree(ttn, union(region, ortho_region(ttn))) path = post_order_dfs_edges(st, first(region)) path = filter(e -> !((src(e) ∈ region) && (dst(e) ∈ region)), path) if !isempty(path) - ttn = typeof(ttn)(orthogonalize_walk(ITensorNetwork(ttn), path; kwargs...)) + ttn = typeof(ttn)(gauge_walk(alg, ITensorNetwork(ttn), path; kwargs...)) end return set_ortho_region(ttn, region) end +function gauge(alg::Algorithm, ttn::AbstractTTN, region; kwargs...) + return gauge(alg, ttn, [region]; kwargs...) +end + function ITensorMPS.orthogonalize(ttn::AbstractTTN, region; kwargs...) - return orthogonalize(ttn, [region]; kwargs...) + return gauge(Algorithm("orthogonalize"), ttn, region; kwargs...) end function tree_orthogonalize(ttn::AbstractTTN, args...; kwargs...) From 9d6c1bcb7aa8b36163df43e95b063dd9cd03761f Mon Sep 17 00:00:00 2001 From: Joey Date: Wed, 19 Mar 2025 12:07:10 -0700 Subject: [PATCH 04/11] File removed --- examples/test.jl | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 examples/test.jl diff --git a/examples/test.jl b/examples/test.jl deleted file mode 100644 index 6bf1bfcf..00000000 --- a/examples/test.jl +++ /dev/null @@ -1,21 +0,0 @@ -using ITensorNetworks: IndsNetwork, siteinds, ttn -using ITensorNetworks.ModelHamiltonians: ising -using ITensors: Index, OpSum, terms, sites -using NamedGraphs.NamedGraphGenerators: named_grid -using NamedGraphs.GraphsExtensions: rem_vertex - -function filter_terms(H, verts) - H_new = OpSum() - for term in terms(H) - if isempty(filter(v -> v ∈ verts, sites(term))) - H_new += term - end - end - return H_new -end - -g = named_grid((8,1)) -s = siteinds("S=1/2", g) -H = ising(s) -H_mod = filter_terms(H, [(4,1)]) -ttno = ttn(H_mod, s) \ No newline at end of file From dd2bd2118a2eb5db1176cf2512a9eec0dd34df13 Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 4 Apr 2025 09:15:48 -0400 Subject: [PATCH 05/11] LinearFormNetwork --- src/ITensorNetworks.jl | 1 + src/abstractitensornetwork.jl | 9 +--- src/expect.jl | 6 +-- src/formnetworks/linearformnetwork.jl | 66 +++++++++++++++++++++++++++ test/test_forms.jl | 8 ++++ 5 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 src/formnetworks/linearformnetwork.jl diff --git a/src/ITensorNetworks.jl b/src/ITensorNetworks.jl index 56ab768f..1aa80435 100644 --- a/src/ITensorNetworks.jl +++ b/src/ITensorNetworks.jl @@ -29,6 +29,7 @@ include("caches/abstractbeliefpropagationcache.jl") include("caches/beliefpropagationcache.jl") include("formnetworks/abstractformnetwork.jl") include("formnetworks/bilinearformnetwork.jl") +include("formnetworks/linearformnetwork.jl") include("formnetworks/quadraticformnetwork.jl") include("contraction_tree_to_graph.jl") include("gauging.jl") diff --git a/src/abstractitensornetwork.jl b/src/abstractitensornetwork.jl index e35fe063..c8bb57bc 100644 --- a/src/abstractitensornetwork.jl +++ b/src/abstractitensornetwork.jl @@ -751,7 +751,7 @@ function split_index( end function inner_network(x::AbstractITensorNetwork, y::AbstractITensorNetwork; kwargs...) - return BilinearFormNetwork(x, y; kwargs...) + return LinearFormNetwork(x, y; kwargs...) end function inner_network( @@ -760,12 +760,7 @@ function inner_network( return BilinearFormNetwork(A, x, y; kwargs...) end -# TODO: We should make this use the QuadraticFormNetwork constructor here. -# Parts of the code (tests relying on norm_sqr being two layer and the gauging code -# which relies on specific message tensors) currently would break in that case so we need to resolve -function norm_sqr_network(ψ::AbstractITensorNetwork) - return disjoint_union("bra" => dag(prime(ψ; sites=[])), "ket" => ψ) -end +norm_sqr_network(ψ::AbstractITensorNetwork) = inner_network(ψ, ψ) # # Printing diff --git a/src/expect.jl b/src/expect.jl index c1e92efe..9ac804b9 100644 --- a/src/expect.jl +++ b/src/expect.jl @@ -26,10 +26,10 @@ function expect( (cache!)=nothing, update_cache=isnothing(cache!), cache_update_kwargs=default_cache_update_kwargs(alg), - cache_construction_kwargs=default_cache_construction_kwargs(alg, inner_network(ψ, ψ)), + cache_construction_kwargs=default_cache_construction_kwargs(alg, QuadraticFormNetwork(ψ)), kwargs..., ) - ψIψ = inner_network(ψ, ψ) + ψIψ = QuadraticFormNetwork(ψ) if isnothing(cache!) cache! = Ref(cache(alg, ψIψ; cache_construction_kwargs...)) end @@ -42,7 +42,7 @@ function expect( end function expect(alg::Algorithm"exact", ψ::AbstractITensorNetwork, ops; kwargs...) - ψIψ = inner_network(ψ, ψ) + ψIψ = QuadraticFormNetwork(ψ) return map(op -> expect(ψIψ, op; alg, kwargs...), ops) end diff --git a/src/formnetworks/linearformnetwork.jl b/src/formnetworks/linearformnetwork.jl new file mode 100644 index 00000000..7a5c073a --- /dev/null +++ b/src/formnetworks/linearformnetwork.jl @@ -0,0 +1,66 @@ +using ITensors: ITensor, sim + +default_dual_link_index_map = sim + +struct LinearFormNetwork{ + V,TensorNetwork<:AbstractITensorNetwork{V},BraVertexSuffix,KetVertexSuffix +} <: AbstractFormNetwork{V} + tensornetwork::TensorNetwork + bra_vertex_suffix::BraVertexSuffix + ket_vertex_suffix::KetVertexSuffix +end + +function LinearFormNetwork( + bra::AbstractITensorNetwork, + ket::AbstractITensorNetwork; + bra_vertex_suffix=default_bra_vertex_suffix(), + ket_vertex_suffix=default_ket_vertex_suffix(), + dual_link_index_map=default_dual_link_index_map, +) + bra_mapped = dual_link_index_map(bra; sites=[]) + tn = disjoint_union(bra_vertex_suffix => dag(bra_mapped), ket_vertex_suffix => ket) + return LinearFormNetwork(tn, bra_vertex_suffix, ket_vertex_suffix) +end + +function LinearFormNetwork(blf::BilinearFormNetwork) + bra, ket, operator = subgraph(blf, bra_vertices(blf)), + subgraph(blf, ket_vertices(blf)), + subgraph(blf, operator_vertices(blf)) + bra_suffix, ket_suffix = bra_vertex_suffix(blf), ket_vertex_suffix(blf) + operator = rename_vertices(v -> bra_vertex_map(blf)(v), operator) + tn = union(bra, ket, operator) + return LinearFormNetwork(tn, bra_suffix, ket_suffix) +end + +bra_vertex_suffix(lf::LinearFormNetwork) = lf.bra_vertex_suffix +ket_vertex_suffix(lf::LinearFormNetwork) = lf.ket_vertex_suffix +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. +tensornetwork(lf::LinearFormNetwork) = lf.tensornetwork +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph_type`. +data_graph_type(::Type{<:LinearFormNetwork}) = data_graph_type(tensornetwork(lf)) +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. +data_graph(lf::LinearFormNetwork) = data_graph(tensornetwork(lf)) + +function Base.copy(lf::LinearFormNetwork) + return LinearFormNetwork( + copy(tensornetwork(lf)), bra_vertex_suffix(lf), ket_vertex_suffix(lf) + ) +end + +function update( + lf::LinearFormNetwork, + original_bra_state_vertex, + original_ket_state_vertex, + bra_state::ITensor, + ket_state::ITensor, +) + lf = copy(lf) + # TODO: Maybe add a check that it really does preserve the graph. + setindex_preserve_graph!( + tensornetwork(lf), bra_state, bra_vertex(blf, original_bra_state_vertex) + ) + setindex_preserve_graph!( + tensornetwork(lf), ket_state, ket_vertex(blf, original_ket_state_vertex) + ) + return lf +end diff --git a/test/test_forms.jl b/test/test_forms.jl index 1e66d1e3..962bc960 100644 --- a/test/test_forms.jl +++ b/test/test_forms.jl @@ -5,6 +5,7 @@ using NamedGraphs.NamedGraphGenerators: named_grid using ITensorNetworks: BeliefPropagationCache, BilinearFormNetwork, + LinearFormNetwork, QuadraticFormNetwork, bra_network, bra_vertex, @@ -35,6 +36,10 @@ using Test: @test, @testset ψbra = random_tensornetwork(rng, s; link_space=χ) A = random_tensornetwork(rng, s_operator; link_space=D) + lf = LinearFormNetwork(ψbra, ψket) + @test nv(lf) == nv(ψket) + nv(ψbra) + @test isempty(flatten_siteinds(lf)) + blf = BilinearFormNetwork(A, ψbra, ψket) @test nv(blf) == nv(ψket) + nv(ψbra) + nv(A) @test isempty(flatten_siteinds(blf)) @@ -43,6 +48,9 @@ using Test: @test, @testset @test underlying_graph(operator_network(blf)) == underlying_graph(A) @test underlying_graph(bra_network(blf)) == underlying_graph(ψbra) + lf = LinearFormNetwork(blf) + @test underlying_graph(ket_network(lf)) == underlying_graph(ψket) + qf = QuadraticFormNetwork(ψket) @test nv(qf) == 3 * nv(ψket) @test isempty(flatten_siteinds(qf)) From 3bae5971cf820191229c4666483c9e9645e5bbbd Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 4 Apr 2025 09:20:00 -0400 Subject: [PATCH 06/11] Version bump --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 1f89bd42..548e20ae 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ITensorNetworks" uuid = "2919e153-833c-4bdc-8836-1ea460a35fc7" authors = ["Matthew Fishman , Joseph Tindall and contributors"] -version = "0.13.2" +version = "0.13.3" [deps] AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" From d7c4b44da792029013dd2413b51f0fa0d40b4780 Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 4 Apr 2025 09:32:44 -0400 Subject: [PATCH 07/11] Default link index map -> prime --- src/formnetworks/linearformnetwork.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/formnetworks/linearformnetwork.jl b/src/formnetworks/linearformnetwork.jl index 7a5c073a..d724d012 100644 --- a/src/formnetworks/linearformnetwork.jl +++ b/src/formnetworks/linearformnetwork.jl @@ -1,6 +1,6 @@ -using ITensors: ITensor, sim +using ITensors: ITensor, prime -default_dual_link_index_map = sim +default_dual_link_index_map = prime struct LinearFormNetwork{ V,TensorNetwork<:AbstractITensorNetwork{V},BraVertexSuffix,KetVertexSuffix From 96350bebdf1ef87f9de97de40114655dfb02c4fc Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 4 Apr 2025 09:57:31 -0400 Subject: [PATCH 08/11] Bug fix --- src/formnetworks/abstractformnetwork.jl | 7 +++++++ src/formnetworks/bilinearformnetwork.jl | 4 ---- src/formnetworks/linearformnetwork.jl | 4 ---- test/test_itensornetwork.jl | 5 +++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/formnetworks/abstractformnetwork.jl b/src/formnetworks/abstractformnetwork.jl index 07ddffdf..191d8874 100644 --- a/src/formnetworks/abstractformnetwork.jl +++ b/src/formnetworks/abstractformnetwork.jl @@ -20,6 +20,13 @@ function SimilarType.similar_type(f::AbstractFormNetwork) return typeof(tensornetwork(f)) end +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph_type`. +function data_graph_type(G::Type{<:AbstractFormNetwork}) + return data_graph_type(fieldtype(G, :tensornetwork)) +end +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. +data_graph(f::AbstractFormNetwork) = data_graph(tensornetwork(f)) + function operator_vertices(f::AbstractFormNetwork) return filter(v -> last(v) == operator_vertex_suffix(f), vertices(f)) end diff --git a/src/formnetworks/bilinearformnetwork.jl b/src/formnetworks/bilinearformnetwork.jl index 11d298c5..880546ab 100644 --- a/src/formnetworks/bilinearformnetwork.jl +++ b/src/formnetworks/bilinearformnetwork.jl @@ -42,10 +42,6 @@ bra_vertex_suffix(blf::BilinearFormNetwork) = blf.bra_vertex_suffix ket_vertex_suffix(blf::BilinearFormNetwork) = blf.ket_vertex_suffix # TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. tensornetwork(blf::BilinearFormNetwork) = blf.tensornetwork -# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph_type`. -data_graph_type(::Type{<:BilinearFormNetwork}) = data_graph_type(tensornetwork(blf)) -# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. -data_graph(blf::BilinearFormNetwork) = data_graph(tensornetwork(blf)) function Base.copy(blf::BilinearFormNetwork) return BilinearFormNetwork( diff --git a/src/formnetworks/linearformnetwork.jl b/src/formnetworks/linearformnetwork.jl index d724d012..f094873f 100644 --- a/src/formnetworks/linearformnetwork.jl +++ b/src/formnetworks/linearformnetwork.jl @@ -36,10 +36,6 @@ bra_vertex_suffix(lf::LinearFormNetwork) = lf.bra_vertex_suffix ket_vertex_suffix(lf::LinearFormNetwork) = lf.ket_vertex_suffix # TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. tensornetwork(lf::LinearFormNetwork) = lf.tensornetwork -# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph_type`. -data_graph_type(::Type{<:LinearFormNetwork}) = data_graph_type(tensornetwork(lf)) -# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. -data_graph(lf::LinearFormNetwork) = data_graph(tensornetwork(lf)) function Base.copy(lf::LinearFormNetwork) return LinearFormNetwork( diff --git a/test/test_itensornetwork.jl b/test/test_itensornetwork.jl index 1232d02c..47199f29 100644 --- a/test/test_itensornetwork.jl +++ b/test/test_itensornetwork.jl @@ -30,6 +30,7 @@ using ITensors: itensor, onehot, order, + prime, random_itensor, scalartype, sim, @@ -55,7 +56,7 @@ using ITensorNetworks: ttn using LinearAlgebra: factorize using NamedGraphs: NamedEdge -using NamedGraphs.GraphsExtensions: incident_edges +using NamedGraphs.GraphsExtensions: disjoint_union, incident_edges using NamedGraphs.NamedGraphGenerators: named_comb_tree, named_grid using NDTensors: NDTensors, dim using Random: randn! @@ -140,7 +141,7 @@ const elts = (Float32, Float64, Complex{Float32}, Complex{Float64}) g = named_grid(dims) s = siteinds("S=1/2", g) ψ = ITensorNetwork(v -> "↑", s) - tn = norm_sqr_network(ψ) + tn = disjoint_union("bra" => ψ, "ket" => prime(dag(ψ); sites=[])) tn_2 = contract(tn, ((1, 2), "ket") => ((1, 2), "bra")) @test !has_vertex(tn_2, ((1, 2), "ket")) @test tn_2[((1, 2), "bra")] ≈ tn[((1, 2), "ket")] * tn[((1, 2), "bra")] From c890f206f2d4ba93b35abc6ee3899e814544174d Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 4 Apr 2025 11:03:49 -0400 Subject: [PATCH 09/11] Only update ket vertex --- src/formnetworks/linearformnetwork.jl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/formnetworks/linearformnetwork.jl b/src/formnetworks/linearformnetwork.jl index f094873f..8d314ae4 100644 --- a/src/formnetworks/linearformnetwork.jl +++ b/src/formnetworks/linearformnetwork.jl @@ -45,16 +45,11 @@ end function update( lf::LinearFormNetwork, - original_bra_state_vertex, original_ket_state_vertex, - bra_state::ITensor, ket_state::ITensor, ) lf = copy(lf) # TODO: Maybe add a check that it really does preserve the graph. - setindex_preserve_graph!( - tensornetwork(lf), bra_state, bra_vertex(blf, original_bra_state_vertex) - ) setindex_preserve_graph!( tensornetwork(lf), ket_state, ket_vertex(blf, original_ket_state_vertex) ) From de261df0b010858509eb29bb742c6adc374d7b2e Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 4 Apr 2025 12:15:02 -0400 Subject: [PATCH 10/11] Formatting --- src/formnetworks/linearformnetwork.jl | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/formnetworks/linearformnetwork.jl b/src/formnetworks/linearformnetwork.jl index 8d314ae4..5e7cf1aa 100644 --- a/src/formnetworks/linearformnetwork.jl +++ b/src/formnetworks/linearformnetwork.jl @@ -43,11 +43,7 @@ function Base.copy(lf::LinearFormNetwork) ) end -function update( - lf::LinearFormNetwork, - original_ket_state_vertex, - ket_state::ITensor, -) +function update(lf::LinearFormNetwork, original_ket_state_vertex, ket_state::ITensor) lf = copy(lf) # TODO: Maybe add a check that it really does preserve the graph. setindex_preserve_graph!( From dbf0b55caa450b84d5f5ca539808fbe3f91a384c Mon Sep 17 00:00:00 2001 From: Joey Date: Fri, 4 Apr 2025 13:35:16 -0400 Subject: [PATCH 11/11] Update --- src/formnetworks/abstractformnetwork.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/formnetworks/abstractformnetwork.jl b/src/formnetworks/abstractformnetwork.jl index 191d8874..c163fcbf 100644 --- a/src/formnetworks/abstractformnetwork.jl +++ b/src/formnetworks/abstractformnetwork.jl @@ -21,8 +21,8 @@ function SimilarType.similar_type(f::AbstractFormNetwork) end # TODO: Use `NamedGraphs.GraphsExtensions.parent_graph_type`. -function data_graph_type(G::Type{<:AbstractFormNetwork}) - return data_graph_type(fieldtype(G, :tensornetwork)) +function data_graph_type(f::AbstractFormNetwork) + return data_graph_type(tensornetwork(f)) end # TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. data_graph(f::AbstractFormNetwork) = data_graph(tensornetwork(f))