Exemplo n.º 1
0
 def test_q_squared(self):
     b = self.hbar * (BosonOperator('0^ 0^') + BosonOperator('0 0') +
                      BosonOperator('') + 2 * BosonOperator('0^ 0')) / 2
     q = normal_ordered(get_quad_operator(b, hbar=self.hbar),
                        hbar=self.hbar)
     expected = QuadOperator('q0 q0')
     self.assertTrue(q == expected)
Exemplo n.º 2
0
def get_boson_operator(operator, hbar=1.):
    """Convert to BosonOperator.

    Args:
        operator: QuadOperator.
        hbar (float): the value of hbar used in the definition
            of the commutator [q_i, p_j] = i hbar delta_ij.
            By default hbar=1.

    Returns:
        boson_operator: An instance of the BosonOperator class.
    """
    boson_operator = BosonOperator()

    if isinstance(operator, QuadOperator):
        for term, coefficient in operator.terms.items():
            tmp = BosonOperator('', coefficient)
            for i, d in term:
                if d == 'q':
                    coeff = numpy.sqrt(hbar / 2)
                    sign = 1
                elif d == 'p':
                    coeff = -1j * numpy.sqrt(hbar / 2)
                    sign = -1

                tmp *= coeff * (BosonOperator(((i, 0))) + BosonOperator(
                    ((i, 1)), sign))
            boson_operator += tmp

    else:
        raise TypeError("Only QuadOperator is currently "
                        "supported for get_boson_operator.")

    return boson_operator
Exemplo n.º 3
0
 def test_p_squared(self):
     b = self.hbar * (-BosonOperator('1^ 1^') - BosonOperator('1 1') +
                      BosonOperator('') + 2 * BosonOperator('1^ 1')) / 2
     q = normal_ordered(get_quad_operator(b, hbar=self.hbar),
                        hbar=self.hbar)
     expected = QuadOperator('p1 p1')
     self.assertTrue(q == expected)
Exemplo n.º 4
0
 def test_two_mode(self):
     q = QuadOperator('p2 q0')
     b = get_boson_operator(q, hbar=self.hbar)
     expected = -1j*self.hbar/2 \
         * (BosonOperator('0') + BosonOperator('0^')) \
         * (BosonOperator('2') - BosonOperator('2^'))
     self.assertTrue(b == expected)
Exemplo n.º 5
0
def load_operator(file_name=None, data_directory=None, plain_text=False):
    """Load FermionOperator or QubitOperator from file.

    Args:
        file_name: The name of the saved file.
        data_directory: Optional data directory to change from default data
                        directory specified in config file.
        plain_text: Whether the input file is plain text

    Returns:
        operator: The stored FermionOperator, BosonOperator,
            QuadOperator, or QubitOperator

    Raises:
        TypeError: Operator of invalid type.
    """
    file_path = get_file_path(file_name, data_directory)

    if plain_text:
        with open(file_path, 'r') as f:
            data = f.read()
            operator_type, operator_terms = data.split(":\n")

        if operator_type == 'FermionOperator':
            operator = FermionOperator(operator_terms)
        elif operator_type == 'BosonOperator':
            operator = BosonOperator(operator_terms)
        elif operator_type == 'QubitOperator':
            operator = QubitOperator(operator_terms)
        elif operator_type == 'QuadOperator':
            operator = QuadOperator(operator_terms)
        else:
            raise TypeError('Operator of invalid type.')
    else:
        with open(file_path, 'rb') as f:
            data = marshal.load(f)
            operator_type = data[0]
            operator_terms = data[1]

        if operator_type == 'FermionOperator':
            operator = FermionOperator()
            for term in operator_terms:
                operator += FermionOperator(term, operator_terms[term])
        elif operator_type == 'BosonOperator':
            operator = BosonOperator()
            for term in operator_terms:
                operator += BosonOperator(term, operator_terms[term])
        elif operator_type == 'QubitOperator':
            operator = QubitOperator()
            for term in operator_terms:
                operator += QubitOperator(term, operator_terms[term])
        elif operator_type == 'QuadOperator':
            operator = QuadOperator()
            for term in operator_terms:
                operator += QuadOperator(term, operator_terms[term])
        else:
            raise TypeError('Operator of invalid type.')

    return operator
Exemplo n.º 6
0
    def test_hermitian_conjugated_complex_const(self):
        op = FermionOperator('2^ 2', 3j)
        op_hc = FermionOperator('2^ 2', -3j)
        self.assertEqual(op_hc, hermitian_conjugated(op))

        op = BosonOperator('2^ 2', 3j)
        op_hc = BosonOperator('2^ 2', -3j)
        self.assertEqual(op_hc, hermitian_conjugated(op))
