def test_transform(self):
        code = BinaryCode([[1, 0, 0], [0, 1, 0]], ['W0', 'W1', '1 + W0 + W1'])
        hamiltonian = FermionOperator('0^ 2', 0.5) + FermionOperator('2^ 0',
                                                                     0.5)
        transform = binary_code_transform(hamiltonian, code)
        correct_op = QubitOperator('X0 Z1',0.25) + QubitOperator('X0',0.25)
        self.assertTrue(transform.isclose(correct_op))

        with self.assertRaises(TypeError):
            binary_code_transform('0^ 2', code)
        with self.assertRaises(TypeError):
            binary_code_transform(hamiltonian,
                                  ([[1, 0], [0, 1]], ['w0', 'w1']))
    def test_transform(self):
        code = BinaryCode([[1, 0, 0], [0, 1, 0]], ['W0', 'W1', '1 + W0 + W1'])
        hamiltonian = FermionOperator('0^ 2', 0.5) + FermionOperator(
            '2^ 0', 0.5)
        transform = binary_code_transform(hamiltonian, code)
        self.assertDictEqual(transform.terms, {
            ((0, 'X'), (1, 'Z')): 0.25,
            ((0, 'X'), ): 0.25
        })

        with self.assertRaises(TypeError):
            binary_code_transform('0^ 2', code)
        with self.assertRaises(TypeError):
            binary_code_transform(hamiltonian,
                                  ([[1, 0], [0, 1]], ['w0', 'w1']))
示例#3
0
 def test_jordan_wigner(self):
     hamiltonian, gs_energy = lih_hamiltonian()
     code = jordan_wigner_code(4)
     qubit_hamiltonian = binary_code_transform(hamiltonian, code)
     self.assertAlmostEqual(gs_energy, eigenspectrum(qubit_hamiltonian)[0])
     self.assertDictEqual(qubit_hamiltonian.terms,
                          jordan_wigner(hamiltonian).terms)
 def test_weight_one_binary_addressing_code(self):
     hamiltonian, gs_energy = lih_hamiltonian()
     code = interleaved_code(8) * (
             2 * weight_one_binary_addressing_code(2))
     qubit_hamiltonian = binary_code_transform(hamiltonian, code)
     self.assertAlmostEqual(gs_energy,
                            eigenspectrum(qubit_hamiltonian)[0])
示例#5
0
 def test_bravyi_kitaev(self):
     hamiltonian, gs_energy = lih_hamiltonian()
     code = bravyi_kitaev_code(4)
     qubit_hamiltonian = binary_code_transform(hamiltonian, code)
     self.assertAlmostEqual(gs_energy, eigenspectrum(qubit_hamiltonian)[0])
     qubit_spectrum = eigenspectrum(qubit_hamiltonian)
     fenwick_spectrum = eigenspectrum(bravyi_kitaev(hamiltonian))
     for eigen_idx, eigenvalue in enumerate(qubit_spectrum):
         self.assertAlmostEqual(eigenvalue, fenwick_spectrum[eigen_idx])
