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>
This commit is contained in:
ElePT 2023-01-20 23:45:01 +01:00 committed by GitHub
parent ff1d886a77
commit ad952940e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 3 deletions

View File

@ -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)

View File

@ -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 <https://github.com/Qiskit/qiskit-terra/issues/9390>`__.

View File

@ -24,7 +24,18 @@ from qiskit.circuit.classicalregister import Clbit
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 @@ class TestLoadFromQPY(QiskitTestCase):
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)