def test_raises(self):
        """test instruction which can't be converted raises"""
        circ1 = QuantumCircuit(3)
        circ1.x(0)
        circ1.cx(0, 1)
        circ1.barrier()
        inst1 = circuit_to_instruction(circ1)

        circ2 = QuantumCircuit(1, 1)
        circ2.measure(0, 0)
        inst2 = circuit_to_instruction(circ2)

        with self.assertRaises(QiskitError):
            instruction_to_gate(inst1)
            instruction_to_gate(inst2)
    def test_simple_instruction(self):
        """test simple instruction"""
        qr1 = QuantumRegister(4, 'qr1')
        qr2 = QuantumRegister(3, 'qr2')
        qr3 = QuantumRegister(3, 'qr3')
        circ = QuantumCircuit(qr1, qr2, qr3)
        circ.cx(qr1[1], qr2[2])

        inst = circuit_to_instruction(circ)
        gate = instruction_to_gate(inst)
        q = QuantumRegister(10, 'q')

        self.assertIsInstance(gate, Gate)
        self.assertEqual(gate.definition[0][1], [q[1], q[6]])
    def test_registerless_classical_bits(self):
        """Test that conditions on registerless classical bits can be handled during the conversion.

        Regression test of gh-7394."""
        expected = QuantumCircuit([Qubit(), Clbit()])
        expected.h(0).c_if(expected.clbits[0], 0)
        test = circuit_to_instruction(expected)

        self.assertIsInstance(test, Instruction)
        self.assertIsInstance(test.definition, QuantumCircuit)

        self.assertEqual(len(test.definition.data), 1)
        test_instruction, _, _ = test.definition.data[0]
        expected_instruction, _, _ = expected.data[0]
        self.assertIs(type(test_instruction), type(expected_instruction))
        self.assertEqual(test_instruction.condition, (test.definition.clbits[0], 0))
    def test_flatten_circuit_registers(self):
        """Check correct flattening"""
        qr1 = QuantumRegister(4, 'qr1')
        qr2 = QuantumRegister(3, 'qr2')
        qr3 = QuantumRegister(3, 'qr3')
        cr1 = ClassicalRegister(4, 'cr1')
        cr2 = ClassicalRegister(1, 'cr2')
        circ = QuantumCircuit(qr1, qr2, qr3, cr1, cr2)
        circ.cx(qr1[1], qr2[2])
        circ.measure(qr3[0], cr2[0])

        inst = circuit_to_instruction(circ)
        q = QuantumRegister(10, 'q')
        c = ClassicalRegister(5, 'c')

        self.assertEqual(inst.definition[0][1], [q[1], q[6]])
        self.assertEqual(inst.definition[1][1], [q[7]])
        self.assertEqual(inst.definition[1][2], [c[4]])
    def test_flatten_parameters(self):
        """Verify parameters from circuit are moved to instruction.params"""
        qr = QuantumRegister(3, 'qr')
        qc = QuantumCircuit(qr)

        theta = Parameter('theta')
        phi = Parameter('phi')

        qc.rz(theta, qr[0])
        qc.rz(phi, qr[1])
        qc.u2(theta, phi, qr[2])

        inst = circuit_to_instruction(qc)

        self.assertEqual(inst.params, [phi, theta])
        self.assertEqual(inst.definition[0][0].params, [theta])
        self.assertEqual(inst.definition[1][0].params, [phi])
        self.assertEqual(inst.definition[2][0].params, [theta, phi])
    def test_flatten_circuit_registers(self):
        """Check correct flattening"""
        qr1 = QuantumRegister(4, "qr1")
        qr2 = QuantumRegister(3, "qr2")
        qr3 = QuantumRegister(3, "qr3")
        cr1 = ClassicalRegister(4, "cr1")
        cr2 = ClassicalRegister(1, "cr2")
        circ = QuantumCircuit(qr1, qr2, qr3, cr1, cr2)
        circ.cx(qr1[1], qr2[2])
        circ.measure(qr3[0], cr2[0])

        inst = circuit_to_instruction(circ)
        q = QuantumRegister(10, "q")
        c = ClassicalRegister(5, "c")

        self.assertEqual(inst.definition[0].qubits, (q[1], q[6]))
        self.assertEqual(inst.definition[1].qubits, (q[7], ))
        self.assertEqual(inst.definition[1].clbits, (c[4], ))
    def test_parameter_map(self):
        """Verify alternate parameter specification"""
        qr = QuantumRegister(3, 'qr')
        qc = QuantumCircuit(qr)

        theta = Parameter('theta')
        phi = Parameter('phi')

        gamma = Parameter('gamma')

        qc.rz(theta, qr[0])
        qc.rz(phi, qr[1])
        qc.u2(theta, phi, qr[2])

        inst = circuit_to_instruction(qc, {theta: gamma, phi: phi})

        self.assertEqual(inst.params, [gamma, phi])
        self.assertEqual(inst.definition[0][0].params, [gamma])
        self.assertEqual(inst.definition[1][0].params, [phi])
        self.assertEqual(inst.definition[2][0].params, [gamma, phi])