Exemplo n.º 7
0
    def test_commutes_number_operators(self):
        com = commutator(FermionOperator('4^ 3^ 4 3'), FermionOperator('2^ 2'))
        com = normal_ordered(com)
        self.assertEqual(com, FermionOperator.zero())

        com = commutator(BosonOperator('4^ 3^ 4 3'), BosonOperator('2^ 2'))
        com = normal_ordered(com)
        self.assertTrue(com == BosonOperator.zero())
    def test_boson_triple(self):
        op_132 = BosonOperator(((1, 1), (3, 0), (2, 0)))
        op_123 = BosonOperator(((1, 1), (2, 0), (3, 0)))
        op_321 = BosonOperator(((3, 0), (2, 0), (1, 1)))

        self.assertTrue(op_132 == normal_ordered(op_123))
        self.assertTrue(op_132 == normal_ordered(op_132))
        self.assertTrue(op_132 == normal_ordered(op_321))
Exemplo n.º 9
0
    def test_hermitian_conjugated_multiterm(self):
        op = FermionOperator('1^ 2') + FermionOperator('2 3 4')
        op_hc = FermionOperator('2^ 1') + FermionOperator('4^ 3^ 2^')
        self.assertEqual(op_hc, hermitian_conjugated(op))

        op = BosonOperator('1^ 2') + BosonOperator('2 3 4')
        op_hc = BosonOperator('2^ 1') + BosonOperator('4^ 3^ 2^')
        self.assertEqual(op_hc, hermitian_conjugated(op))
Exemplo n.º 10
0
    def test_commutator_hopping_operators(self):
        com = commutator(3 * FermionOperator('1^ 2'), FermionOperator('2^ 3'))
        com = normal_ordered(com)
        self.assertEqual(com, FermionOperator('1^ 3', 3))

        com = commutator(3 * BosonOperator('1^ 2'), BosonOperator('2^ 3'))
        com = normal_ordered(com)
        self.assertTrue(com == BosonOperator('1^ 3', 3))
Exemplo n.º 11
0
    def test_hermitian_conjugate_empty(self):
        op = FermionOperator()
        op = hermitian_conjugated(op)
        self.assertEqual(op, FermionOperator())

        op = BosonOperator()
        op = hermitian_conjugated(op)
        self.assertEqual(op, BosonOperator())
Exemplo n.º 12
0
    def test_hermitian_conjugated_simple(self):
        op = FermionOperator('0')
        op_hc = FermionOperator('0^')
        self.assertEqual(op_hc, hermitian_conjugated(op))

        op = BosonOperator('0')
        op_hc = BosonOperator('0^')
        self.assertEqual(op_hc, hermitian_conjugated(op))
Exemplo n.º 13
0
 def test_two_term(self):
     b = BosonOperator('0^ 0') + BosonOperator('0 0^')
     q = get_quad_operator(b, hbar=self.hbar)
     expected = (QuadOperator('q0') - 1j*QuadOperator('p0')) \
         * (QuadOperator('q0') + 1j*QuadOperator('p0')) \
         + (QuadOperator('q0') + 1j*QuadOperator('p0')) \
         * (QuadOperator('q0') - 1j*QuadOperator('p0'))
     expected /= 2 * self.hbar
     self.assertTrue(q == expected)
Exemplo n.º 14
0
    def test_commutes_identity(self):
        com = commutator(FermionOperator.identity(),
                         FermionOperator('2^ 3', 2.3))
        self.assertEqual(com, FermionOperator.zero())

        com = commutator(BosonOperator.identity(), BosonOperator('2^ 3', 2.3))
        self.assertTrue(com == BosonOperator.zero())

        com = commutator(QuadOperator.identity(), QuadOperator('q2 p3', 2.3))
        self.assertTrue(com == QuadOperator.zero())
Exemplo n.º 15
0
    def test_hermitian_conjugate_complex_const(self):
        op = FermionOperator('1^ 3', 3j)
        op_hc = -3j * FermionOperator('3^ 1')
        op = hermitian_conjugated(op)
        self.assertEqual(op, op_hc)

        op = BosonOperator('1^ 3', 3j)
        op_hc = -3j * BosonOperator('3^ 1')
        op = hermitian_conjugated(op)
        self.assertEqual(op, op_hc)
Exemplo n.º 16
0
    def test_hermitian_conjugate_notordered(self):
        op = FermionOperator('1 3^ 3 3^', 3j)
        op_hc = -3j * FermionOperator('3 3^ 3 1^')
        op = hermitian_conjugated(op)
        self.assertEqual(op, op_hc)

        op = BosonOperator('1 3^ 3 3^', 3j)
        op_hc = -3j * BosonOperator('3 3^ 3 1^')
        op = hermitian_conjugated(op)
        self.assertEqual(op, op_hc)
