def test_outcome_probabilities(self): for _ in range(100): qc = QC(4, 0, probabilistic=True) qc.create_bell_pair(0, 1) outcome = qc.measure([1, 0]) self.assertEqual(outcome[0], outcome[1])
def test_outcome_probabilities_CZ(self): for _ in range(100): qc = QC(4, 0, probabilistic=True) qc.create_bell_pair(0, 1) qc.CZ(1, 0) outcome = qc.measure([1, 0]) self.assertFalse(outcome[0] == outcome[1])
def test_bell_pair_fusion(self): qc = QC(5, 0) qc.create_bell_pair(0, 1) density_matrix_0, qubits_0 = qc._qubit_density_matrix_lookup[0] density_matrix_1, qubits_1 = qc._qubit_density_matrix_lookup[1] self.assertTrue(density_matrix_0 is density_matrix_1) self.assertTrue(qubits_0 is qubits_1) # Second qubit of 'create_bell_pair' should be the first qubit in the density matrix self.assertEqual(qubits_0, [1, 0])
def test_outcome_probabilities_single_selection(self): for _ in range(100): qc = QC(4, 0, probabilistic=True) qc.create_bell_pair(3, 1) qc.create_bell_pair(2, 0) qc.CZ(0, 1) qc.CZ(2, 3) outcome = qc.measure([0, 2]) self.assertEqual(outcome[0], outcome[1])
def test_outcome_probabilities_single_dot(self): for _ in range(100): qc = QC(6, 0, probabilistic=True) qc.create_bell_pair(5, 2) qc.create_bell_pair(4, 1) qc.single_selection(CNOT_gate, 3, 0) qc.single_selection(CZ_gate, 3, 0) qc.CZ(4, 5) qc.CZ(1, 2) outcomes = qc.measure([1, 4]) self.assertEqual(outcomes[0], outcomes[1]) bell_matrix = 1 / 2 * np.array([[1, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0], [1, 0, 0, 1]]) np.testing.assert_array_equal( qc._qubit_density_matrix_lookup[5][0].toarray(), bell_matrix)
def test_apply_SWAP_efficient_swap(self): qc = QC(3, 0, noise=True, pg=0.1, pn=0.1) qc.create_bell_pair(1, 2) qc._uninitialised_qubits.append(0) # SWAP is equal to three CNOT operations qc.CNOT(1, 0) qc.CNOT(0, 1) qc.CNOT(1, 0) # Qubit 1 is now uninitialised due to swapping. Measure it such that it disappears from the density matrix qc.measure(1) qc2 = QC(3, 0, noise=True, pg=0.1, pn=0.1) qc2.create_bell_pair(1, 2) qc2._uninitialised_qubits.append(0) qc2.SWAP(1, 0, efficient=True) # Measurement of qubit 1 is not necessary, since the density matrices are not fused with the efficient SWAP np.testing.assert_array_almost_equal( qc.get_combined_density_matrix([0])[0].toarray(), qc2.get_combined_density_matrix([0])[0].toarray())
def test_SWAP_bell_pair(self): qc = QC(5, 0) qc.create_bell_pair(0, 1) qc.SWAP(0, 2) qc.SWAP(1, 3) density_matrix_0, qubits_0 = qc._qubit_density_matrix_lookup[0] density_matrix_1, qubits_1 = qc._qubit_density_matrix_lookup[1] density_matrix_2, qubits_2 = qc._qubit_density_matrix_lookup[2] density_matrix_3, qubits_3 = qc._qubit_density_matrix_lookup[3] self.assertTrue(density_matrix_2 is density_matrix_3) self.assertTrue(density_matrix_2.shape == (4, 4)) self.assertTrue(qubits_2 is qubits_3) np.testing.assert_array_equal(density_matrix_0.toarray(), np.array([[1, 0], [0, 0]])) np.testing.assert_array_equal(density_matrix_1.toarray(), np.array([[1, 0], [0, 0]])) self.assertTrue(qubits_0 is not qubits_1) self.assertEqual(qubits_0, [0]) self.assertEqual(qubits_1, [1]) self.assertEqual(qubits_3, [3, 2])