Skip to main content
IBM Quantum Platform

PadDynamicalDecoupling

class qiskit.transpiler.passes.PadDynamicalDecoupling(*args, **kwargs)

GitHub

Bases : BasePadding

Passe d'insertion de découplage dynamique.

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, le laissez-passer 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, Target, CouplingMap
from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDynamicalDecoupling
from qiskit.visualization import timeline_drawer

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)],
    dt=1e-7
)
target = Target.from_configuration(
    ["h", "cx", "reset", "x", "measure"],
    num_qubits=4,
    coupling_map=CouplingMap.from_line(4, bidirectional=False),
    instruction_durations=durations,
    dt=1e-7,
)

# balanced X-X sequence on all qubits
dd_sequence = [XGate(), XGate()]
pm = PassManager([ALAPScheduleAnalysis(durations),
                  PadDynamicalDecoupling(durations, dd_sequence)])
circ_dd = pm.run(circ)
timeline_drawer(circ_dd, target=target)

# 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
spacing = []
for k in range(n):
    spacing.append(uhrig_pulse_location(k) - sum(spacing))
spacing.append(1 - sum(spacing))
pm = PassManager(
    [
        ALAPScheduleAnalysis(durations),
        PadDynamicalDecoupling(durations, dd_sequence, qubits=[0], spacing=spacing),
    ]
)
circ_dd = pm.run(circ)
timeline_drawer(circ_dd, target=target)
Sortie du code précédent.Sortie du code précédent.
Remarque

Il se peut que vous deviez appeler la passe d'alignement avant d'exécuter le découplage dynamique pour garantir que votre circuit satisfait aux contraintes d'alignement d'acquisition.

Initialisateur de découplage dynamique.

Paramètres

  • durées - Durées des instructions à utiliser dans l'ordonnancement.

  • dd_sequence - Séquence de portes à appliquer dans les zones inactives.

  • qubits - Qubits physiques sur lesquels appliquer le DD. Si elle est nulle, tous les qubits seront soumis au DD (lorsque cela est possible).

  • espacement - Une liste 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].

  • 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'attribution du temps de la porte. Elle est généralement fournie par le site backend.configuration().timing_constraints. Si elle est fournie, la longueur du délai, c'est-à-dire spacing, 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_alignment est 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.
    • les "bords" : Répartissez le mou supplémentaire aussi uniformément que possible dans des intervalles au début et à la fin de la séquence.
  • target - L'élément Target représentant le backend cible. La cible est prioritaire sur les autres arguments lorsqu'ils peuvent être déduits de la cible. Par conséquent, si l'on spécifie la cible ainsi que d'autres arguments tels que durations ou pulse_alignment , ces autres arguments seront ignorés.

Augmentations

  • TranspilerError – Lorsqu'une séquence DD non valide est spécifiée.
  • TranspilerError – Lorsqu’une porte d’impulsion dont la durée n’est pas un multiple de la valeur de la contrainte d’alignement est détectée.
  • TypeError - Si dd_sequence n'est pas spécifié

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

execute

execute(passmanager_ir, state, callback=None)

GitHub

Exécuter la tâche d'optimisation pour l'entrée Qiskit IR.

Paramètres

  • passmanager_ir (DAGCircuit) – IR 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 ]

get_duration

get_duration(node, dag)

GitHub

Obtenir la durée d'un nœud donné dans le circuit.

name

name()

GitHub

Nom du laissez-passer.

Type de retour

str

run

run(dag)

GitHub

Exécutez la passe de rembourrage sur dag.

Paramètres

dag (DAGCircuit) – DAG à vérifier.

Retours

DAG avec des temps morts remplis d'instructions.

Type de retour

DAGCircuit

Augmentations

TranspilerError – Lorsqu'un nœud donné n'est pas planifié, il est probable qu'une étape de transformation soit insérée avant que ce nœud ne soit appelé.

update_status

update_status(state, run_state)

GitHub

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

PassManagerState

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