Entanglement spectrum by charge (specifically for iDMRG)
Posted: 30 Jul 2020, 00:13
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
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