def test_h2_spin_adapted_ab(): h2_file = os.path.join(DATA_DIRECTORY, "H2_sto-3g_singlet_0.7.hdf5") molecule = MolecularData(filename=h2_file) rdms = molecule.get_molecular_rdm(use_fci=True) dim = molecule.n_qubits paulis_to_measure = pauli_terms_for_tpdm(dim) pauli_to_coeff = {} for term in paulis_to_measure: # convert back to FermionOperator qubit_op = pyquilpauli_to_qubitop(term_with_coeff(term, 1.0)) pauli_to_coeff[term.id()] = rdms.expectation(qubit_op) tpdm = pauli_to_tpdm(dim, pauli_to_coeff) d2aa, d2bb, d2ab = get_sz_spin_adapted(tpdm) paulis_to_measure_ab = pauli_terms_for_tpdm_ab(dim // 2) pauli_to_coeff = {} for term in paulis_to_measure_ab: # convert back to FermionOperator qubit_op = pyquilpauli_to_qubitop(term_with_coeff(term, 1.0)) pauli_to_coeff[term.id()] = rdms.expectation(qubit_op) tpdm_ab = pauli_to_tpdm_ab(dim // 2, pauli_to_coeff) assert np.allclose(d2ab, tpdm_ab)
def remove_imaginary_terms(pauli_sums: PauliSum) -> PauliSum: """ Remove the imaginary component of each term in a Pauli sum. :param pauli_sums: The Pauli sum to process. :return: a purely Hermitian Pauli sum. """ if not isinstance(pauli_sums, PauliSum): raise TypeError("not a pauli sum. please give me one") new_term = sI(0) * 0.0 for term in pauli_sums: new_term += term_with_coeff(term, term.coefficient.real) return new_term
def test_lih_tpdm_ab_build(): """ Check if 2-RDM construction from pauli terms works for the ab block """ lih_file = os.path.join(DATA_DIRECTORY, "H1-Li1_sto-3g_singlet_1.45.hdf5") molecule = MolecularData(filename=lih_file) rdms = molecule.get_molecular_rdm(use_fci=True) dim = molecule.n_qubits d2aa, d2bb, d2ab = get_sz_spin_adapted(molecule.fci_two_rdm) paulis_to_measure = pauli_terms_for_tpdm_ab(dim // 2) pauli_to_coeff = {} for term in paulis_to_measure: # convert back to FermionOperator qubit_op = pyquilpauli_to_qubitop(term_with_coeff(term, 1.0)) pauli_to_coeff[term.id()] = rdms.expectation(qubit_op) tpdm_ab = pauli_to_tpdm_ab(dim // 2, pauli_to_coeff) assert np.allclose(tpdm_ab, d2ab)
def test_h2_tpdm_build(): """ Check if constructing the 2-RDM (full) works. This check uses openfermion data and thus requires openfermion to be installed """ h2_file = os.path.join(DATA_DIRECTORY, "H2_sto-3g_singlet_0.7.hdf5") molecule = MolecularData(filename=h2_file) rdms = molecule.get_molecular_rdm(use_fci=True) dim = molecule.n_qubits paulis_to_measure = pauli_terms_for_tpdm(dim) pauli_to_coeff = {} for term in paulis_to_measure: # convert back to FermionOperator qubit_op = pyquilpauli_to_qubitop(term_with_coeff(term, 1.0)) pauli_to_coeff[term.id()] = rdms.expectation(qubit_op) tpdm = pauli_to_tpdm(dim, pauli_to_coeff) assert np.allclose(tpdm, molecule.fci_two_rdm)
def test_term_with_coeff(): assert PauliTerm('X', 0, 1.j) == term_with_coeff(sX(0), 1.j) assert PauliTerm('X', 0, -1.0) == term_with_coeff(sX(0), -1) with pytest.raises(ValueError): term_with_coeff(sI(0), None)
def test_term_with_coeff(): q0 = QubitPlaceholder() assert PauliTerm('X', q0, 1.j) == term_with_coeff(sX(q0), 1.j) assert PauliTerm('X', q0, -1.0) == term_with_coeff(sX(q0), -1) with pytest.raises(ValueError): term_with_coeff(sI(q0), None)