Define `tree_orthogonalize(tn::ITensorNetwork, vertex[, distance=nv(tn)])`
mtfishman opened this issue · comments
Define tree_orthogonalize(tn::ITensorNetwork, vertex[, distance=nv(tn)])
for performing a tree orthogonalization of a tensor network, as defined in Section II C and Fig. 3 of https://arxiv.org/abs/2206.07044 (referred to as the tree gauge in that reference). This would create a spanning tree of the tensor network with a source node/vertex vertex
and orthogonalize the resulting tree using QR/SVD towards that source vertex.
distance
would define a neighborhood around the source vertex, which could be implemented using Graphs.neighborhood(tn, vertex, distance)
.
Note that this is already used within the apply
/tebd
function when ortho=true
, but it doesn't currently support an optional distance, so implicitly orthogonalizes all tensors in the network which isn't necessary in general. See the implementation here:
https://github.com/mtfishman/ITensorNetworks.jl/blob/4c108fe34cdf6135ca4ecb2a8d7fa747d1ca9c1e/src/abstractitensornetwork.jl#L368
Also, some options should be given for creating the spanning tree which may take into account the bond dimensions as weights, or passing a custom spanning tree function.
See Issue here: @mtfishman/. I think if we can import the shortest path algorithms for graphs.jl to NamedGraphs.jl then we can easily create a function which creates the subgraph of a graph centered on some path distance r from a source_vertex. If this function can be wrapped onto a ITensorNetwork then it should be easy to add an argument to orthogonalize! which includes the distance as above.