purification.py

on github (download).

"""An example for purification MPS."""
# Copyright (C) TeNPy Developers, Apache license

from tenpy.algorithms.purification import PurificationApplyMPO, PurificationTEBD
from tenpy.models.tf_ising import TFIChain
from tenpy.networks.purification_mps import PurificationMPS


def imag_tebd(L=30, beta_max=3.0, dt=0.05, order=2, bc='finite'):
    model_params = dict(L=L, J=1.0, g=1.2)
    M = TFIChain(model_params)
    psi = PurificationMPS.from_infiniteT(M.lat.mps_sites(), bc=bc)
    options = {'trunc_params': {'chi_max': 100, 'svd_min': 1.0e-8}, 'order': order, 'dt': dt, 'N_steps': 1}
    beta = 0.0
    eng = PurificationTEBD(psi, M, options)
    Szs = [psi.expectation_value('Sz')]
    betas = [0.0]
    while beta < beta_max:
        beta += 2.0 * dt  # factor of 2:  |psi> ~= exp^{- dt H}, but rho = |psi><psi|
        betas.append(beta)
        eng.run_imaginary(dt)  # cool down by dt
        Szs.append(psi.expectation_value('Sz'))  # and further measurements...
    return {'beta': betas, 'Sz': Szs}


def imag_apply_mpo(L=30, beta_max=3.0, dt=0.05, order=2, bc='finite', approx='II'):
    model_params = dict(L=L, J=1.0, g=1.2)
    M = TFIChain(model_params)
    psi = PurificationMPS.from_infiniteT(M.lat.mps_sites(), bc=bc)
    options = {'trunc_params': {'chi_max': 100, 'svd_min': 1.0e-8}}
    beta = 0.0
    if order == 1:
        Us = [M.H_MPO.make_U(-dt, approx)]
    elif order == 2:
        Us = [M.H_MPO.make_U(-d * dt, approx) for d in [0.5 + 0.5j, 0.5 - 0.5j]]
    eng = PurificationApplyMPO(psi, Us[0], options)
    Szs = [psi.expectation_value('Sz')]
    betas = [0.0]
    while beta < beta_max:
        beta += 2.0 * dt  # factor of 2:  |psi> ~= exp^{- dt H}, but rho = |psi><psi|
        betas.append(beta)
        for U in Us:
            eng.init_env(U)  # reset environment, initialize new copy of psi
            eng.run()  # apply U to psi
        Szs.append(psi.expectation_value('Sz'))  # and further measurements...
    return {'beta': betas, 'Sz': Szs}


if __name__ == '__main__':
    import logging

    logging.basicConfig(level=logging.INFO)
    data_tebd = imag_tebd()
    data_mpo = imag_apply_mpo()

    import numpy as np
    from matplotlib.pyplot import plt

    plt.plot(data_mpo['beta'], np.sum(data_mpo['Sz'], axis=1), label='MPO')
    plt.plot(data_tebd['beta'], np.sum(data_tebd['Sz'], axis=1), label='TEBD')
    plt.xlabel(r'$\beta$')
    plt.ylabel(r'total $S^z$')
    plt.show()