@@ -623,18 +623,42 @@ function gauge_walk(
623623 return gauge_walk (alg, tn, edgetype (tn).(edges); kwargs... )
624624end
625625
626+ function tree_gauge (alg:: Algorithm , ψ:: AbstractITensorNetwork , region)
627+ return tree_gauge (alg, ψ, [region])
628+ end
629+
630+ # Get the path that moves the gauge from a to b on a tree
631+ # TODO : Move to NamedGraphs
632+ function edge_sequence_between_regions (g:: AbstractGraph , region_a:: Vector , region_b:: Vector )
633+ issetequal (region_a, region_b) && return edgetype (g)[]
634+ st = steiner_tree (g, union (region_a, region_b))
635+ path = post_order_dfs_edges (st, first (region_b))
636+ path = filter (e -> ! ((src (e) ∈ region_b) && (dst (e) ∈ region_b)), path)
637+ return path
638+ end
639+
640+ # Gauge a ITensorNetwork from cur_region towards new_region, treating
641+ # the network as a tree spanned by a spanning tree.
642+ function tree_gauge (
643+ alg:: Algorithm ,
644+ ψ:: AbstractITensorNetwork ,
645+ cur_region:: Vector ,
646+ new_region:: Vector ;
647+ kwargs... ,
648+ )
649+ es = edge_sequence_between_regions (ψ, cur_region, new_region)
650+ ψ = gauge_walk (alg, ψ, es; kwargs... )
651+ return ψ
652+ end
653+
626654# Gauge a ITensorNetwork towards a region, treating
627655# the network as a tree spanned by a spanning tree.
628656function 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)
657+ return tree_gauge (alg, ψ, collect (vertices (ψ)), region)
634658end
635659
636- function tree_gauge (alg :: Algorithm , ψ:: AbstractITensorNetwork , region )
637- return tree_gauge (alg , ψ, [region] )
660+ function tree_orthogonalize ( ψ:: AbstractITensorNetwork , cur_region, new_region; kwargs ... )
661+ return tree_gauge (Algorithm ( " orthogonalize " ) , ψ, cur_region, new_region; kwargs ... )
638662end
639663
640664function tree_orthogonalize (ψ:: AbstractITensorNetwork , region; kwargs... )
0 commit comments