Beispiel #8
0
    def test_flatten_parameters(self):
        """Verify parameters from circuit are moved to instruction.params"""
        qr = QuantumRegister(3, "qr")
        qc = QuantumCircuit(qr)

        theta = Parameter("theta")
        phi = Parameter("phi")
        sum_ = theta + phi

        qc.rz(theta, qr[0])
        qc.rz(phi, qr[1])
        qc.u(theta, phi, 0, qr[2])
        qc.rz(sum_, qr[0])

        inst = circuit_to_instruction(qc)

        self.assertEqual(inst.params, [phi, theta])
        self.assertEqual(inst.definition[0][0].params, [theta])
        self.assertEqual(inst.definition[1][0].params, [phi])
        self.assertEqual(inst.definition[2][0].params, [theta, phi, 0])
        self.assertEqual(str(inst.definition[3][0].params[0]), "phi + theta")
Beispiel #9
0
    def test_converter_gate_registration(self):
        """Verify converters register gates in session equivalence library."""
        qc_gate = QuantumCircuit(2)
        qc_gate.h(0)
        qc_gate.cx(0, 1)

        from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
        bell_gate = circuit_to_gate(qc_gate, equivalence_library=sel)

        qc_inst = QuantumCircuit(2)
        qc_inst.h(0)
        qc_inst.cx(0, 1)

        bell_inst = circuit_to_instruction(qc_inst, equivalence_library=sel)

        gate_entry = sel.get_entry(bell_gate)
        inst_entry = sel.get_entry(bell_inst)

        self.assertEqual(len(gate_entry), 1)
        self.assertEqual(len(inst_entry), 1)

        self.assertEqual(gate_entry[0], qc_gate)
        self.assertEqual(inst_entry[0], qc_inst)
