Skip to main content
IBM Quantum Platform

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.

Avvertenza

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

BlockBasePadderLa classe base del passaggio di imbottitura.
ALAPScheduleAnalysisCircuiti dinamici as-late-as-possible (ALAP) per l'analisi dello scheduling.
ASAPScheduleAnalysisCircuiti dinamici as-soon-as-possible (ASAP) per l'analisi dello scheduling.
DynamicCircuitInstructionDurationsDurata delle istruzioni dei circuiti dinamici.
PadDelayImbottire il tempo di inattività con istruzioni di ritardo.
PadDynamicalDecouplingPassaggio 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")
Schema del circuito prodotto dal codice precedente.

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")
Schema del circuito prodotto dal codice precedente.

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.

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.