def grow_block_by_one_site(growing_block, ground_state_wf, system, number_of_states_kept): """Grows one side of the system by one site. Calculates the truncation matrix by calculating the reduced density matrix for `ground_state_wf` by tracing out the degrees of freedom of the shrinking side. Then updates the operators you need in the next steps, effectively growing the size of the block by one site. Parameters ---------- growing_block : a string. The block which is growing. It must be 'left' or 'right'. ground_state_wf : a Wavefunction. The ground state wavefunction of your system. system : a System object. The system you want to do the calculation on. This function assumes that you have set the Hamiltonian to something. number_of_states_kept : an int. The number of states you want to keep in each block after the truncation. If the `number_of_states_kept` is smaller than the dimension of the current Hilbert space block, all states are kept. Returns ------- entropy : a double. The Von Neumann entropy for the cut that splits the chain into two equal halves. truncation_error : a double. The truncation error, i.e. the sum of the discarded eigenvalues of the reduced density matrix. Raises ------ DMRGException if `growing_side` is not 'left' or 'right'. """ if growing_block not in ('left', 'right'): raise DMRGException('Growing side must be left or right.') system.set_growing_side(growing_block) rho = ground_state_wf.build_reduced_density_matrix(growing_block) evals, evecs = diagonalize(rho) truncated_evals, truncation_matrix = truncate(evals, evecs, number_of_states_kept) entropy = calculate_entropy(truncated_evals) truncation_error = calculate_truncation_error(truncated_evals) set_block_hamiltonian_to_AF_Heisenberg(system) set_operators_to_update_to_AF_Heisenberg(system) system.update_all_operators(truncation_matrix) return entropy, truncation_error
def trace_out_left_qbit_and_calculate_entropy(wf): """Calculates the entropy after tracing out the left qbit. To calculate the entanglement entropy you need to first build the reduced density matrix tracing out the degrees of freedom of one of the two qbits (it does not matter which, we pick up left here.) Parameters ---------- wf : a Wavefunction The wavefunction you build up the reduced density matrix with. Returns ------- result : a double The value of the von Neumann entanglement entropy after tracing out the left qbit. """ reduced_DM_for_right_qbit = wf.build_reduced_density_matrix('left') evals, evecs = diagonalize(reduced_DM_for_right_qbit) result = calculate_entropy(evals) return result