Exemplo n.º 17
0
    def test_hermitian_conjugate_simple(self):
        op = FermionOperator('1^')
        op_hc = FermionOperator('1')
        op = hermitian_conjugated(op)
        self.assertEqual(op, op_hc)

        op = BosonOperator('1^')
        op_hc = BosonOperator('1')
        op = hermitian_conjugated(op)
        self.assertEqual(op, op_hc)
Exemplo n.º 18
0
    def test_commutes_no_intersection(self):
        com = commutator(FermionOperator('2^ 3'), FermionOperator('4^ 5^ 3'))
        com = normal_ordered(com)
        self.assertEqual(com, FermionOperator.zero())

        com = commutator(BosonOperator('2^ 3'), BosonOperator('4^ 5^ 3'))
        com = normal_ordered(com)
        self.assertTrue(com == BosonOperator.zero())

        com = commutator(QuadOperator('q2 p3'), QuadOperator('q4 q5 p3'))
        com = normal_ordered(com)
        self.assertTrue(com == QuadOperator.zero())
    def test_number_operator_nosite(self):
        op = number_operator(4, parity=-1)
        expected = (FermionOperator(((0, 1), (0, 0))) + FermionOperator(
            ((1, 1), (1, 0))) + FermionOperator(
                ((2, 1), (2, 0))) + FermionOperator(((3, 1), (3, 0))))
        self.assertEqual(op, expected)

        op = number_operator(4, parity=1)
        expected = (BosonOperator(((0, 1), (0, 0))) + BosonOperator(
            ((1, 1), (1, 0))) + BosonOperator(((2, 1), (2, 0))) + BosonOperator(
                ((3, 1), (3, 0))))
        self.assertTrue(op == expected)
Exemplo n.º 20
0
 def test_two_mode(self):
     b = BosonOperator('0^ 2')
     q = get_quad_operator(b, hbar=self.hbar)
     expected = QuadOperator('q0') - 1j * QuadOperator('p0')
     expected *= (QuadOperator('q2') + 1j * QuadOperator('p2'))
     expected /= 2 * self.hbar
     self.assertTrue(q == expected)
Exemplo n.º 21
0
 def test_two_term(self):
     q = QuadOperator('p0 q0') + QuadOperator('q0 p0')
     b = get_boson_operator(q, hbar=self.hbar)
     expected = -1j*self.hbar/2 \
         * ((BosonOperator('0') + BosonOperator('0^'))
            * (BosonOperator('0') - BosonOperator('0^'))
            + (BosonOperator('0') - BosonOperator('0^'))
            * (BosonOperator('0') + BosonOperator('0^')))
     self.assertTrue(b == expected)
Exemplo n.º 22
0
    def test_symmetric_one_term_multimode(self):
        op = BosonOperator('0^ 1^ 2 3')
        res = symmetric_ordering(op)
        self.assertTrue(res == op)

        op = QuadOperator('q0 q1 p2 p3')
        res = symmetric_ordering(op)
        self.assertTrue(res == op)
Exemplo n.º 23
0
    def test_symmetric_two_term_same(self):
        op = BosonOperator('0^ 0^')
        res = symmetric_ordering(op)
        self.assertTrue(res == op)

        op = QuadOperator('q0 q0')
        res = symmetric_ordering(op)
        self.assertTrue(res == op)
Exemplo n.º 24
0
 def test_reorder_boson(self):
     shift_by_one = lambda x, y: (x + 1) % y
     operator = BosonOperator('1^ 2^ 3 4', -3.17)
     reordered = reorder(operator, shift_by_one)
     self.assertEqual(reordered.terms,
                      {((0, 0), (2, 1), (3, 1), (4, 0)): -3.17})
     reordered = reorder(operator, shift_by_one, reverse=True)
     self.assertEqual(reordered.terms,
                      {((0, 1), (1, 1), (2, 0), (3, 0)): -3.17})
Exemplo n.º 25
0
    def test_hermitian_conjugated_semihermitian(self):
        op = (FermionOperator() + 2j * FermionOperator('1^ 3') +
              FermionOperator('3^ 1') * -2j + FermionOperator('2^ 2', 0.1j))
        op_hc = (FermionOperator() + FermionOperator('1^ 3', 2j) +
                 FermionOperator('3^ 1', -2j) + FermionOperator('2^ 2', -0.1j))
        self.assertEqual(op_hc, hermitian_conjugated(op))

        op = (BosonOperator() + 2j * BosonOperator('1^ 3') +
              BosonOperator('3^ 1') * -2j + BosonOperator('2^ 2', 0.1j))
        op_hc = (BosonOperator() + BosonOperator('1^ 3', 2j) +
                 BosonOperator('3^ 1', -2j) + BosonOperator('2^ 2', -0.1j))
        self.assertEqual(op_hc, hermitian_conjugated(op))
