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.
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
BlockBasePadder | La classe de base de la passe de rembourrage. |
ALAPScheduleAnalysis | Passe d'analyse de l'ordonnancement des circuits dynamiques au plus tard possible (ALAP). |
ASAPScheduleAnalysis | Passe d'analyse de l'ordonnancement des circuits dynamiques "as-soon-as-possible" (ASAP). |
DynamicCircuitInstructionDurations | Durées dynamiques des instructions de circuit. |
PadDelay | Remplir le temps d'inactivité avec des instructions de retard. |
PadDynamicalDecoupling | Passe 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")
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")
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.