Page 1 of 1

leading eigenvector of transfer matrix

Posted: 10 Mar 2020, 13:48
by QichengTang
Hi everyone,

it is well known that, in left(right) canonical form infinite MPS, the leading left(right) eigenvector (corresponding to eigenvalue 1) of the transfer matrix is a unit matrix \(\mathbb{1}\), and the leading right(left) eigenvector is \(\lambda^2 \mathbb{1} \).

However, when I trying to test this in my dmrg package, I found that I cannot get the consistent result, that is, the right(left) eigenvector is not \(\lambda^2 \mathbb{1} \). I have also checked this in TeNPy, returns the same result as in my package. The resulting eigenvector is a diagonal matrix with different values to \(\lambda^2\).

There is one thing may be worth to note: the sum of the elements in the eigenvector is not 1 (which means it does not satisfy the condition \(\sum_i {\lambda_i}^2 = 1\)), however the sum of the square of these elements is very close to 1.

Could anyone help me with this?

Thanks,
Qicheng

Below I post the tenpy code

Code: Select all

import numpy as np
from tenpy.algorithms import dmrg
from tenpy.models.tf_ising import TFIChain
from tenpy.networks.mps import MPS, TransferMatrix

def DMRG_tf_ising_infinite(g, chi, verbose=True):
    print("infinite DMRG, transverse field Ising model")
    print("g={g:.2f}".format(g=g))
    model_params = dict(L=2, J=1., g=g, bc_MPS='infinite', conserve=None, verbose=verbose)
    M = TFIChain(model_params)
    product_state = ["up"] * M.lat.N_sites
    psi = MPS.from_product_state(M.lat.mps_sites(), product_state, bc=M.lat.bc_MPS)
    dmrg_params = {
        'start_env': 10,
        'mixer': False,
        'trunc_params': {
            'chi_max': chi,
            'svd_min': None,
        },
        'max_E_err': 1.e-9,
        'max_S_err': 1.e-6,
        'update_env': 0,
        'verbose': verbose,
    }
    eng = dmrg.EngineCombine(psi, M, dmrg_params)
    E, psi = eng.run()
    print("E = {E:.13f}".format(E=E))
    print("finial bond dimensions: ", psi.chi)
    return psi

psi = DMRG_tf_ising_infinite(g=1., chi=15)
T = TransferMatrix(psi, psi, charge_sector=0, form='A')
w, v = T.eigenvectors(1, which='LM')
v = v[0]
v = v.split_legs().to_ndarray()

Re: leading eigenvector of transfer matrix

Posted: 10 Mar 2020, 23:23
by Johannes
It's just a matter of normalization.
Eigenvalues get normalized to np.linalg.norm(v) = 1, but in this case you want np.sum(v) = 1.

At the end of your code, add

Code: Select all

vdiag = v.diagonal()
print(vdiag/np.sum(vdiag))
print(psi.get_SL(0)**2)
and compare the results, the prints should give the same

Re: leading eigenvector of transfer matrix

Posted: 11 Mar 2020, 03:48
by QichengTang
Johannes wrote: 10 Mar 2020, 23:23 It's just a matter of normalization.
Eigenvalues get normalized to np.linalg.norm(v) = 1, but in this case you want np.sum(v) = 1.

At the end of your code, add

Code: Select all

vdiag = v.diagonal()
print(vdiag/np.sum(vdiag))
print(psi.get_SL(0)**2)
and compare the results, the prints should give the same

Thanks for noticing this, this is not even an issue.
BTW, in this sense, the normalization factors of the left (to square singular value) and right eigenvector (identity) of right canonical form should cancel each other out, right? However, in a real case it seems will change the largest amplitude of the transfer matrix (the largest eigenvalue will be not equal to one)?

Re: leading eigenvector of transfer matrix

Posted: 11 Mar 2020, 04:10
by Johannes
QichengTang wrote: 11 Mar 2020, 03:48 BTW, in this sense, the normalization factors of the left (to square singular value) and right eigenvector (identity) of right canonical form should cancel each other out, right? However, in a real case it seems will change the largest amplitude of the transfer matrix (the largest eigenvalue will be not equal to one)?
I don't get your question completely. What do you expect to cancel out?
You can rescale an eigenvector by an arbitrary (non-zero) factor, and they will still be an eigenvector to the very same eigenvalue. Multiplying a global factor in the transfer matrix will rescale all eigenvalues accordingly, and corresponds to rescaling the MPS. You cannot, however, multiply the singular values into the transfermatrix - this will change the eigenvectors.

Re: leading eigenvector of transfer matrix

Posted: 11 Mar 2020, 04:32
by QichengTang
Johannes wrote: 11 Mar 2020, 04:10
QichengTang wrote: 11 Mar 2020, 03:48 BTW, in this sense, the normalization factors of the left (to square singular value) and right eigenvector (identity) of right canonical form should cancel each other out, right? However, in a real case it seems will change the largest amplitude of the transfer matrix (the largest eigenvalue will be not equal to one)?
I don't get your question completely. What do you expect to cancel out?
You can rescale an eigenvector by an arbitrary (non-zero) factor, and they will still be an eigenvector to the very same eigenvalue. Multiplying a global factor in the transfer matrix will rescale all eigenvalues accordingly, and corresponds to rescaling the MPS. You cannot, however, multiply the singular values into the transfermatrix - this will change the eigenvectors.
Yes, I just notice that I raise a problematical question.
I consider that if I pick the B matrices located on a single site to form the transfer matrix, will I get the same result (I mean numerically).
However, if the unit cell is set to have a length e.g. 2, the left and right B matrices may not be the same one (even when the Hamiltonian has the translation symmetry), so it will be different.
In uniform MPS, the matrices are always the same one (so that the translation symmetry is exact), I can feel safe to pick a single one to form transfer matrix. But in two-site idmrg it is not a good idea.

Re: leading eigenvector of transfer matrix

Posted: 11 Mar 2020, 05:12
by Johannes
You cannot/should not take the transfer matrix of a single site, if you have a two-site unit cell in your MPS. Sometimes, the charge values will not even allow you, and even if they do, it there is a different gauge on the two bonds - which can and will be the case if there are degenerate singular values.

You can, however, ask what the left and right eigenvectors of the transfer matrix consisting of [psi.get_B(1), psi.get_B(0)] are - this will give you the singular values on the bond between sites 0 and 1. You expect them to be the same as the ones on the bond (-1, 0), if your state is translation invariant under translation by just one site.
The latter might or might not be the case for ground states of fully translation invariant hamiltonians, e.g. the ground state in an anti-ferromagnetic phase breaks translation invariance!

Re: leading eigenvector of transfer matrix

Posted: 12 Mar 2020, 08:07
by QichengTang
Johannes wrote: 11 Mar 2020, 05:12 You cannot/should not take the transfer matrix of a single site, if you have a two-site unit cell in your MPS. Sometimes, the charge values will not even allow you, and even if they do, it there is a different gauge on the two bonds - which can and will be the case if there are degenerate singular values.

You can, however, ask what the left and right eigenvectors of the transfer matrix consisting of [psi.get_B(1), psi.get_B(0)] are - this will give you the singular values on the bond between sites 0 and 1. You expect them to be the same as the ones on the bond (-1, 0), if your state is translation invariant under translation by just one site.
The latter might or might not be the case for ground states of fully translation invariant hamiltonians, e.g. the ground state in an anti-ferromagnetic phase breaks translation invariance!
Thanks for your reply, Johannes. I totally agree with you.