From 48272560b20db3467fdfe02d5cb588a89f23071f Mon Sep 17 00:00:00 2001 From: ElePT Date: Thu, 19 Jan 2023 11:58:53 +0100 Subject: [PATCH 1/4] Add MCXGrayCode --- qiskit/qpy/binary_io/circuits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiskit/qpy/binary_io/circuits.py b/qiskit/qpy/binary_io/circuits.py index 4053fb0a5758..0e2bea045285 100644 --- a/qiskit/qpy/binary_io/circuits.py +++ b/qiskit/qpy/binary_io/circuits.py @@ -252,7 +252,7 @@ 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"}: gate = gate_class(*params, instruction.num_ctrl_qubits) else: gate = gate_class(*params) From 43fd41799ac20e6134c019cd595cd8c6c6a671d8 Mon Sep 17 00:00:00 2001 From: ElePT Date: Thu, 19 Jan 2023 16:45:44 +0100 Subject: [PATCH 2/4] Add test and reno --- .../notes/fix-qpy-mcxgray-421cf8f673f24238.yaml | 6 ++++++ test/python/circuit/test_circuit_load_from_qpy.py | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml diff --git a/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml b/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml new file mode 100644 index 000000000000..aeeb1150eceb --- /dev/null +++ b/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixed a bug in QPY (:mod:`qiskit.qpy`) where circuits containing gates of class + :class:`.MCXGrayCode` 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..4bf7aa9e8bd3 100644 --- a/test/python/circuit/test_circuit_load_from_qpy.py +++ b/test/python/circuit/test_circuit_load_from_qpy.py @@ -24,7 +24,15 @@ 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, + MCXGrayCode, +) from qiskit.circuit.instruction import Instruction from qiskit.circuit.parameter import Parameter from qiskit.circuit.parametervector import ParameterVector @@ -1043,9 +1051,11 @@ 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_gray_gate = MCXGrayCode(5) qc.append(mcu1_gate, [0, 2, 1]) + qc.append(mcx_gray_gate, list(range(0, 6))) qc.mcp(np.pi, [0, 2], 1) qc.mct([0, 2], 1) qc.mcx([0, 2], 1) From 97a2f80e8da5964fb7de353dd21f2071b483b761 Mon Sep 17 00:00:00 2001 From: ElePT Date: Fri, 20 Jan 2023 15:02:56 +0100 Subject: [PATCH 3/4] Add other mcx gates --- qiskit/qpy/binary_io/circuits.py | 9 ++++++++- releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml | 3 ++- test/python/circuit/test_circuit_load_from_qpy.py | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/qiskit/qpy/binary_io/circuits.py b/qiskit/qpy/binary_io/circuits.py index 0e2bea045285..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", "MCXGrayCode"}: + 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 index aeeb1150eceb..5f594a561522 100644 --- a/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml +++ b/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml @@ -2,5 +2,6 @@ fixes: - | Fixed a bug in QPY (:mod:`qiskit.qpy`) where circuits containing gates of class - :class:`.MCXGrayCode` would fail to serialize. + :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 4bf7aa9e8bd3..6c79fccc4b8d 100644 --- a/test/python/circuit/test_circuit_load_from_qpy.py +++ b/test/python/circuit/test_circuit_load_from_qpy.py @@ -31,7 +31,10 @@ PauliEvolutionGate, DCXGate, MCU1Gate, + MCXGate, MCXGrayCode, + MCXRecursive, + MCXVChain, ) from qiskit.circuit.instruction import Instruction from qiskit.circuit.parameter import Parameter @@ -1053,9 +1056,15 @@ def test_standard_control_gates(self): """Test standard library controlled gates.""" qc = QuantumCircuit(6) mcu1_gate = MCU1Gate(np.pi, 2) + mcx_gate = MCXGate(5) mcx_gray_gate = MCXGrayCode(5) + mcx_recursive_gate = MCXRecursive(5) + mcx_vchain_gate = MCXVChain(5) 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, 6))) + qc.append(mcx_vchain_gate, list(range(0, 6))) qc.mcp(np.pi, [0, 2], 1) qc.mct([0, 2], 1) qc.mcx([0, 2], 1) From 642bbfa9d1a1a1c11eb6ecafb0480bf9de2266cf Mon Sep 17 00:00:00 2001 From: ElePT <57907331+ElePT@users.noreply.github.com> Date: Fri, 20 Jan 2023 15:47:11 +0100 Subject: [PATCH 4/4] Fix test --- test/python/circuit/test_circuit_load_from_qpy.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/python/circuit/test_circuit_load_from_qpy.py b/test/python/circuit/test_circuit_load_from_qpy.py index 6c79fccc4b8d..349bca64f3f1 100644 --- a/test/python/circuit/test_circuit_load_from_qpy.py +++ b/test/python/circuit/test_circuit_load_from_qpy.py @@ -1058,13 +1058,13 @@ def test_standard_control_gates(self): mcu1_gate = MCU1Gate(np.pi, 2) mcx_gate = MCXGate(5) mcx_gray_gate = MCXGrayCode(5) - mcx_recursive_gate = MCXRecursive(5) - mcx_vchain_gate = MCXVChain(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, 6))) - qc.append(mcx_vchain_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)