From 08f58124ea98a24763b04059784a7c53d03ba8ee Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 08:57:21 +0100 Subject: [PATCH] Fix mpl circuit drawer with fold=-1 hanging with ControlFlow ops (backport #12016) (#12036) * Fix mpl circuit drawer with fold=-1 hanging with ControlFlow ops (#12016) * Fix typing-extensions * Fix control flow with fold minus one (cherry picked from commit 43381ae1b159c01b55159d2dc1e8a65970b72746) # Conflicts: # test/visual/mpl/circuit/test_circuit_matplotlib_drawer.py * Update test_circuit_matplotlib_drawer.py * Update test_circuit_matplotlib_drawer.py * Update test_circuit_matplotlib_drawer.py * Update test_circuit_matplotlib_drawer.py * Update test/visual/mpl/circuit/test_circuit_matplotlib_drawer.py --------- Co-authored-by: Edwin Navarro Co-authored-by: Luciano Bello --- qiskit/visualization/circuit/matplotlib.py | 2 +- ...-flow-fold-minus-one-f2af168a5313385f.yaml | 8 +++++++ .../control_flow_fold_minus_one.png | Bin 0 -> 11611 bytes .../circuit/test_circuit_matplotlib_drawer.py | 21 ++++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/fix-control-flow-fold-minus-one-f2af168a5313385f.yaml create mode 100644 test/visual/mpl/circuit/references/control_flow_fold_minus_one.png diff --git a/qiskit/visualization/circuit/matplotlib.py b/qiskit/visualization/circuit/matplotlib.py index cf76a7f3fea..f5a725a680b 100644 --- a/qiskit/visualization/circuit/matplotlib.py +++ b/qiskit/visualization/circuit/matplotlib.py @@ -1534,7 +1534,7 @@ def _flow_op_gate(self, node, node_data, glob_data): while end_x > 0.0: x_shift = fold_level * self._fold y_shift = fold_level * (glob_data["n_lines"] + 1) - end_x = xpos + box_width - x_shift + end_x = xpos + box_width - x_shift if self._fold > 0 else 0.0 if isinstance(node.op, IfElseOp): flow_text = " If" diff --git a/releasenotes/notes/fix-control-flow-fold-minus-one-f2af168a5313385f.yaml b/releasenotes/notes/fix-control-flow-fold-minus-one-f2af168a5313385f.yaml new file mode 100644 index 00000000000..5f8567da70e --- /dev/null +++ b/releasenotes/notes/fix-control-flow-fold-minus-one-f2af168a5313385f.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + Fixed an issue with the :func:`circuit_drawer` or :meth:`QuantumCircuit.draw` + when using the ``mpl`` output option where the program would hang if the + circuit being drawn had a ControlFlow operation in it and the ``fold`` option + was set to -1 (meaning no fold). + Fixed `#12012 `__. diff --git a/test/visual/mpl/circuit/references/control_flow_fold_minus_one.png b/test/visual/mpl/circuit/references/control_flow_fold_minus_one.png new file mode 100644 index 0000000000000000000000000000000000000000..41dccaa03ec3996c8826b2edd18c34e5fc81efdb GIT binary patch literal 11611 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 f|L620#SnEB9c9d8i&y^vYpD$| literal 0 HcmV?d00001 diff --git a/test/visual/mpl/circuit/test_circuit_matplotlib_drawer.py b/test/visual/mpl/circuit/test_circuit_matplotlib_drawer.py index 56425699d4c..f12898acc2f 100644 --- a/test/visual/mpl/circuit/test_circuit_matplotlib_drawer.py +++ b/test/visual/mpl/circuit/test_circuit_matplotlib_drawer.py @@ -2218,6 +2218,27 @@ def test_control_flow_nested_layout(self): ) self.assertGreaterEqual(ratio, 0.9999) + def test_control_flow_with_fold_minus_one(self): + """Test control flow works with fold=-1. Qiskit issue #12012""" + qreg = QuantumRegister(2, "qr") + creg = ClassicalRegister(2, "cr") + circuit = QuantumCircuit(qreg, creg) + with circuit.if_test((creg[1], 1)): + circuit.h(0) + circuit.cx(0, 1) + + fname = "control_flow_fold_minus_one.png" + self.circuit_drawer(circuit, output="mpl", style="iqp", filename=fname, fold=-1) + + ratio = VisualTestUtilities._save_diff( + self._image_path(fname), + self._reference_path(fname), + fname, + FAILURE_DIFF_DIR, + FAILURE_PREFIX, + ) + self.assertGreaterEqual(ratio, 0.9999) + def test_default_futurewarning(self): """Test using the default scheme emits a future warning.""" qc = QuantumCircuit(1)