PadDynamicalDecoupling
class PadDynamicalDecoupling(*args, **kwargs)
Bases : BlockBasePadder
Passe d'insertion de découplage dynamique pour IBM circuits dynamiques.
Ce laissez-passer fonctionne sur un circuit physique programmé. Il recherche dans le circuit les périodes d'inactivité (c'est-à-dire celles qui contiennent des instructions de retard) et insère une séquence de portes DD à ces endroits. Ces portes équivalent à l'identité et ne modifient donc pas l'action logique du circuit, mais ont pour effet d'atténuer la décohérence pendant les périodes d'inactivité. Dans un cas particulier, la passe autorise une séquence length-1 (par exemple [XGate()] ). Dans ce cas, l'insertion de DD ne se produit que lorsque l'inverse de la porte peut être absorbé par une porte voisine dans le circuit (nous remplacerions donc toujours Delay par quelque chose d'équivalent à l'identité). Cela peut être utilisé, par exemple, comme un écho de Hahn. Ce passage permet de s'assurer que la séquence insérée préserve exactement le circuit (y compris la phase globale).
import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import XGate
from qiskit.transpiler import PassManager, InstructionDurations
from qiskit.visualization import timeline_drawer
from qiskit_ibm_runtime.transpiler.passes.scheduling import ALAPScheduleAnalysis
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDynamicalDecoupling
circ = QuantumCircuit(4)
circ.h(0)
circ.cx(0, 1)
circ.cx(1, 2)
circ.cx(2, 3)
circ.measure_all()
durations = InstructionDurations(
[("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10),
("cx", [1, 2], 200), ("cx", [2, 3], 300),
("x", None, 50), ("measure", None, 1000)]
)
# balanced X-X sequence on all qubits
dd_sequence = [XGate(), XGate()]
pm = PassManager([ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence)])
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
# Uhrig sequence on qubit 0
n = 8
dd_sequence = [XGate()] * n
def uhrig_pulse_location(k):
return np.sin(np.pi * (k + 1) / (2 * n + 2)) ** 2
spacings = []
for k in range(n):
spacings.append(uhrig_pulse_location(k) - sum(spacings))
spacings.append(1 - sum(spacings))
pm = PassManager(
[
ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence, qubits=[0], spacings=spacings),
]
)
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
Vous devez appeler ALAPScheduleAnalysis avant d'exécuter le découplage dynamique pour garantir que votre circuit satisfait aux contraintes d'alignement d'acquisition pour les backends de circuits dynamiques.
Paramètres
-
durées - Durées des instructions à utiliser dans l'ordonnancement.
-
dd_sequences - Séquence de portes à appliquer dans les zones inactives. Il est également possible de fournir une liste de séquences de portes qui seront insérées de préférence en cas de retard d'une durée suffisante. Elle peut être réglée à l'aide du logiciel
sequence_min_length_ratiosfourni en option. -
qubits - Qubits physiques sur lesquels appliquer le DD. Si elle est nulle, tous les qubits seront soumis au DD (lorsque cela est possible).
-
espacements - Une liste de listes d'espacements entre les portes DD. La marge de manœuvre disponible sera répartie en fonction de ces éléments. La longueur de la liste doit être supérieure d'une unité à la longueur de dd_sequence, et la somme des éléments doit être égale à 1. Si aucun, un espacement équilibré sera utilisé [d/2, d, d, …, d, d, d/2]. Cet espacement ne s'applique qu'au premier sous-circuit, si une adresse
coupling_mapest spécifiée -
skip_reset_qubits - Si True, n'insère pas de DD sur les périodes d'inactivité qui suivent immédiatement les qubits initialisés/réinitialisés (car les qubits à l'état fondamental sont moins sensibles à la décohérence).
-
pulse_alignment - Contraintes matérielles pour l'allocation de la grille temporelle. Elle est généralement fournie par le site
backend.configuration().timing_constraints. Si elle est fournie, la longueur du délai, c'est-à-direspacing, est implicitement ajustée pour satisfaire cette contrainte. -
extra_slack_distribution -
Option permettant de contrôler le comportement de la génération de séquences DD. La durée de la séquence DD doit être identique à une période d'inactivité dans le circuit quantique programmé; toutefois, le retard entre les portes composant la séquence doit être un nombre entier en unités de dt, et il peut être encore tronqué lorsque
pulse_alignmentest spécifié. Il en résulte parfois que la durée de la séquence créée est plus courte que le temps d'inactivité que vous souhaitez remplir avec la séquence, c'est-à-dire qu'il y a plus de marge de manœuvre. Cette option prend les valeurs suivantes.-
"middle" : Mettez le mou supplémentaire à l'intervalle au milieu de la séquence.
-
« bords » : Répartissez le surplus de longueur aussi uniformément que possible entre
des intervalles au début et à la fin de la séquence.
-
-
sequence_min_length_ratios - Liste des rapports minimaux entre la longueur du délai et la séquence DD à respecter pour insérer la séquence DD. Par exemple, si la séquence de découplage dynamique X-X est longue de 320dt échantillons et que le délai disponible est de 384dt, le rapport est de 384dt/320dt=1.2. Du point de vue du découplage dynamique, cela risque d'ajouter plus de bruit de contrôle que de réduire le taux d'erreur du découplage. La valeur par défaut est 2.0.
-
insert_multiple_cycles - Si la durée disponible est supérieure à 2*sequence_min_length_ratio*duration(dd_sequence ), activer l'insertion de plusieurs cycles de la séquence de découplage dynamique dans ce délai.
-
coupling_map - graphe orienté représentant la carte de couplage de l'appareil. La spécification d'une carte de couplage divise le dispositif en sous-circuits, afin d'appliquer des séquences DD avec différents intervalles d'impulsions dans chacun d'eux. Actuellement, 2 sous-circuits sont pris en charge.
-
alt_spacings - Une liste de listes d'espacements entre les portes DD, pour le deuxième sous-circuit, tel que déterminé par la carte de couplage. Si la valeur est nulle, un espacement équilibré décalé par rapport au premier sous-circuit sera utilisé [d, d, d,..., d, d, 0.]
-
schedule_idle_qubits - Définit à true si vous souhaitez qu'un délai soit inséré sur les qubits inactifs. Ceci est utile pour la visualisation de la chronologie, mais peut poser des problèmes d'exécution sur des backends de grande taille.
-
dd_barrier - appliquer DD uniquement aux retards se terminant par une barrière dont l'étiquette contient la chaîne spécifiée
-
block_ordering_callable - Un callable utilisé pour produire un ordre des nœuds afin de minimiser le nombre de blocs nécessaires. S'il n'est pas fourni,
block_order_op_nodes()sera utilisé. -
cible – La cible de compilation du backend.
Augmentations
- TranspilerError - Lorsque la séquence DD spécifiée n'est pas valide.
- TranspilerError - Lorsqu'une porte d'impulsion dont la durée n'est pas multiple de la valeur de la contrainte d'alignement est trouvée.
- TranspilerError - Lorsque la carte de couplage n'est pas prise en charge (c'est-à-dire si le degré > 3)
Attributs
is_analysis_pass
Vérifier si la passe est une passe d'analyse.
Si le passe est un AnalysisPass,, cela signifie qu'il peut analyser le DAG et écrire les résultats de cette analyse dans l'ensemble de propriétés. Les modifications sur le DAG ne sont pas autorisées par ce type de passe.
is_transformation_pass
Vérifier si le laissez-passer est un laissez-passer de transformation.
Si la passe est une TransformationPass,, cela signifie qu'elle peut manipuler le DAG, mais qu'elle ne peut pas modifier l'ensemble des propriétés (mais qu'elle peut les lire).
Méthodes
__call__
__call__(circuit, property_set=None)
Fait fonctionner le circuit de passage.
Paramètres
- circuit (QuantumCircuit) – Le jour où le col est franchi.
- property_set (PropertySet | dict | None) – Ensemble de propriétés d'entrée/sortie. Une passe d'analyse peut modifier les propriétés définies sur place. Si ce n'est pas le cas, l'attribut
property_setexistant du pass sera utilisé (s'il est défini).
Retours
Si une transformation est effectuée, l' QuantumCircuit qui en résulte. Si l'analyse est concluante, le circuit d'entrée.
Type de retour
execute
execute(passmanager_ir, state, callback=None)
Exécuter la tâche d'optimisation pour l'entrée Qiskit IR.
Paramètres
- passmanager_ir (DAGCircuit) – IR de Qiskit à optimiser.
- state (DAGCircuit) – État lié à l'exécution du flux de travail par le gestionnaire de passes lui-même.
- callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Une fonction de rappel qui est appelée à chaque exécution d'une tâche d'optimisation.
Retours
Qiskit IR optimisé et état du flux de travail.
Type de retour
tuple[ DAGCircuit, PassManagerState ]
name
name()
Nom du laissez-passer.
Type de retour
str
run
run(dag)
Exécutez la passe de rembourrage sur dag.
Paramètres
dag (DAGCircuit) – DAG à vérifier.
Retours
DAG avec des temps morts remplis d'instructions.
Augmentations
TranspilerError - Lorsqu'un nœud particulier n'est pas programmé, il est probable qu'une passe de transformation soit insérée avant que ce nœud ne soit appelé.
Type de retour
update_status
update_status(state, run_state)
Mettre à jour le statut du flux de travail.
Paramètres
- state (PassManagerState) – Transmettre l'état du gestionnaire à mettre à jour.
- run_state (RunState) – Statut d'achèvement de la tâche en cours.
Retours
Mise à jour de l'état du gestionnaire de passe.
Type de retour