From 53e25fa0d8a3f21c44a4e884c0941f2c18863c8c Mon Sep 17 00:00:00 2001 From: ElePT <57907331+ElePT@users.noreply.github.com> Date: Fri, 20 Jan 2023 23:45:01 +0100 Subject: [PATCH] Fix qpy for `MCX` gates (#9391) * Add MCXGrayCode * Add test and reno * Add other mcx gates * Fix test Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit ad952940e9367f1483e5e7f5e8e3203d8618301b) --- qiskit/qpy/binary_io/circuits.py | 9 +++++++- .../fix-qpy-mcxgray-421cf8f673f24238.yaml | 7 ++++++ .../circuit/test_circuit_load_from_qpy.py | 23 +++++++++++++++++-- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml diff --git a/qiskit/qpy/binary_io/circuits.py b/qiskit/qpy/binary_io/circuits.py index 4053fb0a5758..527d7ec5442e 100644 --- a/qiskit/qpy/binary_io/circuits.py +++ b/qiskit/qpy/binary_io/circuits.py @@ -252,7 +252,14 @@ def _read_instruction(file_obj, circuit, registers, custom_operations, version, if gate_name in {"IfElseOp", "WhileLoopOp"}: gate = gate_class(condition_tuple, *params) elif version >= 5 and issubclass(gate_class, ControlledGate): - if gate_name in {"MCPhaseGate", "MCU1Gate"}: + if gate_name in { + "MCPhaseGate", + "MCU1Gate", + "MCXGrayCode", + "MCXGate", + "MCXRecursive", + "MCXVChain", + }: gate = gate_class(*params, instruction.num_ctrl_qubits) else: gate = gate_class(*params) diff --git a/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml b/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml new file mode 100644 index 000000000000..5f594a561522 --- /dev/null +++ b/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed a bug in QPY (:mod:`qiskit.qpy`) where circuits containing gates of class + :class:`.MCXGate`, :class:`.MCXGrayCode`, and :class:`MCXRecursive`, and + :class:`.MCXVChain` would fail to serialize. + See `#9390 `__. diff --git a/test/python/circuit/test_circuit_load_from_qpy.py b/test/python/circuit/test_circuit_load_from_qpy.py index db4e62c5999a..349bca64f3f1 100644 --- a/test/python/circuit/test_circuit_load_from_qpy.py +++ b/test/python/circuit/test_circuit_load_from_qpy.py @@ -24,7 +24,18 @@ from qiskit.circuit.quantumregister import Qubit from qiskit.circuit.random import random_circuit from qiskit.circuit.gate import Gate -from qiskit.circuit.library import XGate, QFT, QAOAAnsatz, PauliEvolutionGate, DCXGate, MCU1Gate +from qiskit.circuit.library import ( + XGate, + QFT, + QAOAAnsatz, + PauliEvolutionGate, + DCXGate, + MCU1Gate, + MCXGate, + MCXGrayCode, + MCXRecursive, + MCXVChain, +) from qiskit.circuit.instruction import Instruction from qiskit.circuit.parameter import Parameter from qiskit.circuit.parametervector import ParameterVector @@ -1043,9 +1054,17 @@ def test_open_controlled_gate(self): def test_standard_control_gates(self): """Test standard library controlled gates.""" - qc = QuantumCircuit(3) + qc = QuantumCircuit(6) mcu1_gate = MCU1Gate(np.pi, 2) + mcx_gate = MCXGate(5) + mcx_gray_gate = MCXGrayCode(5) + mcx_recursive_gate = MCXRecursive(4) + mcx_vchain_gate = MCXVChain(3) qc.append(mcu1_gate, [0, 2, 1]) + qc.append(mcx_gate, list(range(0, 6))) + qc.append(mcx_gray_gate, list(range(0, 6))) + qc.append(mcx_recursive_gate, list(range(0, 5))) + qc.append(mcx_vchain_gate, list(range(0, 5))) qc.mcp(np.pi, [0, 2], 1) qc.mct([0, 2], 1) qc.mcx([0, 2], 1)