@@ -7,6 +7,7 @@ using Graphs:
77 add_edge!,
88 add_vertex!,
99 bfs_tree,
10+ center,
1011 dst,
1112 edges,
1213 edgetype,
@@ -40,7 +41,7 @@ using ITensorMPS: ITensorMPS, add, linkdim, linkinds, siteinds
4041using . ITensorsExtensions: ITensorsExtensions, indtype, promote_indtype
4142using LinearAlgebra: LinearAlgebra, factorize
4243using MacroTools: @capture
43- using NamedGraphs: NamedGraphs, NamedGraph, not_implemented
44+ using NamedGraphs: NamedGraphs, NamedGraph, not_implemented, steiner_tree
4445using NamedGraphs. GraphsExtensions:
4546 ⊔ , directed_graph, incident_edges, rename_vertices, vertextype
4647using NDTensors: NDTensors, dim
@@ -584,37 +585,49 @@ function LinearAlgebra.factorize(tn::AbstractITensorNetwork, edge::Pair; kwargs.
584585end
585586
586587# 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... )
588+ function orthogonalize_walk (tn:: AbstractITensorNetwork , edge:: AbstractEdge ; kwargs... )
589+ return orthogonalize_walk (tn, [edge]; kwargs... )
590+ end
591+
592+ function orthogonalize_walk (tn:: AbstractITensorNetwork , edge:: Pair ; kwargs... )
593+ return orthogonalize_walk (tn, edgetype (tn)(edge); kwargs... )
594+ end
595+
596+ # For ambiguity error; TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
597+ function orthogonalize_walk (
598+ tn:: AbstractITensorNetwork , edges:: Vector{<:AbstractEdge} ; kwargs...
599+ )
588600 # tn = factorize(tn, edge; kwargs...)
589601 # # TODO : Implement as `only(common_neighbors(tn, src(edge), dst(edge)))`
590602 # new_vertex = only(neighbors(tn, src(edge)) ∩ neighbors(tn, dst(edge)))
591603 # return contract(tn, new_vertex => dst(edge))
592604 tn = copy (tn)
593- left_inds = uniqueinds (tn, edge)
594- ltags = tags (tn, edge)
595- X, Y = factorize (tn[src (edge)], left_inds; tags= ltags, ortho= " left" , kwargs... )
596- tn[src (edge)] = X
597- tn[dst (edge)] *= Y
605+ for edge in edges
606+ left_inds = uniqueinds (tn, edge)
607+ ltags = tags (tn, edge)
608+ X, Y = factorize (tn[src (edge)], left_inds; tags= ltags, ortho= " left" , kwargs... )
609+ tn[src (edge)] = X
610+ tn[dst (edge)] *= Y
611+ end
598612 return tn
599613end
600614
601- function ITensorMPS . orthogonalize (tn:: AbstractITensorNetwork , edge :: AbstractEdge ; kwargs... )
602- return _orthogonalize_edge (tn, edge ; kwargs... )
615+ function orthogonalize_walk (tn:: AbstractITensorNetwork , edges :: Vector{<:Pair} ; kwargs... )
616+ return orthogonalize_walk (tn, edgetype (tn).(edges) ; kwargs... )
603617end
604618
605- function ITensorMPS. orthogonalize (tn:: AbstractITensorNetwork , edge:: Pair ; kwargs... )
606- return orthogonalize (tn, edgetype (tn)(edge); kwargs... )
619+ # Orthogonalize an ITensorNetwork towards a region, treating
620+ # the network as a tree spanned by a spanning tree.
621+ function tree_orthogonalize (ψ:: AbstractITensorNetwork , region:: Vector )
622+ region_center =
623+ length (region) != 1 ? first (center (steiner_tree (ψ, region))) : only (region)
624+ path = post_order_dfs_edges (bfs_tree (ψ, region_center), region_center)
625+ path = filter (e -> ! ((src (e) ∈ region) && (dst (e) ∈ region)), path)
626+ return orthogonalize_walk (ψ, path)
607627end
608628
609- # Orthogonalize an ITensorNetwork towards a source vertex, treating
610- # 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 ψ
629+ function tree_orthogonalize (ψ:: AbstractITensorNetwork , region)
630+ return tree_orthogonalize (ψ, [region])
618631end
619632
620633# TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
0 commit comments