@@ -623,18 +623,42 @@ function gauge_walk(
623
623
return gauge_walk (alg, tn, edgetype (tn).(edges); kwargs... )
624
624
end
625
625
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
+
626
654
# Gauge a ITensorNetwork towards a region, treating
627
655
# the network as a tree spanned by a spanning tree.
628
656
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)
657
+ return tree_gauge (alg, ψ, collect (vertices (ψ)), region)
634
658
end
635
659
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 ... )
638
662
end
639
663
640
664
function tree_orthogonalize (ψ:: AbstractITensorNetwork , region; kwargs... )
0 commit comments