Skip to main content
IBM Quantum Platform

PadDynamicalDecoupling

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

GitHub

Basi: BasePadding

Passaggio di inserimento del disaccoppiamento dinamico.

Questo passaggio funziona su un circuito fisico programmato. Esamina il circuito alla ricerca di periodi di tempo inattivi (cioè quelli che contengono istruzioni di ritardo) e inserisce una sequenza DD di porte in quei punti. Queste porte equivalgono all'identità, quindi non alterano l'azione logica del circuito, ma hanno l'effetto di attenuare la decoerenza nei periodi di inattività.

Come caso speciale, il passaggio consente una sequenza length-1 (ad esempio [XGate()]). In questo caso l'inserimento di DD avviene solo quando l'inverso del gate può essere assorbito in un gate vicino nel circuito (quindi sostituiremmo ancora il ritardo con qualcosa che è equivalente all'identità). Questo può essere utilizzato, ad esempio, come eco di Hahn.

Questo passaggio assicura che la sequenza inserita preservi esattamente il circuito (compresa la fase 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)
Output del codice precedente.Output del codice precedente.
Nota

Potrebbe essere necessario chiamare il passaggio di allineamento prima di eseguire il disaccoppiamento dinamico per garantire che il circuito soddisfi i vincoli di allineamento dell'acquisizione.

Inizializzatore di disaccoppiamento dinamico.

Parametri

  • durate - Durate delle istruzioni da utilizzare nella programmazione.

  • dd_sequence - Sequenza di cancelli da applicare nei punti inattivi.

  • qubit - Qubit fisici su cui applicare il DD. Se Nessuno, tutti i qubit saranno sottoposti a DD (quando possibile).

  • spaziatura - Un elenco di spaziature tra le porte DD. L'allentamento disponibile verrà suddiviso in base a questo criterio. La lunghezza dell'elenco deve essere superiore alla lunghezza di dd_sequence e la somma degli elementi deve essere pari a 1. Se Nessuno, verrà utilizzata una spaziatura bilanciata [d/2, d, d, …, d, d, d/2].

  • skip_reset\qubits - Se True, non inserisce la DD nei periodi di inattività che seguono immediatamente i qubit inizializzati/ripristinati (poiché i qubit allo stato terreno sono meno suscettibili alla decoerenza).

  • pulse_alignment - I vincoli hardware per l'allocazione dei tempi dei gate. Di solito viene fornito da backend.configuration().timing_constraints. Se fornita, la lunghezza del ritardo, cioè spacing, è implicitamente regolato per soddisfare questo vincolo.

  • distribuzione extra_allentata_distribuzione -

    L'opzione per controllare il comportamento della generazione della sequenza DD. La durata della sequenza DD dovrebbe essere identica a un tempo di inattività nel circuito quantistico programmato, tuttavia il ritardo tra le porte che compongono la sequenza dovrebbe essere un numero intero in unità di dt, e potrebbe essere ulteriormente troncato quando viene specificato pulse_alignment . A volte la durata della sequenza creata è più breve del tempo di inattività che si desidera riempire con la sequenza, cioè un margine extra. Questa opzione assume i seguenti valori.

    • "centrale": Mettere l'allentamento extra all'intervallo a metà della sequenza.
    • "bordi": Suddividere il più uniformemente possibile l'allentamento extra in intervalli all'inizio e alla fine della sequenza.
  • target - L'elemento Target che rappresenta il backend di destinazione. Il target ha la precedenza sugli altri argomenti quando possono essere dedotti dal target. Pertanto, specificando il target e altri argomenti come durations o pulse_alignment , questi ultimi verranno ignorati.

Aumenti

  • TranspilerError – Quando viene specificata una sequenza DD non valida.
  • TranspilerError – Quando viene individuato un impulso con una durata che non è un multiplo del valore specificato dal vincolo di allineamento.
  • TypeError - Se dd_sequence non è specificato

Attributi

is_analysis_pass

Controlla se il passaggio è un passaggio di analisi.

Se il passo è un AnalysisPass,, significa che il passo può analizzare il DAG e scrivere i risultati di tale analisi nel set di proprietà. Questo tipo di passaggio non consente di modificare il DAG.

is_transformation_pass

Controlla se il passaggio è un passaggio di trasformazione.

Se il passaggio è un TransformationPass,, significa che il passaggio può manipolare il DAG, ma non può modificare il set di proprietà (ma può essere letto).


Metodi

execute

execute(passmanager_ir, state, callback=None)

GitHub

Eseguire l'attività di ottimizzazione per l'IR Qiskit in ingresso.

Parametri

  • passmanager_ir (DAGCircuit) – Qiskit IR da ottimizzare.
  • state (DAGCircuit) – Stato associato all'esecuzione del flusso di lavoro da parte dello stesso gestore dei passaggi.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Una funzione di callback che viene chiamata ad ogni esecuzione di un'attività di ottimizzazione.

Risultati

Qiskit IR ottimizzato e stato del flusso di lavoro.

Tipo di restituzione

tuple [ DAGCircuit, PassManagerState ]

get_duration

get_duration(node, dag)

GitHub

Ottiene la durata di un determinato nodo del circuito.

name

name()

GitHub

Nome del passo.

Tipo di restituzione

STR

run

run(dag)

GitHub

Eseguire il passaggio di imbottitura su dag.

Parametri

dag (DAGCircuit) – DAG da controllare.

Risultati

DAG con tempo di inattività riempito di istruzioni.

Tipo di restituzione

DAGCircuito

Aumenti

TranspilerError – Quando un determinato nodo non è previsto nella sequenza, è probabile che venga inserito un passaggio di trasformazione prima che tale nodo venga chiamato.

update_status

update_status(state, run_state)

GitHub

Aggiornare lo stato del flusso di lavoro.

Parametri

  • state (PassManagerState) – Passare lo stato del gestore da aggiornare.
  • run_state (RunState) – Stato di completamento dell'attività corrente.

Risultati

Stato aggiornato del gestore dei passaggi.

Tipo di restituzione

PassManagerState

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