Exemple #1
0
class TestCommutationAnalysis(QiskitTestCase):
    """Test the Commutation pass."""
    def setUp(self):
        super().setUp()
        self.pass_ = CommutationAnalysis()
        self.pset = self.pass_.property_set = PropertySet()

    def assertCommutationSet(self, result, expected):
        """Compares the result of propertyset["commutation_set"] with a dictionary of the form
        {'q[0]': [ [node_id, ...], [node_id, ...] ]}
        """
        result_to_compare = {}
        for qbit, sets in result.items():
            if not isinstance(qbit, Qubit):
                continue
            result_to_compare[qbit] = []
            for commutation_set in sets:
                result_to_compare[qbit].append(
                    sorted(node._node_id for node in commutation_set))

        for qbit, sets in expected.items():
            for commutation_set in sets:
                commutation_set.sort()

        self.assertDictEqual(result_to_compare, expected)

    def test_commutation_set_property_is_created(self):
        """Test property is created"""
        qr = QuantumRegister(3, "qr")
        circuit = QuantumCircuit(qr)
        circuit.h(qr)
        dag = circuit_to_dag(circuit)

        self.assertIsNone(self.pset["commutation_set"])
        self.pass_.run(dag)
        self.assertIsNotNone(self.pset["commutation_set"])

    def test_all_gates(self):
        """Test all gates on 1 and 2 qubits

        qr0:----[H]---[x]---[y]---[t]---[s]---[rz]---[p]---[u]---[u]---.---.---.--
                                                                       |   |   |
        qr1:----------------------------------------------------------(+)-(Y)--.--
        """
        qr = QuantumRegister(2, "qr")
        circuit = QuantumCircuit(qr)
        circuit.h(qr[0])
        circuit.x(qr[0])
        circuit.y(qr[0])
        circuit.t(qr[0])
        circuit.s(qr[0])
        circuit.rz(0.5, qr[0])
        circuit.p(0.5, qr[0])
        circuit.u(1.57, 0.5, 0.6, qr[0])
        circuit.u(0.5, 0.6, 0.7, qr[0])
        circuit.cx(qr[0], qr[1])
        circuit.cy(qr[0], qr[1])
        circuit.cz(qr[0], qr[1])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [4], [5], [6], [7, 8, 9, 10], [11], [12], [13], [14],
                    [15], [1]],
            qr[1]: [[2], [13], [14], [15], [3]],
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)

    def test_non_commutative_circuit(self):
        """A simple circuit where no gates commute

        qr0:---[H]---

        qr1:---[H]---

        qr2:---[H]---
        """
        qr = QuantumRegister(3, "qr")
        circuit = QuantumCircuit(qr)
        circuit.h(qr)
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [6], [1]],
            qr[1]: [[2], [7], [3]],
            qr[2]: [[4], [8], [5]]
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)

    def test_non_commutative_circuit_2(self):
        """A simple circuit where no gates commute

        qr0:----.-------------
                |
        qr1:---(+)------.-----
                        |
        qr2:---[H]-----(+)----
        """
        qr = QuantumRegister(3, "qr")
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.h(qr[2])
        circuit.cx(qr[1], qr[2])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [6], [1]],
            qr[1]: [[2], [6], [8], [3]],
            qr[2]: [[4], [7], [8], [5]],
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)

    def test_commutative_circuit(self):
        """A simple circuit where two CNOTs commute

        qr0:----.------------
                |
        qr1:---(+)-----(+)---
                        |
        qr2:---[H]------.----
        """

        qr = QuantumRegister(3, "qr")
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.h(qr[2])
        circuit.cx(qr[2], qr[1])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [6], [1]],
            qr[1]: [[2], [6, 8], [3]],
            qr[2]: [[4], [7], [8], [5]]
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)

    def test_commutative_circuit_2(self):
        """A simple circuit where a CNOT and a Z gate commute,
        and a CNOT and a CNOT commute

        qr0:----.-----[Z]-----
                |
        qr1:---(+)----(+)----
                       |
        qr2:---[H]-----.----
        """

        qr = QuantumRegister(3, "qr")
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.z(qr[0])
        circuit.h(qr[2])
        circuit.cx(qr[2], qr[1])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [6, 7], [1]],
            qr[1]: [[2], [6, 9], [3]],
            qr[2]: [[4], [8], [9], [5]],
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)

    def test_commutative_circuit_3(self):
        """A simple circuit where multiple gates commute

        qr0:----.-----[Z]-----.----[z]-----
                |             |
        qr1:---(+)----(+)----(+)----.------
                       |            |
        qr2:---[H]-----.-----[x]---(+)-----
        """
        qr = QuantumRegister(3, "qr")
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.h(qr[2])
        circuit.z(qr[0])
        circuit.cx(qr[2], qr[1])
        circuit.cx(qr[0], qr[1])
        circuit.x(qr[2])
        circuit.z(qr[0])
        circuit.cx(qr[1], qr[2])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [6, 8, 10, 12], [1]],
            qr[1]: [[2], [6, 9, 10], [13], [3]],
            qr[2]: [[4], [7], [9], [11, 13], [5]],
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)

    def test_jordan_wigner_type_circuit(self):
        """A Jordan-Wigner type circuit where consecutive CNOTs commute

        qr0:----.-------------------------------------------------------------.----
                |                                                             |
        qr1:---(+)----.-------------------------------------------------.----(+)---
                      |                                                 |
        qr2:---------(+)----.-------------------------------------.----(+)---------
                            |                                     |
        qr3:---------------(+)----.-------------------------.----(+)---------------
                                  |                         |
        qr4:---------------------(+)----.-------------.----(+)---------------------
                                        |             |
        qr5:---------------------------(+)----[z]----(+)---------------------------
        """
        qr = QuantumRegister(6, "qr")
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.cx(qr[1], qr[2])
        circuit.cx(qr[2], qr[3])
        circuit.cx(qr[3], qr[4])
        circuit.cx(qr[4], qr[5])
        circuit.z(qr[5])
        circuit.cx(qr[4], qr[5])
        circuit.cx(qr[3], qr[4])
        circuit.cx(qr[2], qr[3])
        circuit.cx(qr[1], qr[2])
        circuit.cx(qr[0], qr[1])

        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [12, 22], [1]],
            qr[1]: [[2], [12], [13, 21], [22], [3]],
            qr[2]: [[4], [13], [14, 20], [21], [5]],
            qr[3]: [[6], [14], [15, 19], [20], [7]],
            qr[4]: [[8], [15], [16, 18], [19], [9]],
            qr[5]: [[10], [16], [17], [18], [11]],
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)

    def test_all_commute_circuit(self):
        """Test circuit with that all commute"""
        qr = QuantumRegister(5, "qr")
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.cx(qr[2], qr[1])
        circuit.cx(qr[4], qr[3])
        circuit.cx(qr[2], qr[3])
        circuit.z(qr[0])
        circuit.z(qr[4])
        circuit.cx(qr[0], qr[1])
        circuit.cx(qr[2], qr[1])
        circuit.cx(qr[4], qr[3])
        circuit.cx(qr[2], qr[3])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)

        expected = {
            qr[0]: [[0], [10, 14, 16], [1]],
            qr[1]: [[2], [10, 11, 16, 17], [3]],
            qr[2]: [[4], [11, 13, 17, 19], [5]],
            qr[3]: [[6], [12, 13, 18, 19], [7]],
            qr[4]: [[8], [12, 15, 18], [9]],
        }
        self.assertCommutationSet(self.pset["commutation_set"], expected)
