## Entanglement spectrum by charge (specifically for iDMRG)

How do I use this algorithm? What does that parameter do?
ThomasQuella
Posts: 1
Joined: 29 Jul 2020, 13:27

### Entanglement spectrum by charge (specifically for iDMRG)

Dear TeNPy community,

in order to get some intuition for how TeNPy works I have implemented the AKLT model and verified that the numerical DMRG results for string order, entanglement entropy and entanglement spectrum match the theoretical predictions (so far so trivial...).

I have a question/comment on the result for the entanglement spectrum by charge, specifically using infinite boundary conditions (iDMRG/iMPS) with S^z conservation.

My TeNPy's output is:
[[(array([0]), array([0.69314718])), (array([2]), array([0.69314718]))], [(array([0]), array([0.69314718])), (array([2]), array([0.69314718]))]]

I understand that this is an array of two arrays because iDMRG is internally working with a unit cell of two sites (each of which gives the same answer). I also nicely see the expected degeneracy in the entanglement spectrum.

However, what slightly "confuses" me is the asymmetry in the charges. It would be much more natural to have charges -1 and 1 (corresponding to a spin-1/2 spin that appropriately reflects the symmetry fractionalization) instead of 0 and 2. I suppose that this is due to the fact that iDMRG implicitly assigns a boundary condition at infinity (and thus initialising the MPS with a Neel-type up/down product state might give a different answer for the charges than a Neel-type down/up product state). I understand that the code is not respecting SU(2) symmetry, so it is maybe asked too much but

Question: Would it be possible to give the iDMRG code an option to return a more symmetric form for the charges of the entanglement spectrum or some more information about the "assumptions at infinity" that could be used to symmetrize the result oneself?

One approach I tried is to look for the minimal and the maximal charge in the result and then to correct by the corresponding bias (asymmetry) via

ent_spectrum = psi.entanglement_spectrum(True)[0] # Only take one entry of the array
ent_charges = [ c[0][0] for c in ent_spectrum ] # Determine all charges (max/min would be enough)
bias = int((ent_charges[-1] + ent_charges[0])/2) # Determine bias
ent_spectrum = [ (c[0]-bias,c[1]) for c in ent_spectrum ] # Correct for bias

In an ideal world this should obviously work. However, it fails if there are "spurious" states in the entanglement spectrum that add a charge to the entanglement spectrum without an appropriate partner at the other end and that would disappear of the bond dimension was increased. Is there a standard way to identify and remove such spurious states beyond truncating the list at a certain entanglement energy? This is probably not so relevant for the AKLT model but e.g. for SU(2)-invariant deformations towards the Heisenberg model.

Anyway, this is mainly a comment and a suggestion to think about how this observation (regarding some "unexpected" or rather unintuitive behavior for iDMRG) could be used to improve the code (or its documentation).

Best regards,
Thomas

Johannes
Posts: 179
Joined: 21 Jul 2018, 12:52
Location: UC Berkeley

### Re: Entanglement spectrum by charge (specifically for iDMRG)

For infinite systems, the absolute value of the charges has no physical meaning but is a pure gauge choice; physical is only the difference between charge values.
Indeed, the absolute value depends on the choice of your initial state - did you get different results when you initialized with the down-up Neel state instead of a up-down state?

For a finite system, the absolute value of the charge tells you the charge on the left of the bond where you calculate ("left" because of TeNPy conventions).
For the AKLT model, you have open spin-1/2 not coupled to anything at the left and right end of your chain (before the projection on the Spin-1 subspace), leading to the ground state degeneracy. The "charge on the left" obviously depends of the state of the left free spin-1/2 and is thus somewhat "random"
But even for topologically trivial models, the absolute value of the charge for the infinite system can depend on the initial state and the "history" of the intermediate states during the DMRG sweeps.

Really, you should only consider the differences of charge values.
You proposed to subtract the "bias"; but the way you calculate this is slightly wrong. You should probably subtract the average_charge; however, note that this is a float and not an integer: psi.average_charge(bond=0) corresponds to $$\langle \psi| \sum_{i~\mathrm{left~of~bond 0}} (q_i - q_0) |\psi\rangle$$, where q_i is the local charge operator, e.g. Sz, and q_0 is a constant coming from a possibly non-zero get_total_charge of the MPS.
If you really want, you could subract the "nearst integer" to psi.average_charge from the charge values.

For more details and an explanation how to regularize the value of psi.average_charge() itself (namely to subtract the average over the different bonds in the MPS unit cell), see the appendix "U(1) charge conservation of iMPS" of arXiv:1211.3733.