Calculate the ground state of a 2d quantum Ising model.

Simple example on how to set up a Quantum ising 2-dimensional ground state search

# pylint: disable=invalid-name

import numpy as np
import numpy.linalg as nla

import qtealeaves as qtl
from qtealeaves.models import get_quantum_ising_2d

We first define a simple function that returns thr TRUE ground state energy value previously computed. In this way, we can be sure the final result will be correct

def get_osmps_reference():
    """
    Return ground state reference value from OSMPS simulation.
    """
    ref_osmps = -24.710085956694
    return ref_osmps

We prefer to use a main method to avoid the automatic run when imported

def main(tn_type=5, output_folder=None):
    """
    Main method for the ground state simulation of a
    quantum Ising model in 2D.

    **Arguments**

    tn_type : int, optional
        Choose 5 for python-TTN, 6 for python-MPS.
        Default to 5.

    output_folder : str | None, optional
        Output folder. Default to None.
    """

    ###############################################################################
    # Defining the model, in this case, is very simple, since it is one of the
    # already available models of the library. However, defining a model is simple
    # even starting from scratch! For an example see :docs:`other_example` or the
    # code of :func:`get_quantum_ising_2d`

    model, my_ops = get_quantum_ising_2d()

    ###############################################################################
    # We define **parametric** I/O folder to keep the results more ordered. As you
    # see, they are parametrized through the size of the chain, i.e. the number
    # of physical sites of the Tensor network
    if output_folder is None:
        output_folder = lambda params: "QI2d_L%d" % (params["L"])

    ###############################################################################
    # We define the convergence parameters and the observables: they are really
    # important:
    #
    # - The convergence parameters ensure we have a relaiable result. See
    #   :docs:`/../chapters/convergence` for further informations about them.
    # - The observables ensure we are measuring (and storing) something at the end
    #   of the simulation! See :docs:`/../chapters/measurements` for further
    #   informations about the available observables.

    my_conv = qtl.convergence_parameters.TNConvergenceParameters(
        max_iter=5, max_bond_dimension=16
    )
    my_obs = qtl.observables.TNObservables()

    ###############################################################################
    # Define the simulation instance

    simulation = qtl.QuantumGreenTeaSimulation(
        model,
        my_ops,
        my_conv,
        my_obs,
        tn_type=tn_type,
        folder_name_output=output_folder,
        store_checkpoints=False,
    )

    ###############################################################################
    # Define the parameters of the models: here we define the 'L' seen in the
    # I/O definition at the beginning! Instead 'J' and 'g' are important model
    # parameters

    params = [
        {
            "L": 4,
            # model parameters
            "J": 1.0,
            "g": 0.5,
        }
    ]

    ###############################################################################
    # We finally run the simulation, checking that everything is ok

    simulation.run(params, delete_existing_folder=True)

    for elem in params:
        tn_energy_0 = simulation.get_static_obs(elem)["energy"]

        if elem["L"] == 2:
            ed_energy_0, _ = nla.eigh(model.build_ham(my_ops, elem))[0][:2]
            print("ED vs TN ground state energy", ed_energy_0, tn_energy_0)

            assert np.abs(tn_energy_0 - ed_energy_0) < 1e-4
            msg_check = "ground state energy vs ED at least correct up to 1e-4."

        elif elem["L"] == 4:
            # Can compare to OSMPS
            ref_osmps = get_osmps_reference()
            print("QTea vs OSMPS ground state energy", tn_energy_0, ref_osmps)

            assert np.abs(tn_energy_0 - ref_osmps) < 1e-4
            msg_check = "ground state energy vs OSMPS at least correct up to 1e-4."

        else:
            print("Ground state energy", tn_energy_0)
            msg_check = "No checks implemented for this simulation."

    print(f"\nExample `{__file__}` ran successfully; " + msg_check)

    return

Run the code

if __name__ == "__main__":
    main()

Gallery generated by Sphinx-Gallery