From caba84079f4c2fd5487a3d2640bdf263f9aae21c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Pe=C3=B1a=20Tapia?= Date: Mon, 18 Nov 2024 13:17:55 +0100 Subject: [PATCH 1/4] Set decomposer to None if kak_gates not found during ConsolidateBlocks initialization. --- qiskit/transpiler/passes/optimization/consolidate_blocks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiskit/transpiler/passes/optimization/consolidate_blocks.py b/qiskit/transpiler/passes/optimization/consolidate_blocks.py index 63dca11f6d2d..516560aeb6db 100644 --- a/qiskit/transpiler/passes/optimization/consolidate_blocks.py +++ b/qiskit/transpiler/passes/optimization/consolidate_blocks.py @@ -80,7 +80,7 @@ def __init__( KAK_GATE_NAMES[kak_gates.pop()], basis_fidelity=approximation_degree or 1.0 ) else: - self.decomposer = TwoQubitBasisDecomposer(CXGate()) + self.decomposer = None else: self.decomposer = TwoQubitBasisDecomposer(CXGate()) From 67b95307b3b3d40dfd83f7e5aa89786e82434a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Pe=C3=B1a=20Tapia?= Date: Mon, 18 Nov 2024 13:30:32 +0100 Subject: [PATCH 2/4] Add test that reproduces issue --- .../transpiler/test_consolidate_blocks.py | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/test/python/transpiler/test_consolidate_blocks.py b/test/python/transpiler/test_consolidate_blocks.py index 3b3aff1db228..fbe11ff77db1 100644 --- a/test/python/transpiler/test_consolidate_blocks.py +++ b/test/python/transpiler/test_consolidate_blocks.py @@ -16,20 +16,19 @@ import unittest import numpy as np +from ddt import ddt, data from qiskit.circuit import QuantumCircuit, QuantumRegister, IfElseOp, Gate from qiskit.circuit.library import U2Gate, SwapGate, CXGate, CZGate, UnitaryGate from qiskit.converters import circuit_to_dag -from qiskit.transpiler.passes import ConsolidateBlocks from qiskit.quantum_info.operators import Operator from qiskit.quantum_info.operators.measures import process_fidelity -from qiskit.transpiler import PassManager -from qiskit.transpiler import Target -from qiskit.transpiler.passes import Collect1qRuns -from qiskit.transpiler.passes import Collect2qBlocks +from qiskit.transpiler import PassManager, Target, generate_preset_pass_manager +from qiskit.transpiler.passes import ConsolidateBlocks, Collect1qRuns, Collect2qBlocks from test import QiskitTestCase # pylint: disable=wrong-import-order +@ddt class TestConsolidateBlocks(QiskitTestCase): """ Tests to verify that consolidating blocks of gates into unitaries @@ -571,6 +570,26 @@ def __init__(self): self.assertEqual(res, qc) + @data(2, 3) + def test_no_kak_gates_in_preset_pm(self, opt_level): + """Test correct initialization of ConsolidateBlocks pass when kak_gates aren't found. + Reproduces https://github.com/Qiskit/qiskit/issues/13438.""" + + qc = QuantumCircuit(2) + qc.cz(0, 1) + qc.sx([0, 1]) + qc.cz(0, 1) + + ref_pm = generate_preset_pass_manager( + optimization_level=1, basis_gates=["rz", "rzz", "sx", "x", "rx"] + ) + ref_tqc = ref_pm.run(qc) + pm = generate_preset_pass_manager( + optimization_level=opt_level, basis_gates=["rz", "rzz", "sx", "x", "rx"] + ) + tqc = pm.run(qc) + self.assertEqual(ref_tqc, tqc) + if __name__ == "__main__": unittest.main() From e3124a615f7e89d1ae7589e48e0c860780c9272d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Pe=C3=B1a=20Tapia?= Date: Mon, 18 Nov 2024 15:31:24 +0100 Subject: [PATCH 3/4] Re-add rzz to list of kak gates --- qiskit/transpiler/passes/optimization/consolidate_blocks.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qiskit/transpiler/passes/optimization/consolidate_blocks.py b/qiskit/transpiler/passes/optimization/consolidate_blocks.py index 516560aeb6db..721fbcd793c7 100644 --- a/qiskit/transpiler/passes/optimization/consolidate_blocks.py +++ b/qiskit/transpiler/passes/optimization/consolidate_blocks.py @@ -12,9 +12,11 @@ """Replace each block of consecutive gates by a single Unitary node.""" from __future__ import annotations +from math import pi from qiskit.synthesis.two_qubit import TwoQubitBasisDecomposer -from qiskit.circuit.library.standard_gates import CXGate, CZGate, iSwapGate, ECRGate +from qiskit.circuit.library.standard_gates import CXGate, CZGate, iSwapGate, ECRGate, RXXGate + from qiskit.transpiler.basepasses import TransformationPass from qiskit.transpiler.passmanager import PassManager from qiskit._accelerate.consolidate_blocks import consolidate_blocks @@ -27,6 +29,7 @@ "cz": CZGate(), "iswap": iSwapGate(), "ecr": ECRGate(), + "rxx": RXXGate(pi / 2), } @@ -70,7 +73,6 @@ def __init__( if basis_gates is not None: self.basis_gates = set(basis_gates) self.force_consolidate = force_consolidate - if kak_basis_gate is not None: self.decomposer = TwoQubitBasisDecomposer(kak_basis_gate) elif basis_gates is not None: From 3238a6165bcc8171071a239d028621b84dd5d955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Pe=C3=B1a=20Tapia?= Date: Mon, 18 Nov 2024 19:29:18 +0100 Subject: [PATCH 4/4] Add path for rzx gate. --- qiskit/transpiler/passes/optimization/consolidate_blocks.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qiskit/transpiler/passes/optimization/consolidate_blocks.py b/qiskit/transpiler/passes/optimization/consolidate_blocks.py index 721fbcd793c7..ce64233699b2 100644 --- a/qiskit/transpiler/passes/optimization/consolidate_blocks.py +++ b/qiskit/transpiler/passes/optimization/consolidate_blocks.py @@ -81,6 +81,10 @@ def __init__( self.decomposer = TwoQubitBasisDecomposer( KAK_GATE_NAMES[kak_gates.pop()], basis_fidelity=approximation_degree or 1.0 ) + elif "rzx" in basis_gates: + self.decomposer = TwoQubitBasisDecomposer( + CXGate(), basis_fidelity=approximation_degree or 1.0 + ) else: self.decomposer = None else: