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 spin1/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 Neeltype up/down product state might give a different answer for the charges than a Neeltype 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
Entanglement spectrum by charge (specifically for iDMRG)

 Posts: 2
 Joined: 29 Jul 2020, 13:27
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 downup Neel state instead of a updown 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 spin1/2 not coupled to anything at the left and right end of your chain (before the projection on the Spin1 subspace), leading to the ground state degeneracy. The "charge on the left" obviously depends of the state of the left free spin1/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:
If you really want, you could subract the "nearst integer" to
For more details and an explanation how to regularize the value of
Indeed, the absolute value depends on the choice of your initial state  did you get different results when you initialized with the downup Neel state instead of a updown 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 spin1/2 not coupled to anything at the left and right end of your chain (before the projection on the Spin1 subspace), leading to the ground state degeneracy. The "charge on the left" obviously depends of the state of the left free spin1/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 nonzero 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.
 Posts: 2
 Joined: 29 Jul 2020, 13:27
Re: Entanglement spectrum by charge (specifically for iDMRG)
Thank you very much for your detailed answer, Johannes, and apologies for the late reply. I agree that the charge offset is a gauge choice from the perspective of U(1)/S^z conservation. However, it is not from the perspective of full su(2) conservation since the number of states with S^zcharge m needs to match the number of states with S^zcharge m (such that the average charge is zero). Of course su(2) is not implemented in the code but having a symmetric result still simplifies the interpretation if that symmetry is present. In any case, with your kind suggestions I will be able to realize this myself in the context I am interested in, so thanks again.