From de312535e484bbbed5ab11ea8ce9f0dbeb704dbc Mon Sep 17 00:00:00 2001 From: Kevin Krsulich Date: Tue, 23 Mar 2021 13:17:15 -0400 Subject: [PATCH 1/2] Set sympy.evaluate(False) on frequent code paths for phase tracking. --- qiskit/dagcircuit/dagcircuit.py | 4 +++- qiskit/transpiler/passes/basis/basis_translator.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/qiskit/dagcircuit/dagcircuit.py b/qiskit/dagcircuit/dagcircuit.py index 499d23fff0eb..3748c48ec80f 100644 --- a/qiskit/dagcircuit/dagcircuit.py +++ b/qiskit/dagcircuit/dagcircuit.py @@ -987,7 +987,9 @@ def substitute_node_with_dag(self, node, input_dag, wires=None): replay_node.cargs) if in_dag.global_phase: - self.global_phase += in_dag.global_phase + from sympy import evaluate + with evaluate(False): + self.global_phase += in_dag.global_phase if wires is None: wires = in_dag.wires diff --git a/qiskit/transpiler/passes/basis/basis_translator.py b/qiskit/transpiler/passes/basis/basis_translator.py index d29f4648895f..bd2558956e8a 100644 --- a/qiskit/transpiler/passes/basis/basis_translator.py +++ b/qiskit/transpiler/passes/basis/basis_translator.py @@ -158,7 +158,9 @@ def run(self, dag): dag.substitute_node(node, dag_op, inplace=True) if bound_target_dag.global_phase: - dag.global_phase += bound_target_dag.global_phase + from sympy import evaluate + with evaluate(False): + dag.global_phase += bound_target_dag.global_phase else: dag.substitute_node_with_dag(node, bound_target_dag) else: From 705e0df944bd5a2fb0222bf9d2341e5c5b3c9c9d Mon Sep 17 00:00:00 2001 From: Kevin Krsulich Date: Mon, 29 Mar 2021 15:47:59 -0400 Subject: [PATCH 2/2] Add release note. --- ...ExcitationPreserving-297f3afd4a987cac.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 releasenotes/notes/5405-Slow-transpilation-of-ExcitationPreserving-297f3afd4a987cac.yaml diff --git a/releasenotes/notes/5405-Slow-transpilation-of-ExcitationPreserving-297f3afd4a987cac.yaml b/releasenotes/notes/5405-Slow-transpilation-of-ExcitationPreserving-297f3afd4a987cac.yaml new file mode 100644 index 000000000000..7205ea7b6836 --- /dev/null +++ b/releasenotes/notes/5405-Slow-transpilation-of-ExcitationPreserving-297f3afd4a987cac.yaml @@ -0,0 +1,19 @@ +--- +upgrade: + - | + Following transpilation of a parameterized :class:`~qiskit.circuit.QuantumCircuit`, + the :attr:`~qiskit.circuit.QuantumCircuit.global_phase` attribute of output circuit + may no longer be returned in a simplified form, if the global phase is a + :class:`~qiskit.circuit.ParameterExpression`. + + For example,:: + + qc = QuantumCircuit(1) + theta = Parameter('theta') + + qc.rz(theta, 0) + qc.rz(-theta, 0) + + transpile(qc, basis_gates=['p']).global_phase + + previously returned ``0``, but will now return ``-0.5*theta + 0.5*theta``.