트랜스파일러 스케줄링 패스
qiskit_ibm_runtime.transpiler.passes.scheduling
고급 '동적 회로' 기능을 지원하는 IBM Quantum 의 차세대 백엔드로 작업하기 위한 스케줄링 패스 모음입니다. 즉., 측정 결과에 기반한 고전적인 제어 흐름/피드백을 지원하는 회로입니다. 동적 회로에 대한 자세한 내용은 클래식 피드포워드 및 제어 흐름 가이드를 참조하세요.
이러한 스케줄링 패스는 동적 회로의 스케줄링 루틴과 부정적으로 상호작용할 수 있으므로 키스킷에 내장된 스케줄링 패스와 혼합해서는 안 됩니다. 여기에는 scheduling_method 설정이 포함됩니다 transpile() 또는 generate_preset_pass_manager().
클래스
BlockBasePadder | 패딩 패스의 기본 클래스입니다. |
ALAPScheduleAnalysis | 동적 회로 가능한 한 늦게(ALAP) 스케줄링 분석 통과. |
ASAPScheduleAnalysis | 동적 회로는 가능한 한 빨리(ASAP) 스케줄링 분석 패스를 사용합니다. |
DynamicCircuitInstructionDurations | 동적 회로 명령어 실행 시간. |
PadDelay | 지연 지침으로 유휴 시간을 늘리세요. |
PadDynamicalDecoupling | IBM 동적 회로 백엔드용 동적 디커플링 삽입 패스. |
사용 예제
아래에서는 동적 회로 백엔드의 실행 모델에 지연이 있는 텔레포트 회로를 예약하고 패딩하는 방법을 보여드립니다:
from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.transpiler.passmanager import PassManager
from qiskit_ibm_runtime.transpiler.passes.scheduling import ALAPScheduleAnalysis
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDelay
from qiskit_ibm_runtime.fake_provider import FakeJakartaV2
backend = FakeJakartaV2()
# Use this duration class to get appropriate durations for dynamic
# circuit backend scheduling
# Generate the main Qiskit transpile passes.
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
# Configure the as-late-as-possible scheduling pass
pm.scheduling = PassManager([
ALAPScheduleAnalysis(target=backend.target),
PadDelay(target=backend.target)]
)
qr = QuantumRegister(3)
crz = ClassicalRegister(1, name="crz")
crx = ClassicalRegister(1, name="crx")
result = ClassicalRegister(1, name="result")
teleport = QuantumCircuit(qr, crz, crx, result, name="Teleport")
teleport.h(qr[1])
teleport.cx(qr[1], qr[2])
teleport.cx(qr[0], qr[1])
teleport.h(qr[0])
teleport.measure(qr[0], crz)
teleport.measure(qr[1], crx)
with teleport.if_test((crz, 1)):
teleport.z(qr[2])
with teleport.if_test((crx, 1)):
teleport.x(qr[2])
teleport.measure(qr[2], result)
# Transpile.
scheduled_teleport = pm.run(teleport)
scheduled_teleport.draw(output="mpl", style="iqp")
지연을 추가하는 대신, 아래와 같이 pass를 PadDynamicalDecoupling 사용하여 동적 분리 시퀀스를 삽입할 수도 있습니다:
from qiskit.circuit.library import XGate
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDynamicalDecoupling
dd_sequence = [XGate(), XGate()]
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
pm.scheduling = PassManager(
[
ALAPScheduleAnalysis(target=backend.target),
PadDynamicalDecoupling(target=backend.target, dd_sequences=dd_sequence),
]
)
dd_teleport = pm.run(teleport)
dd_teleport.draw(output="mpl", style="iqp")
키스킷으로 회로를 컴파일할 때, 모든 변환을 한 번의 트랜스파일로 수행하는 것이 더 효율적이고 강력합니다. 위에서 키스킷의 프리셋 패스 관리자를 확장하여 이를 수행했습니다. 예를 들어, 키스킷의 transpile() 함수는 내부적으로 generate_preset_pass_manager() 를 사용하여 패스 세트를 빌드합니다. 의 인스턴스를 반환하며 StagedPassManager의 인스턴스를 반환하며, 이는 확장할 수 있습니다.