-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Description
Environment
- Qiskit version: 2.1.0
- Python version: 3.11.4
- Operating system: Windows 11
What is happening?
The pass manager is failing to run the scheduling pass. The specific problem is that it thinks the duration of a particular gate is undefined for specific qubits even though these have been included in the InstructionDurations argument use for creating an ASAPScheduleAnalysis pass. Here's a stack trace for the specific example code I've provided.
TranspilerError Traceback (most recent call last)
Cell In[42], [line 18](vscode-notebook-cell:?execution_count=42&line=18)
[15](vscode-notebook-cell:?execution_count=42&line=15) schedule_pass = ASAPScheduleAnalysis(durations=durations)
[17](vscode-notebook-cell:?execution_count=42&line=17) pm = PassManager([schedule_pass])
---> [18](vscode-notebook-cell:?execution_count=42&line=18) qc_scheduled = pm.run(qc_transpiled)
File c:\Users\alex\miniconda3\envs\quantum\Lib\site-packages\qiskit\transpiler\passmanager.py:474, in _replace_error.<locals>.wrapper(*meth_args, **meth_kwargs)
[471](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:471) @wraps(meth)
[472](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:472) def wrapper(*meth_args, **meth_kwargs):
[473](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:473) try:
--> [474](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:474) return meth(*meth_args, **meth_kwargs)
[475](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:475) except TranspilerError:
[476](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:476) # If it's already a `TranspilerError` subclass, don't erase the extra information.
[477](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:477) raise
File c:\Users\alex\miniconda3\envs\quantum\Lib\site-packages\qiskit\transpiler\passmanager.py:233, in PassManager.run(self, circuits, output_name, callback, num_processes, property_set)
[230](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:230) if callback is not None:
[231](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:231) callback = _legacy_style_callback(callback)
--> [233](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:233) return super().run(
[234](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:234) in_programs=circuits,
[235](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:235) callback=callback,
[236](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:236) output_name=output_name,
[237](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:237) num_processes=num_processes,
[238](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passmanager.py:238) property_set=property_set,
...
[82](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py:82) if duration is None:
---> [83](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py:83) raise TranspilerError(f"Duration of {node.op.name} on qubits {indices} is not found.")
[85](file:///C:/Users/alex/miniconda3/envs/quantum/Lib/site-packages/qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py:85) return duration
TranspilerError: 'Duration of x on qubits [0] is not found.'
How can we reproduce the issue?
from qiskit import QuantumCircuit, transpile
from qiskit.circuit.library import XGate
from qiskit.transpiler import InstructionDurations, PassManager
from qiskit.transpiler.passes import ASAPScheduleAnalysis
qc = QuantumCircuit(2)
qc.x(0)
qc.measure_all()
qc_transpiled = transpile(qc, basis_gates=['x'], optimization_level=0)
durations = InstructionDurations(
[(XGate, [q], 60) for q in range(qc.num_qubits)],
)
schedule_pass = ASAPScheduleAnalysis(durations=durations)
pm = PassManager([schedule_pass])
qc_scheduled = pm.run(qc_transpiled)
What should happen?
The pass should create a new circuit with appropriately inserted timed delays to accommodate the schedule of the original circuit operations. This worked in Qiskit 1.2.2 I believe.
Any suggestions?
I would suggest looking looking directly into the qiskit\transpiler\passmanager.py
and the ASAPScheduleAnalysis
class to see how it handles using InstructionDurations
. There could be faulty logic in there.
I could be using this wrong, but I've had ChatGPT hammer this for a while, its not able to keep version API separated in its solutions, so it yields a lot of bugs due to the recent API changes to Qiskit. The other things I've noticed is if I transpile to use u3 and change my instruction durations to include u3, the error still occurs on qubit 0, but specifically for u3.