Exemple #2
0
class TestCommutationAnalysis(QiskitTestCase):
    """Test the Communttion pass."""
    def setUp(self):

        self.pass_ = CommutationAnalysis()
        self.pset = self.pass_.property_set = PropertySet()

    def test_commutation_set_property_is_created(self):
        """Test property is created"""
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.h(qr)
        dag = circuit_to_dag(circuit)

        self.assertIsNone(self.pset['commutation_set'])
        self.pass_.run(dag)
        self.assertIsNotNone(self.pset['commutation_set'])

    def test_all_gates(self):
        """Test all gates on 1 and 2 qubits

        qr0:----[H]---[x]---[y]---[t]---[s]---[rz]---[u1]---[u2]---[u3]---.---.---.--
                                                                          |   |   |
        qr1:-------------------------------------------------------------(+)-(Y)--.--
        """
        qr = QuantumRegister(2, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.h(qr[0])
        circuit.x(qr[0])
        circuit.y(qr[0])
        circuit.t(qr[0])
        circuit.s(qr[0])
        circuit.rz(0.5, qr[0])
        circuit.u1(0.5, qr[0])
        circuit.u2(0.5, 0.6, qr[0])
        circuit.u3(0.5, 0.6, 0.7, qr[0])
        circuit.cx(qr[0], qr[1])
        circuit.cy(qr[0], qr[1])
        circuit.cz(qr[0], qr[1])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [5], [6], [7], [8, 9, 10, 11], [12], [13], [14],
                          [15], [16], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [14], [15], [16], [4]])

    def test_non_commutative_circuit(self):
        """A simple circuit where no gates commute

        qr0:---[H]---

        qr1:---[H]---

        qr2:---[H]---
        """
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.h(qr)
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [7], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [8], [4]])
        self.assertEqual(self.pset["commutation_set"]["qr[2]"],
                         [[5], [9], [6]])

    def test_non_commutative_circuit_2(self):
        """A simple circuit where no gates commute

        qr0:----.-------------
                |
        qr1:---(+)------.-----
                        |
        qr2:---[H]-----(+)----
        """
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.h(qr[2])
        circuit.cx(qr[1], qr[2])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [7], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [7], [9], [4]])
        self.assertEqual(self.pset["commutation_set"]["qr[2]"],
                         [[5], [8], [9], [6]])

    def test_commutative_circuit(self):
        """A simple circuit where two CNOTs commute

        qr0:----.------------
                |
        qr1:---(+)-----(+)---
                        |
        qr2:---[H]------.----
        """

        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.h(qr[2])
        circuit.cx(qr[2], qr[1])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [7], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [7, 9], [4]])
        self.assertEqual(self.pset["commutation_set"]["qr[2]"],
                         [[5], [8], [9], [6]])

    def test_commutative_circuit_2(self):
        """A simple circuit where a CNOT and a Z gate commute,
        and a CNOT and a CNOT commute

        qr0:----.-----[Z]-----
                |
        qr1:---(+)----(+)----
                       |
        qr2:---[H]-----.----
        """

        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.z(qr[0])
        circuit.h(qr[2])
        circuit.cx(qr[2], qr[1])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [7, 8], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [7, 10], [4]])
        self.assertEqual(self.pset["commutation_set"]["qr[2]"],
                         [[5], [9], [10], [6]])

    def test_commutative_circuit_3(self):
        """A simple circuit where multiple gates commute

        qr0:----.-----[Z]-----.----[z]-----
                |             |
        qr1:---(+)----(+)----(+)----.------
                       |            |
        qr2:---[H]-----.-----[x]---(+)-----
        """
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.h(qr[2])
        circuit.z(qr[0])
        circuit.cx(qr[2], qr[1])
        circuit.cx(qr[0], qr[1])
        circuit.x(qr[2])
        circuit.z(qr[0])
        circuit.cx(qr[1], qr[2])

        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [7, 9, 11, 13], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [7, 10, 11], [14], [4]])
        self.assertEqual(self.pset["commutation_set"]["qr[2]"],
                         [[5], [8], [10], [12, 14], [6]])

    def test_jordan_wigner_type_circuit(self):
        """A Jordan-Wigner type circuit where consecutive CNOTs commute

        qr0:----.-------------------------------------------------------------.----
                |                                                             |
        qr1:---(+)----.-------------------------------------------------.----(+)---
                      |                                                 |
        qr2:---------(+)----.-------------------------------------.----(+)---------
                            |                                     |
        qr3:---------------(+)----.-------------------------.----(+)---------------
                                  |                         |
        qr4:---------------------(+)----.-------------.----(+)---------------------
                                        |             |
        qr5:---------------------------(+)----[z]----(+)---------------------------
        """
        qr = QuantumRegister(6, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.cx(qr[1], qr[2])
        circuit.cx(qr[2], qr[3])
        circuit.cx(qr[3], qr[4])
        circuit.cx(qr[4], qr[5])
        circuit.z(qr[5])
        circuit.cx(qr[4], qr[5])
        circuit.cx(qr[3], qr[4])
        circuit.cx(qr[2], qr[3])
        circuit.cx(qr[1], qr[2])
        circuit.cx(qr[0], qr[1])

        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [13, 23], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [13], [14, 22], [23], [4]])
        self.assertEqual(self.pset["commutation_set"]["qr[2]"],
                         [[5], [14], [15, 21], [22], [6]])
        self.assertEqual(self.pset["commutation_set"]["qr[3]"],
                         [[7], [15], [16, 20], [21], [8]])
        self.assertEqual(self.pset["commutation_set"]["qr[4]"],
                         [[9], [16], [17, 19], [20], [10]])
        self.assertEqual(self.pset["commutation_set"]["qr[5]"],
                         [[11], [17], [18], [19], [12]])

    def test_all_commute_circuit(self):
        """Test circuit with that all commute"""
        qr = QuantumRegister(5, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.cx(qr[0], qr[1])
        circuit.cx(qr[2], qr[1])
        circuit.cx(qr[4], qr[3])
        circuit.cx(qr[2], qr[3])
        circuit.z(qr[0])
        circuit.z(qr[4])
        circuit.cx(qr[0], qr[1])
        circuit.cx(qr[2], qr[1])
        circuit.cx(qr[4], qr[3])
        circuit.cx(qr[2], qr[3])
        dag = circuit_to_dag(circuit)

        self.pass_.run(dag)
        self.assertEqual(self.pset["commutation_set"]["qr[0]"],
                         [[1], [11, 15, 17], [2]])
        self.assertEqual(self.pset["commutation_set"]["qr[1]"],
                         [[3], [11, 12, 17, 18], [4]])
        self.assertEqual(self.pset["commutation_set"]["qr[2]"],
                         [[5], [12, 14, 18, 20], [6]])
        self.assertEqual(self.pset["commutation_set"]["qr[3]"],
                         [[7], [13, 14, 19, 20], [8]])
        self.assertEqual(self.pset["commutation_set"]["qr[4]"],
                         [[9], [13, 16, 19], [10]])