InfiniteMPS transfer matrix

Hi ITensor,

I’m trying to get correlation functions in infinite MPS using the InfiniteMPS package which requires me to utilize the left and right fixed points (and the rest of the spectrum) of an object referred to in literature as the transfer matrix. This object is T^{l_1,r_1}_{l_2,r_2} = \sum_sA^{l_1, r_1}_{s} \overline{A}_{s, l_2, r_2} for a given tensor in the infinte MPS A, and, to me at least, along with its spectrum, seems critical for calculating basically everything including correlation functions and doing vumps/tdvp. However, this object seems different than the TransferMatrix function in the package already, which returns a rank 3 object. The function in the package seems to shift the tensor indices from site n to n+1, but I could be misunderstanding it.

Is there a relationship between the two objects that I’m missing or is it perhaps just a confusion in the nomenclature? In addition, there’s an example in the transfermatrix_spectrum.jl that seems to solve the eigensystem of the transfer matrix of a tensor at site 1 in the left canonical representation, but I don’t understand what eigenvectors (matrices) are being calculated for the given rank 3 tensor. Any clarification on this would be appreciated. Thanks.

Best,
Jake

edit:
Here is the part of the example file I’m referring to.

using KrylovKit: eigsolve
using LinearAlgebra

T = TransferMatrix(ψ.AL)
Tᵀ = transpose(T)
vⁱᴿ = random_itensor(dag(input_inds(T)))
vⁱᴸ = random_itensor(dag(input_inds(Tᵀ)))

neigs = 10
tol = 1e-10
λ⃗ᴿ, v⃗ᴿ, right_info = eigsolve(T, vⁱᴿ, neigs, :LM; tol=tol)
λ⃗ᴸ, v⃗ᴸ, left_info = eigsolve(Tᵀ, vⁱᴸ, neigs, :LM; tol=tol)

The TransferMatrix constructor is supposed to be constructing an object that acts like the transfer matrix of a single unit cell of the infinite MPS, so either it isn’t doing what it is meant to be doing or you might be interpreting the output incorrectly.

You say:

What is the rank-3 object you are referring to?

For an infinite MPS with a 1-site unit cell, the TransferMatrix object stores the MPS tensor of the unit cell along with its conjugate (see ITensorInfiniteMPS.jl/src/transfermatrix.jl at 7a464d5d469981ca9294549bf410a1d197b05cdb · ITensor/ITensorInfiniteMPS.jl · GitHub), but when it acts on a vector (such as in a call to eigsolve), it contracts the MPS tensors that it is storing onto the vector such that the result of the contraction is equivalent to an application of the transfer matrix onto the vector (ultimately it calls this code: ITensorInfiniteMPS.jl/src/itensormap.jl at 7a464d5d469981ca9294549bf410a1d197b05cdb · ITensor/ITensorInfiniteMPS.jl · GitHub). It never actually constructs the transfer matrix as a 4-index tensor, which would be inefficient both in memory and compute time.

Ah yes I was misunderstanding the output. That makes more sense that its the transfer matrix of a cell. However, thinking about the spectrum of this object, the left and right sets of a eigenvectors generally can have different sizes and different sets of eigenvalues since A_1 \neq A_N. This poses a conceptual challenge for me for calculating correlations (or going forward excited states) which depend on the decomposition of powers of the transfer matrix, which becomes unclear for when the left link dim \neq right link dim, and the eigendecomposition of T which I would like to utilize \bf{T} = |\bf{v}_R)( \bf{v}_L| + \sum_i \lambda_i |\bf{v}_i) (\bf{v}_i| \to T^n= |\bf{v}_R)( \bf{v}_L| + \sum_i \lambda_i^n |\bf{v}_i) (\bf{v}_i| , where \bf{v}_{L/R} are the left/right fixed points and the other objects are the remaining eigenvectors and eigenvalues <1, breaks down.

To circumvent this entirely would you recommend just using single site cells?

Thanks for your help.

Best,
Jake

To compute expectation values of an infinite MPS with a unit cell larger than 1 using left and right dominant eigenvectors vL and vR of the transfer matrix of the unit cell, you can do:

------A1-----A2-----A3-----
|     |      |      |     |
vL    |      O2     |     vR
|     |      |      |     |
------A1*----A2*----A3*----

for example to compute the expectation value of an operator O2 on site 2 of an infinite MPS with a 3-site unit cell.

Hi Jake, I’m wondering if you got a working “infinite” version of the correlation_matrix() function working and would be willing to share? It seems like an essential tool in using VUMPS. Constructing a finite_mps() out of a UMPS seems to be untenably slow at present.

Why is it slow to construct the finite MPS? It just involves slicing out a finite number of tensors, which is a trivial operation in terms of performance, and computing the left and right fixed points, which is an operation that is cubic in the bond dimension, the same scaling as running VUMPS in the first place (though in practice will be much faster since it is a direct calculation and doesn’t involve any Hamiltonian).

Hi Andrew,

Yes I got equal-time correlation functions working. But I would recommend referring to the reference above for how to truncate a uMPS to a finite MPS. This should be faster and more stable. For my purposes, I required the entire transfer matrix spectrum so that I can get the correct function in the UV. This required a lot of time to acquire given there are D^2 eigenmatrices. I had to save it as a jdso file( ~ 4 gb for the entire spectrum) which is not ideal for loading or getting between devices. However, if thats the route you want to go, the notes from Matt’s reply is exactly what I followed. Exact correlation functions and their fourier transforms can be calculated directly.