def get_transformed_Haldanechain(L=__L__): #transformed Heisenberg spins = ["S=1" for i in range(L)] # S=1 chain sc2 = spinchain.Spin_Chain(spins) # create spin chain object h = 0 # initialize Hamiltonian for i in range(len(spins) - 1): expSx = -2 * sc2.Sx[i + 1] * sc2.Sx[i + 1] + mo.obj2MO(1) expSz = -2 * sc2.Sz[i] * sc2.Sz[i] + mo.obj2MO(1) h = h + sc2.Sx[i] * sc2.Sx[i + 1] h = h + sc2.Sy[i] * expSz * expSx * sc2.Sy[i + 1] h = h + sc2.Sz[i] * sc2.Sz[i + 1] sc2.set_hamiltonian(h) return sc2
import numpy as np import matplotlib.pyplot as plt from dmrgpy import fermionchain from dmrgpy import multioperator n = 8 fc = fermionchain.Fermionic_Chain(n, spinful=False) # create the chain m = np.matrix(np.random.random((n, n)) + 1j * np.random.random((n, n))) m = m + m.H def ft(i, j): return m[i, j] if abs(j - i) == 1: return 1.0 return 0.0 fc.set_hoppings(ft) # hoppings den = 0 for i in range(n): # loop over sites deni = multioperator.obj2MO([["N", i]]) den = den + deni print("Total density with DMRG", fc.excited_vev(den, mode="DMRG", n=4).real) print("Total density with ED", fc.excited_vev(den, mode="ED", n=4).real) print("Energies with DMRG", fc.get_excited(mode="DMRG", n=4).real) print("Energies with ED", fc.get_excited(mode="ED", n=4).real)
sys.path.append(os.getcwd() + '/../../src') import numpy as np from dmrgpy import spinchain, multioperator from openfermion.ops import QubitOperator from ..Utilities.WaveLocalProperties import two_DM_to_one_DMs, entropy_one_DM """ The file provides functions for classical precalculation by dmrgpy Exact Diagonalization (ED) and Density Matrix Renormalization Group (DMRG) can be used The output is the ground state energy and a array of two-body reduced density matrices The main function is run_classcal_precalculation() """ MAX_N_QUBIT = 40 PauliX_MO = [2 * multioperator.obj2MO([["Sx", i]]) for i in range(MAX_N_QUBIT)] PauliY_MO = [2 * multioperator.obj2MO([["Sy", i]]) for i in range(MAX_N_QUBIT)] PauliZ_MO = [2 * multioperator.obj2MO([["Sz", i]]) for i in range(MAX_N_QUBIT)] PauliMO = [None, PauliX_MO, PauliY_MO, PauliZ_MO] MatI = np.array([[1, 0], [0, 1]], np.complex) MatX = np.array([[0, 1], [1, 0]], np.complex) MatY = np.array([[0, -1j], [1j, 0]], np.complex) MatZ = np.array([[1, 0], [0, -1]], np.complex) PauliMat = [MatI, MatX, MatY, MatZ] PauliChar = ['I', 'X', 'Y', 'Z'] def get_one_two_density_matrix(n_qubit, spinchain): twodensity = np.array([[np.kron(MatI, MatI)] * n_qubit] * n_qubit) onedensity = [MatI] * n_qubit
m = m + m.H def ft(i, j): return m[i, j] if abs(j - i) == 1: return 1.0 return 0.0 h = 0 for i in range(n): for j in range(n): h = h + fc.Cdag[i] * fc.C[j] * ft(i, j) fc.set_hamiltonian(h) # hoppings print("Energy with ED", fc.gs_energy(mode="ED")) print("Energy with DMRG", fc.gs_energy(mode="DMRG")) pairs = [(0, i) for i in range(n)] den = [] for i in range(n): # loop over sites cd = multioperator.obj2MO([["Cdag", i]]) c = multioperator.obj2MO([["C", i]]) den.append(cd * c) print("Density DMRG", [fc.vev(di, mode="DMRG").real for di in den]) print("Density ED", [fc.vev(di, mode="ED").real for di in den])