Beispiel #10
0
    def test_parameter_map(self):
        """Verify alternate parameter specification"""
        qr = QuantumRegister(3, "qr")
        qc = QuantumCircuit(qr)

        theta = Parameter("theta")
        phi = Parameter("phi")
        sum_ = theta + phi

        gamma = Parameter("gamma")

        qc.rz(theta, qr[0])
        qc.rz(phi, qr[1])
        qc.u(theta, phi, 0, qr[2])
        qc.rz(sum_, qr[0])

        inst = circuit_to_instruction(qc, {theta: gamma, phi: phi})

        self.assertEqual(inst.params, [gamma, phi])
        self.assertEqual(inst.definition[0][0].params, [gamma])
        self.assertEqual(inst.definition[1][0].params, [phi])
        self.assertEqual(inst.definition[2][0].params, [gamma, phi, 0])
        self.assertEqual(str(inst.definition[3][0].params[0]), "gamma + phi")
    def test_flatten_circuit_overlapping_registers(self):
        """Test that the conversion works when the given circuit has bits that are contained in more
        than one register."""
        qubits = [Qubit() for _ in [None] * 10]
        qr1 = QuantumRegister(bits=qubits[:6])
        qr2 = QuantumRegister(bits=qubits[4:])
        clbits = [Clbit() for _ in [None] * 10]
        cr1 = ClassicalRegister(bits=clbits[:6])
        cr2 = ClassicalRegister(bits=clbits[4:])
        circ = QuantumCircuit(qubits, clbits, qr1, qr2, cr1, cr2)
        circ.cx(3, 5)
        circ.measure(4, 4)

        inst = circuit_to_instruction(circ)
        self.assertEqual(inst.num_qubits, len(qubits))
        self.assertEqual(inst.num_clbits, len(clbits))
        inst_definition = inst.definition
        _, cx_qargs, cx_cargs = inst_definition.data[0]
        _, measure_qargs, measure_cargs = inst_definition.data[1]
        self.assertEqual(cx_qargs, [inst_definition.qubits[3], inst_definition.qubits[5]])
        self.assertEqual(cx_cargs, [])
        self.assertEqual(measure_qargs, [inst_definition.qubits[4]])
        self.assertEqual(measure_cargs, [inst_definition.clbits[4]])
    def test_flatten_circuit_registerless(self):
        """Test that the conversion works when the given circuit has bits that are not contained in
        any register."""
        qr1 = QuantumRegister(2)
        qubits = [Qubit(), Qubit(), Qubit()]
        qr2 = QuantumRegister(3)
        cr1 = ClassicalRegister(2)
        clbits = [Clbit(), Clbit(), Clbit()]
        cr2 = ClassicalRegister(3)
        circ = QuantumCircuit(qr1, qubits, qr2, cr1, clbits, cr2)
        circ.cx(3, 5)
        circ.measure(4, 4)

        inst = circuit_to_instruction(circ)
        self.assertEqual(inst.num_qubits, len(qr1) + len(qubits) + len(qr2))
        self.assertEqual(inst.num_clbits, len(cr1) + len(clbits) + len(cr2))
        inst_definition = inst.definition
        _, cx_qargs, cx_cargs = inst_definition.data[0]
        _, measure_qargs, measure_cargs = inst_definition.data[1]
        self.assertEqual(cx_qargs, [inst_definition.qubits[3], inst_definition.qubits[5]])
        self.assertEqual(cx_cargs, [])
        self.assertEqual(measure_qargs, [inst_definition.qubits[4]])
        self.assertEqual(measure_cargs, [inst_definition.clbits[4]])
    def test_flatten_registers_of_circuit_single_bit_cond(self):
        """Check correct mapping of registers gates conditioned on single classical bits."""
        qr1 = QuantumRegister(2, "qr1")
        qr2 = QuantumRegister(3, "qr2")
        cr1 = ClassicalRegister(3, "cr1")
        cr2 = ClassicalRegister(3, "cr2")
        circ = QuantumCircuit(qr1, qr2, cr1, cr2)
        circ.h(qr1[0]).c_if(cr1[1], True)
        circ.h(qr2[1]).c_if(cr2[0], False)
        circ.cx(qr1[1], qr2[2]).c_if(cr2[2], True)
        circ.measure(qr2[2], cr2[0])

        inst = circuit_to_instruction(circ)
        q = QuantumRegister(5, "q")
        c = ClassicalRegister(6, "c")

        self.assertEqual(inst.definition[0][1], [q[0]])
        self.assertEqual(inst.definition[1][1], [q[3]])
        self.assertEqual(inst.definition[2][1], [q[1], q[4]])

        self.assertEqual(inst.definition[0][0].condition, (c[1], True))
        self.assertEqual(inst.definition[1][0].condition, (c[3], False))
        self.assertEqual(inst.definition[2][0].condition, (c[5], True))
