About the canonical form

How do I use this algorithm? What does that parameter do?
Post Reply
Seira Asakawa
Posts: 1
Joined: 09 Jan 2024, 03:26

About the canonical form

Post by Seira Asakawa »

To be concise, it appears that I am unable to obtain the canonical form of an MPS after calling mps.canonical_form() or mps.compress_svd(). Specifically, I cannot obtain an MPS with a norm of 1, i.e., mps.overlap(mps) is not equal to 1.

I am following the "MPO-MPS" method (arXiv:2001.04611), which is used to represent paired fermion states with an MPS. The main idea involves applying a series of MPOs successively to an MPS, similar to applying fermion creation operators to the vacuum. During the application process, it is necessary to truncate the MPS after each MPO application to prevent the exponential growth of virtual bond dimensions. The truncation involves a right sweep with QR and then a left sweep with SVD truncation, achievable through mps.compress_svd(). Once all MPOs are applied, we obtain an MPS representing the ground state of a paired fermion system. Consequently, mpo.expectation_value(mps) provides the ground state energy.

I am working on the transverse-field XY model but have been unable to obtain the correct ground state energy as calculated through exact diagonalization. After each MPO application step with mps.compress_svd(), I check the norm of the MPS using mps.overlap(mps).

Code: Select all

print("applying MPO number", m, "the entropy is", entropy_step, "check the norm is", mps.overlap(mps))
where my MPO application function is defined as:

Code: Select all

def contraction_step(mpo,mps):
    mpo.apply_naively(mps)
    mps.compress_svd({"chi_max":200})
    s = mps.entanglement_entropy_segment2(np.arange(M).tolist())
    return s
M is half-length of the chain.

Although I obtain the correct entropies, the norm progressively decreases. I attempted calling mps.canonical_form() after mps.compress_svd({"chi_max": 200}) within the MPO application function and also before mpo.expectation_value(mps) (the step estimating the energy). However, I still cannot obtain the correct norm and energy.

I noticed that under MPS.canonical_form(), there is a note stating, "Note that even renormalize=True does not reset the norm to 1. To do that, you would rather have to set psi.norm = 1 explicitly!" However, even if I manually set the norm to 1, the energy remains incorrect.

I have a MATLAB version of the MPO-MPS method code that runs successfully and provides the correct entropies and energy. I intend to rewrite the code in Python using TeNPy, but I am currently struggling to identify the issue.
Post Reply