@@ -585,36 +585,61 @@ end
585585
586586# For ambiguity error; TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
587587function _orthogonalize_edge (tn:: AbstractITensorNetwork , edge:: AbstractEdge ; kwargs... )
588+ return _orthogonalize_edges (tn, [edge]; kwargs... )
589+ end
590+
591+ # For ambiguity error; TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
592+ function _orthogonalize_edges (
593+ tn:: AbstractITensorNetwork , edges:: Vector{<:AbstractEdge} ; kwargs...
594+ )
588595 # tn = factorize(tn, edge; kwargs...)
589596 # # TODO : Implement as `only(common_neighbors(tn, src(edge), dst(edge)))`
590597 # new_vertex = only(neighbors(tn, src(edge)) ∩ neighbors(tn, dst(edge)))
591598 # return contract(tn, new_vertex => dst(edge))
592599 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
600+ for edge in edges
601+ left_inds = uniqueinds (tn, edge)
602+ ltags = tags (tn, edge)
603+ X, Y = factorize (tn[src (edge)], left_inds; tags= ltags, ortho= " left" , kwargs... )
604+ tn[src (edge)] = X
605+ tn[dst (edge)] *= Y
606+ end
598607 return tn
599608end
600609
601610function ITensorMPS. orthogonalize (tn:: AbstractITensorNetwork , edge:: AbstractEdge ; kwargs... )
602611 return _orthogonalize_edge (tn, edge; kwargs... )
603612end
604613
614+ function ITensorMPS. orthogonalize (
615+ tn:: AbstractITensorNetwork , edges:: Vector{<:AbstractEdge} ; kwargs...
616+ )
617+ return _orthogonalize_edges (tn, edges; kwargs... )
618+ end
619+
605620function ITensorMPS. orthogonalize (tn:: AbstractITensorNetwork , edge:: Pair ; kwargs... )
606621 return orthogonalize (tn, edgetype (tn)(edge); kwargs... )
607622end
608623
609- # Orthogonalize an ITensorNetwork towards a source vertex, treating
624+ function ITensorMPS. orthogonalize (
625+ tn:: AbstractITensorNetwork , edges:: Vector{Pair} ; kwargs...
626+ )
627+ return orthogonalize (tn, edgetype (tn).(edges); kwargs... )
628+ end
629+
630+ # Orthogonalize an ITensorNetwork towards a region, treating
610631# the network as a tree spanned by a spanning tree.
611632# 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 ψ
633+ function ITensorMPS. orthogonalize (ψ:: AbstractITensorNetwork , region:: Vector )
634+ spanning_tree_edges = post_order_dfs_edges (bfs_tree (ψ, first (region)), first (region))
635+ spanning_tree_edges = filter (
636+ e -> ! (src (e) ∈ region && dst (e) ∈ region), spanning_tree_edges
637+ )
638+ return orthogonalize (ψ, spanning_tree_edges)
639+ end
640+
641+ function ITensorMPS. orthogonalize (ψ:: AbstractITensorNetwork , region)
642+ return orthogonalize (ψ, [region])
618643end
619644
620645# TODO : decide whether to use graph mutating methods when resulting graph is unchanged?
0 commit comments