コード例 #1
0
 def test_identity(self):
     n_qubits = 5
     transmed_i = reverse_jordan_wigner(self.identity, n_qubits)
     expected_i = FermionOperator(())
     self.assertTrue(transmed_i.isclose(expected_i))
     retransmed_i = jordan_wigner(transmed_i)
     self.assertTrue(self.identity.isclose(retransmed_i))
コード例 #2
0
 def test_get_interaction_operator_identity(self):
     interaction_operator = InteractionOperator(-2j, self.one_body,
                                                self.two_body)
     qubit_operator = jordan_wigner(interaction_operator)
     self.assertTrue(qubit_operator == -2j * QubitOperator(()))
     self.assertEqual(interaction_operator,
                      get_interaction_operator(reverse_jordan_wigner(
                          qubit_operator), self.n_qubits))
コード例 #3
0
    def test_zero(self):
        n_qubits = 5
        transmed_i = reverse_jordan_wigner(QubitOperator(), n_qubits)
        expected_i = FermionOperator()
        self.assertTrue(transmed_i.isclose(expected_i))

        retransmed_i = jordan_wigner(transmed_i)
        self.assertTrue(expected_i.isclose(retransmed_i))
コード例 #4
0
 def test_jw_convention(self):
     """Test that the Jordan-Wigner convention places the Z-string on
     lower indices."""
     qubit_op = QubitOperator('Z0 X1')
     transformed_op = reverse_jordan_wigner(qubit_op)
     expected_op = FermionOperator('1^')
     expected_op += FermionOperator('1')
     self.assertTrue(transformed_op.isclose(expected_op))
コード例 #5
0
    def test_jordan_wigner_twobody_interaction_op_allunique(self):
        test_op = FermionOperator('1^ 2^ 3 4')
        test_op += hermitian_conjugated(test_op)

        retransformed_test_op = reverse_jordan_wigner(
            jordan_wigner(get_interaction_operator(test_op)))

        self.assertTrue(
            normal_ordered(retransformed_test_op) == normal_ordered(test_op))
コード例 #6
0
    def test_jordan_wigner_interaction_op_with_zero_term(self):
        test_op = FermionOperator('1^ 2^ 3 4')
        test_op += hermitian_conjugated(test_op)

        interaction_op = get_interaction_operator(test_op)
        interaction_op.constant = 0.0

        retransformed_test_op = reverse_jordan_wigner(
            jordan_wigner(interaction_op))
コード例 #7
0
    def test_z(self):
        pauli_z = QubitOperator(((2, 'Z'), ))
        transmed_z = reverse_jordan_wigner(pauli_z)

        expected = (FermionOperator(()) + FermionOperator(
            ((2, 1), (2, 0)), -2.))
        self.assertTrue(transmed_z.isclose(expected))

        retransmed_z = jordan_wigner(transmed_z)
        self.assertTrue(pauli_z.isclose(retransmed_z))
コード例 #8
0
def make_antisymmetric_group(fermionic_hamiltonian, jw_hamiltonian, model,
                             nspin, ansatz, threshold):
    if model == "hubbard" or "heisenberg" in model:
        fermionic_hamiltonian = reverse_jordan_wigner(jw_hamiltonian)
        fermionic_hamiltonian = normal_ordered(fermionic_hamiltonian)
        hamiltonian_list = fermi_to_str_heisenberg(fermionic_hamiltonian)
    else:
        hamiltonian_list = fermi_to_str(fermionic_hamiltonian,
                                        threshold=threshold)
    op = conv_anti(hamiltonian_list)
    id_set, size = anti_to_base(op, nspin)
    return id_set, size
