diff --git a/qiskit_addon_cutting/utils/transforms.py b/qiskit_addon_cutting/utils/transforms.py index c0f34727..4fd1785f 100644 --- a/qiskit_addon_cutting/utils/transforms.py +++ b/qiskit_addon_cutting/utils/transforms.py @@ -225,6 +225,11 @@ def _separate_instructions_by_partition( } for i, inst in enumerate(circuit.data): + # A zero-qubit global-phase instruction spans no partition, so it + # cannot be assigned to any subcircuit; skip it. + if inst.operation.name == "global_phase": + continue + # Collect the partition labels spanned by the instruction partitions_spanned = set() for qubit in inst.qubits: diff --git a/releasenotes/notes/fix-global-phase-separation-6b1f4c2d9a0e7e51.yaml b/releasenotes/notes/fix-global-phase-separation-6b1f4c2d9a0e7e51.yaml new file mode 100644 index 00000000..677b5790 --- /dev/null +++ b/releasenotes/notes/fix-global-phase-separation-6b1f4c2d9a0e7e51.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed an ``AssertionError`` raised by ``separate_circuit()`` (and, in turn, + ``partition_problem()``) when the input circuit contained a zero-qubit + ``global_phase`` instruction. Such an instruction spans no partition, so it + is now skipped when assigning operations to subcircuits. diff --git a/test/utils/test_transforms.py b/test/utils/test_transforms.py index 089991be..49bed5c5 100644 --- a/test/utils/test_transforms.py +++ b/test/utils/test_transforms.py @@ -20,7 +20,7 @@ QuantumCircuit, CircuitInstruction, ) -from qiskit.circuit.library import efficient_su2, Measure +from qiskit.circuit.library import efficient_su2, Measure, GlobalPhaseGate from qiskit.circuit.library.standard_gates import RZZGate from qiskit_addon_cutting import partition_circuit_qubits @@ -357,6 +357,21 @@ def test_separate_circuit(self): subcircuits[i].data[j].operation.name, inst.operation.name ) + with self.subTest("Zero-qubit global-phase instruction is dropped"): + qc = QuantumCircuit(2) + qc.append(GlobalPhaseGate(0.5), []) + qc.x(0) + qc.y(1) + + subcircuits = separate_circuit(qc, "AB").subcircuits + + self.assertEqual( + ["x"], [inst.operation.name for inst in subcircuits["A"].data] + ) + self.assertEqual( + ["y"], [inst.operation.name for inst in subcircuits["B"].data] + ) + with self.subTest("Bad partition labels"): circuit = QuantumCircuit(2) partition_labels = "ABB"