Exemplo n.º 26
0
 def setUp(self):
     self.fermion_term = FermionOperator('1^ 2^ 3 4', -3.17)
     self.fermion_operator = self.fermion_term + hermitian_conjugated(
         self.fermion_term)
     self.boson_term = BosonOperator('1^ 2^ 3 4', -3.17)
     self.boson_operator = self.boson_term + hermitian_conjugated(
         self.boson_term)
     self.quad_term = QuadOperator('q0 p0 q1 p0 p0', -3.17)
     self.quad_operator = self.quad_term + hermitian_conjugated(
         self.quad_term)
     self.qubit_operator = jordan_wigner(self.fermion_operator)
Exemplo n.º 27
0
    def test_eigenspectrum(self):
        fermion_eigenspectrum = eigenspectrum(self.fermion_operator)
        qubit_eigenspectrum = eigenspectrum(self.qubit_operator)
        interaction_eigenspectrum = eigenspectrum(self.interaction_operator)
        for i in range(2**self.n_qubits):
            self.assertAlmostEqual(fermion_eigenspectrum[i],
                                   qubit_eigenspectrum[i])
            self.assertAlmostEqual(fermion_eigenspectrum[i],
                                   interaction_eigenspectrum[i])

        with self.assertRaises(TypeError):
            _ = eigenspectrum(BosonOperator())

        with self.assertRaises(TypeError):
            _ = eigenspectrum(QuadOperator())
Exemplo n.º 28
0
    def setUp(self):
        self.n_qubits = 5
        self.fermion_term = FermionOperator('1^ 2^ 3 4', -3.17)
        self.fermion_operator = self.fermion_term + hermitian_conjugated(
            self.fermion_term)
        self.boson_term = BosonOperator('1^ 2^ 3 4', -3.17)
        self.boson_operator = self.boson_term + hermitian_conjugated(
            self.boson_term)
        self.quad_term = QuadOperator('q0 p0 q1 p0 p0', -3.17)
        self.quad_operator = self.quad_term + hermitian_conjugated(
            self.quad_term)
        self.qubit_operator = jordan_wigner(self.fermion_operator)
        self.file_name = "test_file"

        self.bad_operator_filename = 'bad_file.data'
        bad_op = "A:\nB"
        with open(os.path.join(DATA_DIRECTORY, self.bad_operator_filename),
                  'w') as fid:
            fid.write(bad_op)
Exemplo n.º 29
0
    def test_canonical_boson_commutation_relations(self):
        op_1 = BosonOperator('3')
        op_1_dag = BosonOperator('3^')
        op_2 = BosonOperator('4')
        op_2_dag = BosonOperator('4^')
        zero = BosonOperator()
        one = BosonOperator('')

        self.assertTrue(one == normal_ordered(commutator(op_1, op_1_dag)))
        self.assertTrue(zero == normal_ordered(commutator(op_1, op_2)))
        self.assertTrue(zero == normal_ordered(commutator(op_1, op_2_dag)))
        self.assertTrue(zero == normal_ordered(commutator(op_1_dag, op_2)))
        self.assertTrue(zero == normal_ordered(commutator(op_1_dag, op_2_dag)))
        self.assertTrue(one == normal_ordered(commutator(op_2, op_2_dag)))
Exemplo n.º 30
0
    def test_symmetric_non_hermitian(self):
        op = BosonOperator('0^ 0')
        res = symmetric_ordering(op)
        expected = BosonOperator('0^ 0', 0.5) \
            + BosonOperator('0 0^', 0.5)
        self.assertTrue(res == expected)
        self.assertTrue(is_hermitian(res))

        op = BosonOperator('0^ 0', 0.5)
        res = symmetric_ordering(op, ignore_coeff=False)
        expected = BosonOperator('0^ 0', 0.25) \
            + BosonOperator('0 0^', 0.25)
        self.assertTrue(res == expected)
        self.assertTrue(is_hermitian(res))

        op = QuadOperator('q0 p0')
        res = symmetric_ordering(op)
        expected = QuadOperator('q0 p0', 0.5) \
            + QuadOperator('p0 q0', 0.5)
        self.assertTrue(res == expected)
        self.assertTrue(is_hermitian(res))