Beispiel #14
0
 def time_circuit_to_instruction(self, *_):
     converters.circuit_to_instruction(self.qc)
    def test_unrolling_parameterized_composite_gates(self):
        """Verify unrolling circuits with parameterized composite gates."""
        mock_sel = EquivalenceLibrary(base=std_eqlib)

        qr1 = QuantumRegister(2)
        subqc = QuantumCircuit(qr1)

        theta = Parameter('theta')

        subqc.rz(theta, qr1[0])
        subqc.cx(qr1[0], qr1[1])
        subqc.rz(theta, qr1[1])

        # Expanding across register with shared parameter
        qr2 = QuantumRegister(4)
        qc = QuantumCircuit(qr2)

        sub_instr = circuit_to_instruction(subqc, equivalence_library=mock_sel)
        qc.append(sub_instr, [qr2[0], qr2[1]])
        qc.append(sub_instr, [qr2[2], qr2[3]])

        dag = circuit_to_dag(qc)
        pass_ = UnrollCustomDefinitions(mock_sel, ['p', 'cx'])
        dag = pass_.run(dag)

        out_dag = BasisTranslator(mock_sel, ['p', 'cx']).run(dag)

        # Pick up -1 * theta / 2 global phase four twice (once for each RZ -> P
        # in each of the two sub_instr instructions).
        expected = QuantumCircuit(qr2, global_phase=-1 * 4 * theta / 2.0)
        expected.p(theta, qr2[0])
        expected.p(theta, qr2[2])
        expected.cx(qr2[0], qr2[1])
        expected.cx(qr2[2], qr2[3])
        expected.p(theta, qr2[1])
        expected.p(theta, qr2[3])

        self.assertEqual(circuit_to_dag(expected), out_dag)

        # Expanding across register with shared parameter
        qc = QuantumCircuit(qr2)

        phi = Parameter('phi')
        gamma = Parameter('gamma')

        sub_instr = circuit_to_instruction(subqc, {theta: phi}, mock_sel)
        qc.append(sub_instr, [qr2[0], qr2[1]])
        sub_instr = circuit_to_instruction(subqc, {theta: gamma}, mock_sel)
        qc.append(sub_instr, [qr2[2], qr2[3]])

        dag = circuit_to_dag(qc)
        pass_ = UnrollCustomDefinitions(mock_sel, ['p', 'cx'])
        dag = pass_.run(dag)

        out_dag = BasisTranslator(mock_sel, ['p', 'cx']).run(dag)

        expected = QuantumCircuit(qr2,
                                  global_phase=-1 * (2 * phi + 2 * gamma) /
                                  2.0)
        expected.p(phi, qr2[0])
        expected.p(gamma, qr2[2])
        expected.cx(qr2[0], qr2[1])
        expected.cx(qr2[2], qr2[3])
        expected.p(phi, qr2[1])
        expected.p(gamma, qr2[3])

        self.assertEqual(circuit_to_dag(expected), out_dag)
Beispiel #16
0
    def test_unrolling_parameterized_composite_gates(self):
        """Verify unrolling circuits with parameterized composite gates."""
        mock_sel = EquivalenceLibrary(base=std_eqlib)

        qr1 = QuantumRegister(2)
        subqc = QuantumCircuit(qr1)

        theta = Parameter('theta')

        subqc.rz(theta, qr1[0])
        subqc.cx(qr1[0], qr1[1])
        subqc.rz(theta, qr1[1])

        # Expanding across register with shared parameter
        qr2 = QuantumRegister(4)
        qc = QuantumCircuit(qr2)

        sub_instr = circuit_to_instruction(subqc, equivalence_library=mock_sel)
        qc.append(sub_instr, [qr2[0], qr2[1]])
        qc.append(sub_instr, [qr2[2], qr2[3]])

        dag = circuit_to_dag(qc)
        pass_ = UnrollCustomDefinitions(mock_sel, ['u1', 'cx'])
        dag = pass_.run(dag)

        out_dag = BasisTranslator(mock_sel, ['u1', 'cx']).run(dag)

        expected = QuantumCircuit(qr2)
        expected.u1(theta, qr2[0])
        expected.u1(theta, qr2[2])
        expected.cx(qr2[0], qr2[1])
        expected.cx(qr2[2], qr2[3])
        expected.u1(theta, qr2[1])
        expected.u1(theta, qr2[3])

        self.assertEqual(circuit_to_dag(expected), out_dag)

        # Expanding across register with shared parameter
        qc = QuantumCircuit(qr2)

        phi = Parameter('phi')
        gamma = Parameter('gamma')

        sub_instr = circuit_to_instruction(subqc, {theta: phi}, mock_sel)
        qc.append(sub_instr, [qr2[0], qr2[1]])
        sub_instr = circuit_to_instruction(subqc, {theta: gamma}, mock_sel)
        qc.append(sub_instr, [qr2[2], qr2[3]])

        dag = circuit_to_dag(qc)
        pass_ = UnrollCustomDefinitions(mock_sel, ['u1', 'cx'])
        dag = pass_.run(dag)

        out_dag = BasisTranslator(mock_sel, ['u1', 'cx']).run(dag)

        expected = QuantumCircuit(qr2)
        expected.u1(phi, qr2[0])
        expected.u1(gamma, qr2[2])
        expected.cx(qr2[0], qr2[1])
        expected.cx(qr2[2], qr2[3])
        expected.u1(phi, qr2[1])
        expected.u1(gamma, qr2[3])

        self.assertEqual(circuit_to_dag(expected), out_dag)