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']))
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])
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])
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'),))
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
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])
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])
def parity_transform(FermionOperator): return binary_code_transform(FermionOperator, parity_code(n_spinorbital))