Skip to main content
IBM Quantum Platform

Passes de planification du transpilateur

qiskit_ibm_runtime.transpiler.passes.scheduling

Une collection de passes d'ordonnancement pour travailler avec les backends de nouvelle génération de IBM Quantum qui prennent en charge des capacités avancées de "circuit dynamique". Ie.., avec prise en charge du flux de contrôle/rétroaction classique basé sur les résultats des mesures. Pour plus d'informations sur les circuits dynamiques, consultez notre guide sur les flux de contrôle et d'anticipation classiques.

Avertissement

Vous ne devez pas mélanger ces passes d'ordonnancement avec les passes d'ordonnancement intégrées de Qiskit, car elles interagissent négativement avec les routines d'ordonnancement des circuits dynamiques. Il s'agit notamment de définir scheduling_method dans transpile() ou generate_preset_pass_manager().


Cours

BlockBasePadderLa classe de base de la passe de rembourrage.
ALAPScheduleAnalysisPasse d'analyse de l'ordonnancement des circuits dynamiques au plus tard possible (ALAP).
ASAPScheduleAnalysisPasse d'analyse de l'ordonnancement des circuits dynamiques "as-soon-as-possible" (ASAP).
DynamicCircuitInstructionDurationsDurées dynamiques des instructions de circuit.
PadDelayRemplir le temps d'inactivité avec des instructions de retard.
PadDynamicalDecouplingPasse d'insertion de découplage dynamique pour IBM circuits dynamiques.

Utilisation d'exemple

Nous montrons ci-dessous comment programmer et préparer un circuit de téléportation avec des retards pour le modèle d'exécution d'un backend de circuit dynamique :

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")
Schéma de circuit produit par le code précédent.

Au lieu d'ajouter des délais, on peut également insérer une séquence de découplage dynamique à l'aide de la commande PadDynamicalDecoupling « pass », comme indiqué ci-dessous :

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")
Schéma de circuit produit par le code précédent.

Lors de la compilation d'un circuit avec Qiskit, il est plus efficace et plus robuste d'effectuer toutes les transformations en une seule transpilation. C'est ce qui a été fait ci-dessus en étendant les gestionnaires de passe prédéfinis de Qiskit. Par exemple, la fonction transpile() de Qiskit construit en interne son jeu de passes en utilisant generate_preset_pass_manager(). Cette méthode renvoie des instances de StagedPassManagerqui peuvent être étendues.

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.