def app_2_eigensystem_general_matrices(GS_indices, GS_energy, h_x_range, J, N,
                                       basis, Jij):
    # Calculate approximated eigenvalues and eigenstates for range(h_x)
    app_eigenvalues = np.zeros((len(GS_indices), len(h_x_range)))
    app_eigenstates = np.zeros(
        (len(h_x_range), len(GS_indices), len(GS_indices)))

    ES_1_indices = tfim_matrices.Hamming_set(basis, GS_indices, N, GS_indices)
    PVP = tfim_matrices.PVP(basis, GS_indices, N)
    PVQ = tfim_matrices.PVQ_1(basis, Jij, GS_indices, ES_1_indices, N,
                              GS_energy)
    QVP = np.transpose(PVQ)
    energy_gap_matrix = tfim_matrices.energy_gap(basis, Jij, ES_1_indices, N,
                                                 GS_energy, 1)

    # Build 0th order approximated matrix
    H_0 = H_app_0(GS_energy, GS_indices)

    # Start building the 1st order Hamiltonian
    H_app_1 = PVP

    # Start building the 2nd Hamiltonian
    H_app_2 = PVQ @ energy_gap_matrix @ QVP

    for j, h_x in enumerate(h_x_range):
        app_eigenvalue, app_eigenstate = np.linalg.eigh(
            H_app_2nd(h_x, H_0, H_app_1, H_app_2, J))
        for i in range(len(GS_indices)):
            app_eigenvalues[i][j] = app_eigenvalue[i]
            for k in range(len(GS_indices)):
                app_eigenstates[j][i][k] = app_eigenstate[i][k]
    return app_eigenvalues, app_eigenstates
def app_4_eigensystem_general_matrices(GS_indices, GS_energy, h_x_range, J, N,
                                       basis, Jij):
    # Calculate approximated eigenvalues and eigenstates for range(h_x)
    app_eigenvalues = np.zeros((len(GS_indices), len(h_x_range)))
    app_eigenstates = np.zeros(
        (len(h_x_range), len(GS_indices), len(GS_indices)))

    # Building blocks matrices
    ES_1_indices = tfim_matrices.Hamming_set(basis, GS_indices, N, GS_indices)
    ES_2_indices = tfim_matrices.Hamming_set(basis, ES_1_indices, N,
                                             GS_indices)

    # Building blocks matrices
    PVP = tfim_matrices.PVP(basis, GS_indices, N)
    PVQ1 = tfim_matrices.PVQ_1(basis, Jij, GS_indices, ES_1_indices, N,
                               GS_energy)
    Q1VP = np.transpose(PVQ1)
    Q1VQ1 = tfim_matrices.Q_1VQ_1(basis, ES_1_indices, GS_indices, N)
    Q1VQ2 = tfim_matrices.Q_1VQ_2(basis, ES_2_indices, ES_1_indices,
                                  GS_indices, N)
    Q2VQ1 = np.transpose(Q1VQ2)

    # energy_gap_matrix_12 (EGM) denotes 1/(E_0-QH_0Q)^2 from Q1 to Q1
    EGM_12 = tfim_matrices.energy_gap(basis, Jij, ES_1_indices, N, GS_energy,
                                      2)
    EGM_13 = tfim_matrices.energy_gap(basis, Jij, ES_1_indices, N, GS_energy,
                                      3)
    EGM_11 = tfim_matrices.energy_gap(basis, Jij, ES_1_indices, N, GS_energy,
                                      1)
    EGM_21 = tfim_matrices.energy_gap(basis, Jij, ES_2_indices, N, GS_energy,
                                      1)

    # Start building Hamiltonians

    H_0 = H_app_0(GS_energy, GS_indices)

    H_app_1 = PVP

    H_app_2 = PVQ1 @ EGM_11 @ Q1VP

    H_app_3 = -0.5 * (PVP @ PVQ1 @ EGM_12 @ Q1VP + np.transpose(
        PVP @ PVQ1 @ EGM_12 @ Q1VP)) + PVQ1 @ EGM_11 @ Q1VQ1 @ EGM_11 @ Q1VP

    H_app_4 = 0.5 * (tfim_matrices.hc(
        PVQ1 @ EGM_13 @ Q1VP @ PVP @ PVP)) - 0.5 * (tfim_matrices.hc(
            PVQ1 @ EGM_12 @ Q1VP @ PVQ1 @ EGM_11 @ Q1VP)) - 1. * (
                tfim_matrices.hc(PVQ1 @ EGM_11 @ Q1VQ1 @ EGM_12 @ Q1VP @ PVP)
            ) + 1. * (PVQ1 @ EGM_11 @ Q1VQ2 @ EGM_21 @ Q2VQ1 @ EGM_11 @ Q1VP)

    for j, h_x in enumerate(h_x_range):
        app_eigenvalue, app_eigenstate = eigh(
            H_app_4th(h_x, H_0, H_app_1, H_app_2, H_app_3, H_app_4, J))
        for i in range(len(GS_indices)):
            app_eigenvalues[i][j] = app_eigenvalue[i]
            for k in range(len(GS_indices)):
                app_eigenstates[j][i][k] = app_eigenstate[i][k]
    return app_eigenvalues, app_eigenstates
Exemple #3
0
# Build 2nd order approximated matrix

GS_energy, GS_indices = tfim_perturbation.GS(Energies)

H_app_0 = tfim_perturbation.H_app_0(GS_energy, GS_indices)
H_app_1 = tfim_perturbation.H_app_1(basis, GS_indices, N)
H_app_2 = tfim_perturbation.H_app_2(basis, Jij, GS_indices, N, GS_energy)
H_app_3 = tfim_perturbation.H_app_3(basis, Jij, GS_indices, N, GS_energy)

# Parametrize H_app_4

# Building block matrices
ES_1_indices = tfim_matrices.Hamming_set(basis, GS_indices, N, GS_indices)
ES_2_indices = tfim_matrices.Hamming_set(basis, ES_1_indices, N, GS_indices)
PVP = tfim_matrices.PVP(basis, GS_indices, N)
PVQ1 = tfim_matrices.PVQ_1(basis, Jij, GS_indices, ES_1_indices, N, GS_energy)
Q1VP = np.transpose(PVQ1)
Q1VQ1 = tfim_matrices.Q_1VQ_1(basis, ES_1_indices, GS_indices, N)
Q1VQ2 = tfim_matrices.Q_1VQ_2(basis, ES_1_indices, ES_2_indices, GS_indices, N)
Q2VQ1 = np.transpose(Q1VQ2)

# energy_gap_matrix_12 (EGM) denotes 1/(E_0-QH_0Q)^2 from Q1 to Q1
EGM_12 = tfim_matrices.energy_gap(basis, Jij, ES_1_indices, N, GS_energy, 2)
EGM_13 = tfim_matrices.energy_gap(basis, Jij, ES_1_indices, N, GS_energy, 3)
EGM_11 = tfim_matrices.energy_gap(basis, Jij, ES_1_indices, N, GS_energy, 1)
EGM_21 = tfim_matrices.energy_gap(basis, Jij, ES_2_indices, N, GS_energy, 1)


def H_app_4_param(param):
    return param[0] * (PVQ1 @ EGM_13 @ Q1VP @ PVP @ PVP + np.transpose(