2D Hubbard Model

This tutorial shows how to generate a Pauli Hamiltonian from a lattice-based Hubbard model, using isqham. The Hamiltonian is encoded using the Jordan-Wigner transformation.

Prerequisites

Make sure you’ve installed the package (isqham).

[1]:
import numpy as np

from isqham.lattice.fermionLattice import (
    PrimaryLattice_HubbardModel,
    SuperLatticeHamiltonian,
)
from isqham.qubitEncoding import JordanWignerEncoding

Step 1: Construct the Superlattice Hamiltonian

[2]:
def getSupH(U):
    basis = np.array([
        [1.0, 0.0, 0.0],
        [0.0, 1.0, 0.0],
        [0.0, 0.0, 1.0],
    ])

    t = -1.0
    mu = U / 2

    priH = PrimaryLattice_HubbardModel(basis=basis)
    priH.setOrbitPosition(idx=0, pos=[0.0, 0.0, 0.0])
    priH.setHopping(R=[1, 0, 0], orbit_i=0, orbit_j=0, tij=t)
    priH.setHopping(R=[0, 1, 0], orbit_i=0, orbit_j=0, tij=t)
    priH.setCoulombU(orbit_i=0, U=U)
    priH.setOnSide(orbit_i=0, m=-mu)

    supBasis = [
        [1, 1, 0],
        [1, -1, 0],
        [0, 0, 1],
    ]

    supH = SuperLatticeHamiltonian(priHam=priH, superLatticeIndex=supBasis)
    return supH

Step 2: Generate the Fermionic Hamiltonian

[3]:
def getLatticeHam(U):
    supH = getSupH(U)
    return supH.get_ClusterH()

Step 3: Encode to Pauli Hamiltonian

[4]:
def getHam(latticeHam):
    return latticeHam.exportPauliOperator(
        JordanWignerEncoding()
    ).exportPauliHamiltonian()

Step 4: Test the Result

[5]:
ham = getHam(getLatticeHam(U=3.0))

# View coefficients
print("Factors:", ham.get_factor())

# View Pauli operators (encoded as int arrays)
print("Pauli Operators:", ham.get_pauliOperators())

# View constant offset
print("dH:", ham.getdH())
Factors: [0.5, 0.5, 0.5, 0.5, 0.75, 0.75]
Pauli Operators: [[1, 3, 1, 0], [2, 3, 2, 0], [0, 1, 3, 1], [0, 2, 3, 2], [3, 3, 0, 0], [0, 0, 3, 3]]
dH: -1.5

Summary

  • Build a primary Hubbard model on a lattice

  • Expand it into a superlattice

  • Convert the fermionic model to a qubit Hamiltonian

  • Export as Pauli operators using Jordan-Wigner encoding

You can now use this Pauli Hamiltonian in VQE, time evolution, or circuit synthesis.