Passagens de programação do transpiler
qiskit_ibm_runtime.transpiler.passes.scheduling
Uma coleção de passes de agendamento para trabalhar com os back-ends de última geração do IBM Quantum que oferecem suporte a recursos avançados de "circuito dinâmico". Ou seja, circuitos com suporte para fluxo de controle/feedback clássico com base em resultados de medição. Para obter mais informações sobre circuitos dinâmicos, consulte nosso guia de fluxo de controle e feedforward clássico.
Você não deve misturar esses passes de agendamento com os passes de agendamento integrados do Qiskit, pois eles interagirão negativamente com as rotinas de agendamento para circuitos dinâmicos. Isso inclui a configuração de scheduling_method em transpile() ou generate_preset_pass_manager().
Classes
BlockBasePadder | A classe base do passe de preenchimento. |
ALAPScheduleAnalysis | Passe de análise de agendamento de circuitos dinâmicos como o mais tardio possível (ALAP). |
ASAPScheduleAnalysis | Passe de análise de agendamento de circuitos dinâmicos do tipo "tão logo quanto possível" (ASAP). |
DynamicCircuitInstructionDurations | Duração dinâmica das instruções do circuito. |
PadDelay | Preenchimento do tempo ocioso com instruções de atraso. |
PadDynamicalDecoupling | Passe de inserção de desacoplamento dinâmico para IBM backends de circuitos dinâmicos. |
Exemplo de uso
A seguir, demonstramos como programar e preencher um circuito de teletransporte com atrasos para um modelo de execução de backend de circuito dinâmico:
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")
Em vez de preencher com atrasos, também podemos inserir uma sequência de desacoplamento dinâmico usando o comando PadDynamicalDecoupling pass, conforme mostrado a seguir:
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")
Ao compilar um circuito com o Qiskit, é mais eficiente e mais robusto realizar todas as transformações em uma única transpilação. Isso foi feito acima, ampliando os gerenciadores de passes predefinidos do Qiskit. Por exemplo, a função transpile() do Qiskit constrói internamente seu conjunto de passes usando generate_preset_pass_manager(). Isso retorna instâncias de StagedPassManagerque podem ser estendidas.