Passaggi di pianificazione del transpiler
qiskit_ibm_runtime.transpiler.passes.scheduling
Una raccolta di passaggi di schedulazione per lavorare con i backend di nuova generazione di IBM Quantum che supportano funzionalità avanzate di "circuito dinamico". Cioè, circuiti con supporto per il classico flusso di controllo/feedback basato sui risultati delle misure. Per ulteriori informazioni sui circuiti dinamici, consultate la nostra guida al flusso di controllo e feedforward classico.
Non si devono mescolare questi passaggi di schedulazione con quelli integrati in Qiskit, poiché interagiscono negativamente con le routine di schedulazione dei circuiti dinamici. Questo include l'impostazione di scheduling_method in transpile() o generate_preset_pass_manager().
Classi
BlockBasePadder | La classe base del passaggio di imbottitura. |
ALAPScheduleAnalysis | Circuiti dinamici as-late-as-possible (ALAP) per l'analisi dello scheduling. |
ASAPScheduleAnalysis | Circuiti dinamici as-soon-as-possible (ASAP) per l'analisi dello scheduling. |
DynamicCircuitInstructionDurations | Durata delle istruzioni dei circuiti dinamici. |
PadDelay | Imbottire il tempo di inattività con istruzioni di ritardo. |
PadDynamicalDecoupling | Passaggio di inserimento del disaccoppiamento dinamico per i backend dei circuiti dinamici di IBM. |
Utilizzo di esempio
Di seguito dimostriamo come programmare e imbottire un circuito di teletrasporto con ritardi per il modello di esecuzione di un backend di circuito dinamico:
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")
Anziché ricorrere a ritardi di riempimento, possiamo anche inserire una sequenza di disaccoppiamento dinamico utilizzando il comando PadDynamicalDecoupling pass, come illustrato di seguito:
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")
Quando si compila un circuito con Qiskit, è più efficiente e robusto eseguire tutte le trasformazioni in un'unica transpilazione. Questo è stato fatto sopra estendendo i gestori di passaggi preimpostati di Qiskit. Ad esempio, la funzione transpile() costruisce internamente il suo set di pass utilizzando generate_preset_pass_manager(). Restituisce istanze di StagedPassManagerche possono essere estese.