示例#6
0
    def test_tranform_function(self):
        ferm_op = FermionOperator('2')
        n_modes = 5
        qubit_op = binary_code_transform(ferm_op, parity_code(n_modes))
        correct_op = QubitOperator(((1, 'Z'), (2, 'X'), (3, 'X'), (4, 'X')),
                                   0.5) + \
                     QubitOperator(((2, 'Y'), (3, 'X'), (4, 'X')), 0.5j)
        self.assertTrue(qubit_op == correct_op)
        ferm_op = FermionOperator('2^')
        n_modes = 5
        qubit_op = binary_code_transform(ferm_op, parity_code(n_modes))
        correct_op = QubitOperator(((1, 'Z'), (2, 'X'), (3, 'X'), (4, 'X')),
                                   0.5) \
                     + QubitOperator(((2, 'Y'), (3, 'X'), (4, 'X')), -0.5j)
        self.assertTrue(qubit_op == correct_op)

        ferm_op = FermionOperator('5^')
        op2 = QubitOperator('Z0 Z1 Z2 Z3 Z4 X5', 0.5) \
              - QubitOperator('Z0 Z1 Z2 Z3 Z4 Y5', 0.5j)
        op1 = binary_code_transform(ferm_op, jordan_wigner_code(6))
        self.assertTrue(op1 == op2)
 def test_dissolve(self):
     code = BinaryCode([[1, 0, 0], [0, 1, 0]], ['W0', 'W1', '1 + W0 W1'])
     hamiltonian = FermionOperator('0^ 2', 0.5) + FermionOperator(
         '2^ 0', 0.5)
     transform = binary_code_transform(hamiltonian, code)
     self.assertDictEqual(
         transform.terms, {
             ((0, 'X'), (1, 'Z')): 0.375,
             ((0, 'X'), ): -0.125,
             ((0, 'Y'), ): 0.125j,
             ((0, 'Y'), (1, 'Z')): 0.125j
         })
     with self.assertRaises(ValueError):
         dissolve(((1, '1'), ))
    def test_dissolve(self):
        code = BinaryCode([[1, 0, 0], [0, 1, 0]], ['W0', 'W1', '1 + W0 W1'])
        hamiltonian = FermionOperator('0^ 2', 0.5) + FermionOperator('2^ 0',
                                                                     0.5)
        transform = binary_code_transform(hamiltonian, code)

        correct_op = QubitOperator('X0 Z1', 0.375) + \
                     QubitOperator('X0', -0.125) + \
                     QubitOperator('Y0', -0.125j) + \
                     QubitOperator('Y0 Z1', -0.125j)
        self.assertTrue(transform.isclose(correct_op))

        with self.assertRaises(ValueError):
            dissolve(((1, '1'),))
示例#9
0
def load_and_transform(filename, orbitals, transform):
    # Load data
    print('--- loading molecule ---')
    molecule = MolecularData(filename=filename)

    print('filename: {}'.format(molecule.filename))
    #print('n_atoms: {}'.format(molecule.n_atoms))
    #print('n_electrons: {}'.format(molecule.n_electrons))
    #print('n_orbitals: {}'.format(molecule.n_orbitals))
    #print('Canonical Orbitals: {}'.format(molecule.canonical_orbitals))
    #print('n_qubits: {}'.format(molecule.n_qubits))

    # get the Hamiltonian for a specific choice of active space
    # set the Hamiltonian parameters
    occupied_orbitals, active_orbitals = orbitals

    molecular_hamiltonian = molecule.get_molecular_hamiltonian(
        occupied_indices=range(occupied_orbitals),
        active_indices=range(active_orbitals))

    # map the operator to fermions and then qubits
    fermion_hamiltonian = get_fermion_operator(molecular_hamiltonian)

    # get interaction operator
    interaction_hamiltonian = get_interaction_operator(fermion_hamiltonian)

    if transform is 'JW':
        qubit_h = jordan_wigner(fermion_hamiltonian)
        qubit_h.compress()
    elif transform is 'BK':
        qubit_h = bravyi_kitaev(fermion_hamiltonian)
        qubit_h.compress()
    elif transform is 'BKSF':
        qubit_h = bravyi_kitaev_fast(interaction_hamiltonian)
        qubit_h.compress()
    elif transform is 'BKT':
        qubit_h = bravyi_kitaev_tree(fermion_hamiltonian)
        qubit_h.compress()
    elif transform is 'PC':
        qubit_h = binary_code_transform(fermion_hamiltonian,
                                        parity_code(2 * active_orbitals))
        qubit_h.compress()
    else:
        print('ERROR: Unrecognized qubit transformation: {}'.format(transform))
        sys.exit(2)

    return qubit_h
示例#10
0
 def test_parity_code(self):
     hamiltonian, gs_energy = lih_hamiltonian()
     code = parity_code(4)
     qubit_hamiltonian = binary_code_transform(hamiltonian, code)
     self.assertAlmostEqual(gs_energy, eigenspectrum(qubit_hamiltonian)[0])
示例#11
0
 def test_weight_two_segment_code(self):
     hamiltonian, gs_energy = lih_hamiltonian()
     code = weight_two_segment_code()
     qubit_hamiltonian = binary_code_transform(hamiltonian, code)
     self.assertAlmostEqual(gs_energy, eigenspectrum(qubit_hamiltonian)[0])
示例#12
0
 def parity_transform(FermionOperator):
     return binary_code_transform(FermionOperator,
                                  parity_code(n_spinorbital))