Skip to content

ASAPScheduleAnalysis Yields a TranspilerError given InstructionDurations #14691

@AlexanderGroeger

Description

@AlexanderGroeger

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdocumentationSomething is not clear or an error documentation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions