PadDynamicalDecoupling
class PadDynamicalDecoupling(*args, **kwargs)
Basi: BlockBasePadder
Passaggio di inserimento del disaccoppiamento dinamico per i backend dei circuiti dinamici di IBM.
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
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")
È necessario chiamare ALAPScheduleAnalysis prima di eseguire il disaccoppiamento dinamico per garantire che il circuito soddisfi i vincoli di allineamento dell'acquisizione per i backend dei circuiti dinamici.
Parametri
-
durate - Durate delle istruzioni da utilizzare nella programmazione.
-
dd_sequences - Sequenza di cancelli da applicare nei punti inattivi. In alternativa, è possibile fornire un elenco di sequenze di porte che verranno inserite preferenzialmente in presenza di un ritardo di durata sufficiente. La regolazione può essere effettuata tramite il sito
sequence_min_length_ratios, fornito in opzione. -
qubit - Qubit fisici su cui applicare il DD. Se Nessuno, tutti i qubit saranno sottoposti a DD (quando possibile).
-
spaziature - Un elenco di elenchi 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]. Questa spaziatura si applica solo al primo sottocircuito, se è specificato un
coupling_map -
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”: distribuire il gioco in eccesso nel modo più uniforme possibile in
intervalli all'inizio e alla fine della sequenza.
-
-
sequence\min\length_ratios - Elenco del rapporto minimo tra lunghezza del ritardo e sequenza DD da soddisfare per inserire la sequenza DD. Ad esempio, se la sequenza di disaccoppiamento dinamico X-X è lunga 320dt campioni e il ritardo disponibile è 384dt, il rapporto è 384dt/320dt=1.2. Dal punto di vista del disaccoppiamento dinamico, è probabile che questo aggiunga più rumore di controllo che riduzioni del tasso di errore di disaccoppiamento. Il valore predefinito è 2.0.
-
insert_multiple_cycles - Se la durata disponibile supera 2*sequence_min_length_ratio*duration(dd_sequence ) abilita l'inserimento di più cicli della sequenza di disaccoppiamento dinamico in quel ritardo.
-
coupling\map - grafo diretto che rappresenta la mappa di accoppiamento del dispositivo. Specificando una mappa di accoppiamento, il dispositivo viene suddiviso in sottocircuiti, in modo da poter applicare sequenze DD con intervalli di impulsi diversi all'interno di ciascuno di essi. Attualmente supporta 2 sottocircuiti.
-
alt_spacings - Un elenco di elenchi di spazi tra le porte DD, per il secondo sottocircuito, come determinato dalla mappa di accoppiamento. Se Nessuno, verrà utilizzata una spaziatura bilanciata e sfalsata rispetto al primo sottocircuito [d, d, d,..., d, d, 0].
-
schedule_idle_qubits - Impostare su true se si desidera inserire un ritardo sui qubit inattivi. Questo è utile per le visualizzazioni della linea temporale, ma può causare problemi per l'esecuzione su backend di grandi dimensioni.
-
dd_barriera - applica il DD solo ai ritardi che terminano con una barriera la cui etichetta contiene la stringa specificata
-
block_ordering_callable - Un callable usato per produrre un ordinamento dei nodi per minimizzare il numero di blocchi necessari. Se non viene fornito, verrà utilizzato
block_order_op_nodes(). -
target – Il target di compilazione del backend.
Aumenti
- TranspilerError - Quando viene specificata una sequenza DD non valida.
- TranspilerError - Quando viene trovato un gate di impulsi con una durata che non è multipla del valore del vincolo di allineamento.
- TranspilerError - Quando la mappa di accoppiamento non è supportata (cioè, se il grado > 3)
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
__call__
__call__(circuit, property_set=None)
Esegue il circuito di passaggio.
Parametri
- circuit (QuantumCircuit) – Il giorno in cui viene effettuato il passaggio.
- property_set (PropertySet | dict | None) – Set di proprietà di input/output. Un passaggio di analisi potrebbe modificare le proprietà impostate in loco. Se non specificato, verrà utilizzato
property_setl'attributo esistente del pass (se impostato).
Risultati
Se la trasformazione ha esito positivo, il risultato è QuantumCircuit. Se l'analisi ha esito positivo, il circuito di ingresso.
Tipo di restituzione
execute
execute(passmanager_ir, state, callback=None)
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
tupla[ DAGCircuit, PassManagerState ]
name
name()
Nome del passo.
Tipo di restituzione
STR
run
run(dag)
Eseguire il passaggio di imbottitura su dag.
Parametri
dag (DAGCircuit) – DAG da controllare.
Risultati
DAG con tempo di inattività riempito di istruzioni.
Aumenti
TranspilerError - Quando un particolare nodo non è programmato, è probabile che venga inserito un passaggio di trasformazione prima che questo nodo venga chiamato.
Tipo di restituzione
update_status
update_status(state, run_state)
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