From 52e8811d97afcda72fae42310b4e5b6a98155f73 Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Mon, 24 Feb 2025 17:10:30 +0100 Subject: [PATCH 1/4] rename module --- qiskit/circuit/{add_control.py => _add_control.py} | 0 qiskit/circuit/gate.py | 2 +- test/python/circuit/test_controlled_gate.py | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename qiskit/circuit/{add_control.py => _add_control.py} (100%) diff --git a/qiskit/circuit/add_control.py b/qiskit/circuit/_add_control.py similarity index 100% rename from qiskit/circuit/add_control.py rename to qiskit/circuit/_add_control.py diff --git a/qiskit/circuit/gate.py b/qiskit/circuit/gate.py index 122db0973124..f087c02f2844 100644 --- a/qiskit/circuit/gate.py +++ b/qiskit/circuit/gate.py @@ -137,7 +137,7 @@ def control( """ if not annotated: # captures both None and False # pylint: disable=cyclic-import - from .add_control import add_control + from ._add_control import add_control return add_control(self, num_ctrl_qubits, label, ctrl_state) diff --git a/test/python/circuit/test_controlled_gate.py b/test/python/circuit/test_controlled_gate.py index 02190e07f882..a00f680dc388 100644 --- a/test/python/circuit/test_controlled_gate.py +++ b/test/python/circuit/test_controlled_gate.py @@ -27,7 +27,7 @@ from qiskit.quantum_info.operators.predicates import matrix_equal, is_unitary_matrix from qiskit.quantum_info.random import random_unitary from qiskit.quantum_info.states import Statevector -import qiskit.circuit.add_control as ac +import qiskit.circuit._add_control as ac from qiskit.transpiler.passes import UnrollCustomDefinitions, BasisTranslator from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.converters.circuit_to_dag import circuit_to_dag From 63c7bb3fdec1d3feef04f7f8e2241d7e78a197b7 Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Mon, 24 Feb 2025 17:29:22 +0100 Subject: [PATCH 2/4] simplify tests --- test/python/circuit/test_controlled_gate.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/python/circuit/test_controlled_gate.py b/test/python/circuit/test_controlled_gate.py index a00f680dc388..980c670194de 100644 --- a/test/python/circuit/test_controlled_gate.py +++ b/test/python/circuit/test_controlled_gate.py @@ -27,7 +27,6 @@ from qiskit.quantum_info.operators.predicates import matrix_equal, is_unitary_matrix from qiskit.quantum_info.random import random_unitary from qiskit.quantum_info.states import Statevector -import qiskit.circuit._add_control as ac from qiskit.transpiler.passes import UnrollCustomDefinitions, BasisTranslator from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.converters.circuit_to_dag import circuit_to_dag @@ -1584,10 +1583,10 @@ class TestSingleControlledRotationGates(QiskitTestCase): gry = ry.RYGate(theta) grz = rz.RZGate(theta) - ugu1 = ac._unroll_gate(gu1, ["p", "u", "cx"]) - ugrx = ac._unroll_gate(grx, ["p", "u", "cx"]) - ugry = ac._unroll_gate(gry, ["p", "u", "cx"]) - ugrz = ac._unroll_gate(grz, ["p", "u", "cx"]) + ugu1 = u1.U1Gate(theta).definition + ugrx = rx.RXGate(theta).definition + ugry = ry.RYGate(theta).definition + ugrz = rz.RZGate(theta).definition ugrz.params = grz.params cgu1 = ugu1.control(num_ctrl) From ec86e8ffe4c67db2d0a101bcbde6d7c6ae6b9a8a Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Mon, 24 Feb 2025 17:31:39 +0100 Subject: [PATCH 3/4] reno --- .../notes/private-add_control-2367872c0f7136c4.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 releasenotes/notes/private-add_control-2367872c0f7136c4.yaml diff --git a/releasenotes/notes/private-add_control-2367872c0f7136c4.yaml b/releasenotes/notes/private-add_control-2367872c0f7136c4.yaml new file mode 100644 index 000000000000..862ccaa3af7b --- /dev/null +++ b/releasenotes/notes/private-add_control-2367872c0f7136c4.yaml @@ -0,0 +1,6 @@ +--- +upgrade_circuits: + - | + The internal function ``qiskit.circuit.add_control.add_control`` was removed and inlined, as it is not part of the + public API. User that had been wrongly using it as ``add_control(SomeGate(...), ...)`` should change their code to + ``SomeGate(...).control(...)`` instead. From d9b744ab13a8a6f4c0f3b50c87bc0c537600537f Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Thu, 6 Mar 2025 09:53:27 +0100 Subject: [PATCH 4/4] Reword release note --- .../notes/private-add_control-2367872c0f7136c4.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/releasenotes/notes/private-add_control-2367872c0f7136c4.yaml b/releasenotes/notes/private-add_control-2367872c0f7136c4.yaml index 862ccaa3af7b..17fe70ef8d6d 100644 --- a/releasenotes/notes/private-add_control-2367872c0f7136c4.yaml +++ b/releasenotes/notes/private-add_control-2367872c0f7136c4.yaml @@ -1,6 +1,6 @@ --- upgrade_circuits: - | - The internal function ``qiskit.circuit.add_control.add_control`` was removed and inlined, as it is not part of the - public API. User that had been wrongly using it as ``add_control(SomeGate(...), ...)`` should change their code to - ``SomeGate(...).control(...)`` instead. + The internal function ``qiskit.circuit.add_control.add_control`` was removed, as it is not part of the + public API. It had fragile preconditions to uphold and was a common source of bugs. Uses of ``add_control(SomeGate(...), ...)`` + should change to ``SomeGate(...).control(...)`` using :meth:`.Gate.control` instead, which is far safer.