@@ -7,6 +7,7 @@ using Graphs:
77 add_edge!,
88 add_vertex!,
99 bfs_tree,
10+ center,
1011 dst,
1112 edges,
1213 edgetype,
@@ -18,6 +19,7 @@ using Graphs:
1819using ITensors:
1920 ITensors,
2021 ITensor,
22+ @Algorithm_str ,
2123 addtags,
2224 combiner,
2325 commoninds,
@@ -40,10 +42,10 @@ using ITensorMPS: ITensorMPS, add, linkdim, linkinds, siteinds
4042using . ITensorsExtensions: ITensorsExtensions, indtype, promote_indtype
4143using LinearAlgebra: LinearAlgebra, factorize
4244using MacroTools: @capture
43- using NamedGraphs: NamedGraphs, NamedGraph, not_implemented
45+ using NamedGraphs: NamedGraphs, NamedGraph, not_implemented, steiner_tree
4446using NamedGraphs. GraphsExtensions:
4547 ⊔ , directed_graph, incident_edges, rename_vertices, vertextype
46- using NDTensors: NDTensors, dim
48+ using NDTensors: NDTensors, dim, Algorithm
4749using SplitApplyCombine: flatten
4850
4951abstract type AbstractITensorNetwork{V} <: AbstractDataGraph{V,ITensor,ITensor} end
@@ -584,7 +586,9 @@ function LinearAlgebra.factorize(tn::AbstractITensorNetwork, edge::Pair; kwargs.
584586end
585587
586588# For ambiguity error; TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
587- function _orthogonalize_edge (tn:: AbstractITensorNetwork , edge:: AbstractEdge ; kwargs... )
589+ function gauge_edge (
590+ alg:: Algorithm"orthogonalize" , tn:: AbstractITensorNetwork , edge:: AbstractEdge ; kwargs...
591+ )
588592 # tn = factorize(tn, edge; kwargs...)
589593 # # TODO : Implement as `only(common_neighbors(tn, src(edge), dst(edge)))`
590594 # new_vertex = only(neighbors(tn, src(edge)) ∩ neighbors(tn, dst(edge)))
@@ -598,23 +602,43 @@ function _orthogonalize_edge(tn::AbstractITensorNetwork, edge::AbstractEdge; kwa
598602 return tn
599603end
600604
601- function ITensorMPS. orthogonalize (tn:: AbstractITensorNetwork , edge:: AbstractEdge ; kwargs... )
602- return _orthogonalize_edge (tn, edge; kwargs... )
605+ # For ambiguity error; TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
606+ function gauge_walk (
607+ alg:: Algorithm , tn:: AbstractITensorNetwork , edges:: Vector{<:AbstractEdge} ; kwargs...
608+ )
609+ tn = copy (tn)
610+ for edge in edges
611+ tn = gauge_edge (alg, tn, edge; kwargs... )
612+ end
613+ return tn
614+ end
615+
616+ function gauge_walk (alg:: Algorithm , tn:: AbstractITensorNetwork , edge:: Pair ; kwargs... )
617+ return gauge_edge (alg:: Algorithm , tn, edgetype (tn)(edge); kwargs... )
603618end
604619
605- function ITensorMPS. orthogonalize (tn:: AbstractITensorNetwork , edge:: Pair ; kwargs... )
606- return orthogonalize (tn, edgetype (tn)(edge); kwargs... )
620+ function gauge_walk (
621+ alg:: Algorithm , tn:: AbstractITensorNetwork , edges:: Vector{<:Pair} ; kwargs...
622+ )
623+ return gauge_walk (alg, tn, edgetype (tn).(edges); kwargs... )
607624end
608625
609- # Orthogonalize an ITensorNetwork towards a source vertex , treating
626+ # Gauge a ITensorNetwork towards a region , treating
610627# the network as a tree spanned by a spanning tree.
611- # TODO : Rename `tree_orthogonalize`.
612- function ITensorMPS. orthogonalize (ψ:: AbstractITensorNetwork , source_vertex)
613- spanning_tree_edges = post_order_dfs_edges (bfs_tree (ψ, source_vertex), source_vertex)
614- for e in spanning_tree_edges
615- ψ = orthogonalize (ψ, e)
616- end
617- return ψ
628+ function tree_gauge (alg:: Algorithm , ψ:: AbstractITensorNetwork , region:: Vector )
629+ region_center =
630+ length (region) != 1 ? first (center (steiner_tree (ψ, region))) : only (region)
631+ path = post_order_dfs_edges (bfs_tree (ψ, region_center), region_center)
632+ path = filter (e -> ! ((src (e) ∈ region) && (dst (e) ∈ region)), path)
633+ return gauge_walk (alg, ψ, path)
634+ end
635+
636+ function tree_gauge (alg:: Algorithm , ψ:: AbstractITensorNetwork , region)
637+ return tree_gauge (alg, ψ, [region])
638+ end
639+
640+ function tree_orthogonalize (ψ:: AbstractITensorNetwork , region; kwargs... )
641+ return tree_gauge (Algorithm (" orthogonalize" ), ψ, region; kwargs... )
618642end
619643
620644# TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
759783# Link dimensions
760784#
761785
762- function ITensors . maxlinkdim (tn:: AbstractITensorNetwork )
786+ function ITensorMPS . maxlinkdim (tn:: AbstractITensorNetwork )
763787 md = 1
764788 for e in edges (tn)
765789 md = max (md, linkdim (tn, e))
0 commit comments