示例#1
0
    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])
示例#2
0
    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])
示例#3
0
    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])
示例#4
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])
示例#5
0
    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)
示例#6
0
    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())
示例#7
0
    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])