コード例 #9
0
    def get_qubit_expectations(self, qubit_operator):
        """Return expectations of QubitOperator in new QubitOperator.

        Args:
            qubit_operator: QubitOperator instance to be evaluated on
                this InteractionRDM.

        Returns:
            QubitOperator: QubitOperator with coefficients
            corresponding to expectation values of those operators.

        Raises:
            InteractionRDMError: Observable not contained in 1-RDM or 2-RDM.
        """
        from openfermion.transforms import reverse_jordan_wigner
        from openfermion.utils._operator_utils import normal_ordered
        qubit_operator_expectations = copy.deepcopy(qubit_operator)
        for qubit_term in qubit_operator_expectations.terms:
            expectation = 0.

            # Map qubits back to fermions.
            reversed_fermion_operators = reverse_jordan_wigner(
                QubitOperator(qubit_term))
            reversed_fermion_operators = normal_ordered(
                reversed_fermion_operators)

            # Loop through fermion terms.
            for fermion_term in reversed_fermion_operators.terms:
                coefficient = reversed_fermion_operators.terms[fermion_term]

                # Handle molecular term.
                if FermionOperator(
                        fermion_term).is_two_body_number_conserving():
                    if not fermion_term:
                        expectation += coefficient
                    else:
                        indices = [operator[0] for operator in fermion_term]
                        if len(indices) == 2:
                            # One-body term
                            indices = tuple(zip(indices, (1, 0)))
                        else:
                            # Two-body term
                            indices = tuple(zip(indices, (1, 1, 0, 0)))
                        rdm_element = self[indices]
                        expectation += rdm_element * coefficient

                # Handle non-molecular terms.
                elif len(fermion_term) > 4:
                    raise InteractionRDMError('Observable not contained '
                                              'in 1-RDM or 2-RDM.')
            qubit_operator_expectations.terms[qubit_term] = expectation
        return qubit_operator_expectations
コード例 #10
0
    def test_xy(self):
        xy = QubitOperator(((4, 'X'), (5, 'Y')), -2.j)
        transmed_xy = reverse_jordan_wigner(xy)
        retransmed_xy = jordan_wigner(transmed_xy)

        expected1 = -2j * (FermionOperator(((4, 1), ), 1j) - FermionOperator(
            ((4, 0), ), 1j))
        expected2 = (FermionOperator(((5, 1), )) - FermionOperator(((5, 0), )))
        expected = expected1 * expected2

        self.assertTrue(xy.isclose(retransmed_xy))
        self.assertTrue(
            normal_ordered(transmed_xy).isclose(normal_ordered(expected)))
コード例 #11
0
    def test_yy(self):
        yy = QubitOperator(((2, 'Y'), (3, 'Y')), 2.)
        transmed_yy = reverse_jordan_wigner(yy)
        retransmed_yy = jordan_wigner(transmed_yy)

        expected1 = -(FermionOperator(((2, 1), ), 2.) + FermionOperator(
            ((2, 0), ), 2.))
        expected2 = (FermionOperator(((3, 1), )) - FermionOperator(((3, 0), )))
        expected = expected1 * expected2

        self.assertTrue(yy.isclose(retransmed_yy))
        self.assertTrue(
            normal_ordered(transmed_yy).isclose(normal_ordered(expected)))
コード例 #12
0
    def test_yx(self):
        yx = QubitOperator(((0, 'Y'), (1, 'X')), -0.5)
        transmed_yx = reverse_jordan_wigner(yx)
        retransmed_yx = jordan_wigner(transmed_yx)

        expected1 = 1j * (FermionOperator(((0, 1), )) + FermionOperator(
            ((0, 0), )))
        expected2 = -0.5 * (FermionOperator(((1, 1), )) + FermionOperator(
            ((1, 0), )))
        expected = expected1 * expected2

        self.assertTrue(yx.isclose(retransmed_yx))
        self.assertTrue(
            normal_ordered(transmed_yx).isclose(normal_ordered(expected)))
コード例 #13
0
    def test_xx(self):
        xx = QubitOperator(((3, 'X'), (4, 'X')), 2.)
        transmed_xx = reverse_jordan_wigner(xx)
        retransmed_xx = jordan_wigner(transmed_xx)

        expected1 = (FermionOperator(((3, 1), ), 2.) - FermionOperator(
            ((3, 0), ), 2.))
        expected2 = (FermionOperator(((4, 1), ), 1.) + FermionOperator(
            ((4, 0), ), 1.))
        expected = expected1 * expected2

        self.assertTrue(xx.isclose(retransmed_xx))
        self.assertTrue(
            normal_ordered(transmed_xx).isclose(normal_ordered(expected)))
