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
# 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(