コード例 #14
0
def convert_qubit_wfn_to_fqe_syntax(ops: 'QubitOperator') -> 'FermionOperator':
    """This takes a qubit wavefunction in the form of a string of qubit
    operators and returns a string of FermionOperators with the proper
    formatting for easy digestion by FQE

    Args:
        ops (QubitOperator) - a string of qubit operators

    Returns:
        out (FermionOperator) - a string of fermion operators
    """
    ferm_str = reverse_jordan_wigner(ops)
    out = FermionOperator()
    for term in ferm_str.terms:
        out += ascending_index_order(term, ferm_str.terms[term])
    return out
コード例 #15
0
 def test_bad_type(self):
     with self.assertRaises(TypeError):
         reverse_jordan_wigner(3)
コード例 #16
0
 def test_yzxz(self):
     yzxz = QubitOperator(((0, 'Y'), (1, 'Z'), (2, 'X'), (3, 'Z')))
     transmed_yzxz = reverse_jordan_wigner(yzxz)
     retransmed_yzxz = jordan_wigner(transmed_yzxz)
     self.assertTrue(yzxz.isclose(retransmed_yzxz))
コード例 #17
0
 def test_term(self):
     transmed_term = reverse_jordan_wigner(self.term)
     retransmed_term = jordan_wigner(transmed_term)
     self.assertTrue(self.term.isclose(retransmed_term))
コード例 #18
0
 def test_reverse_jordan_wigner(self):
     transmed_operator = reverse_jordan_wigner(self.qubit_operator)
     retransmed_operator = jordan_wigner(transmed_operator)
     self.assertTrue(self.qubit_operator.isclose(retransmed_operator))
コード例 #19
0
from openfermion.ops import QubitOperator
from openfermion.transforms import jordan_wigner, reverse_jordan_wigner

# Initialize QubitOperator.
my_operator = QubitOperator('X0 Y1 Z2', 88.)
my_operator += QubitOperator('Z1 Z4', 3.17)
print (my_operator)
# Map QubitOperator to a FermionOperator.
mapped_operator = reverse_jordan_wigner(my_operator)
print (mapped_operator)

# Map the operator back to qubits and make sure it is the same.
back_to_normal = jordan_wigner(mapped_operator)
back_to_normal.compress()
print (back_to_normal)
コード例 #20
0
 def test_reverse_jw_too_few_n_qubits(self):
     with self.assertRaises(ValueError):
         reverse_jordan_wigner(self.operator_a, 0)
コード例 #21
0
    def test_reverse_jw_linearity(self):
        term1 = QubitOperator(((0, 'X'), (1, 'Y')), -0.5)
        term2 = QubitOperator(((0, 'Y'), (1, 'X'), (2, 'Y'), (3, 'Y')), -1j)

        op12 = reverse_jordan_wigner(term1) - reverse_jordan_wigner(term2)
        self.assertTrue(op12.isclose(reverse_jordan_wigner(term1 - term2)))
コード例 #22
0
 def test_y(self):
     pauli_y = QubitOperator(((2, 'Y'), ))
     transmed_y = reverse_jordan_wigner(pauli_y)
     retransmed_y = jordan_wigner(transmed_y)
     self.assertTrue(pauli_y.isclose(retransmed_y))
コード例 #23
0
 def test_x(self):
     pauli_x = QubitOperator(((2, 'X'), ))
     transmed_x = reverse_jordan_wigner(pauli_x)
     retransmed_x = jordan_wigner(transmed_x)
     self.assertTrue(pauli_x.isclose(retransmed_x))
コード例 #24
0
 def test_identity_jwterm(self):
     self.assertTrue(
         FermionOperator(
             ()).isclose(reverse_jordan_wigner(QubitOperator(()))))