Stim supporta la correzione degli errori quantistici in QDK

Stim è uno strumento open source di Google Quantum AI per la simulazione rapida e l'analisi dei circuiti stabilizzatori quantistici, in particolare i circuiti QEC (Quantum Error Correction). I protocolli QEC usano in genere cicli ripetuti di Clifford operazioni e Pauli misurazioni e i ricercatori spesso analizzano i protocolli QEC con Pauli modelli di rumore. Questa struttura del circuito è molto più efficiente per simulare in modo classico rispetto a un circuito quantistico generale, in modo che i ricercatori possano testare molte esecuzioni di circuiti di correzione degli errori di grandi dimensioni.

Microsoft Quantum Development Kit (QDK) include QDK-Stim, che estende Stim con funzionalità aggiuntive. È possibile scrivere circuiti con il Stim set di istruzioni, compilarli in rappresentazione intermedia quantistica (QIR) ed eseguirli nei QDK simulatori. QDK-Stim aggiunge il supporto per la perdita di qubit, la post-selezione, i modelli di ripetizione fino all'esito positivo e le operazioni non-Clifford.

Accedere QDKQDK-Stim tramite il qdk.stim modulo. Il modulo accetta Stim il codice sorgente ed esegue il programma compilato nei QDK simulatori. L' QDKPython API non ha la funzionalità completa del stimPython pacchetto e non espone classi come stim.Circuit, sampler compilati o modelli di errore del rilevatore.

Per altre informazioni su Stim, vedere il Stim repository in GitHub.

Prerequisites

Per usare i circuiti Stim con QDK, è necessario:

  • Python 3.10 o versione successiva.
  • pip o un altro Python gestore pacchetti.
  • Un Python ambiente, ad esempio un ambiente virtuale o un Jupyter Notebook.
  • Familiarità di base con il formato del Stim circuito.

Installare e usare Stim con il/la QDK

Installare o aggiornare il QDKPython pacchetto:

pip install --upgrade qdk

Importare il stim modulo da qdk, definire un Stim circuito come stringa e passare il circuito a stim.run. L'esempio seguente prepara e misura uno stato Bell:

from qdk import stim

bell = """
H 0
CX 0 1
M 0 1
"""

results = stim.run(bell, shots=100, type="stabilizer")
print(results[:5])

Ogni elemento in results contiene i risultati della misurazione di un colpo. Un risultato standard è Result.Zero o Result.One. QDK QDK-Stim include Result.Loss anche per le misurazioni dei qubit persi.

Per i circuiti stabilizzatori standard Stim , iniziare con type="stabilizer". Per altre informazioni sui simulatori, vedere Panoramica dei simulatori quantistici nel QDK.

QDK funzionalità per Stim i circuiti

QDK estende il Stim set di istruzioni e lo connette a QIR e ai simulatori QDK. Queste aggiunte supportano i flussi di lavoro di simulazione non disponibili in Stim.

Stim Compila circuiti in QIR

Il QDK compila il Stim codice sorgente del circuito in QIR prima di eseguire il circuito. La stim.run funzione esegue entrambi i passaggi in una sola chiamata. Usare stim.compile quando si vuole ispezionare il QIR generato o eseguirlo in un altro simulatore o servizio.

La stim.compile funzione restituisce il QIR codice sorgente e il QDKNoiseConfig necessario al simulatore. Nell'esempio seguente viene compilato un circuito a stato Bell e viene stampato :QIR

from qdk import stim

bell = """
H 0
CX 0 1
M 0 1
"""

qir, noise = stim.compile(bell)
print(qir)

Aggiungere rumore ai Stim circuiti

È possibile aggiungere rumore a un circuito Stim con istruzioni di rumore Stim o con un QDKNoiseConfig. Scegliere il metodo che meglio corrisponde alla modalità di definizione del circuito e del modello di rumore:

Metodo di rumore Come usarlo Usa quando
Stim istruzioni sul rumore Aggiungere istruzioni come X_ERROR, DEPOLARIZE1e CORRELATED_ERROR al Stim codice. Il rumore fa parte della definizione del Stim circuito.
QDK modello di rumore Definire un NoiseConfig e passarlo con l'argomento noise. Si vuole applicare un modello di rumore esistente QDK a un Stim circuito che non contiene istruzioni per il rumore.

L'oggetto NoiseConfig restituito da stim.compile rappresenta le istruzioni di rumore nel Stim circuito. Non è un modello di rumore separato.

Caution

Scegliere un metodo di riduzione del rumore. Usare istruzioni per il rumore o un QDKNoiseConfig. Se si usano entrambi, il simulatore applica entrambi i modelli di rumore.

L'esempio seguente definisce un circuito Stim con rumore depolarizzante:

from qdk import stim

noisy_bell = """
H 0
CX 0 1
DEPOLARIZE2(0.01) 0 1
M 0 1
"""

results = stim.run(noisy_bell, shots=1000, type="stabilizer")

Per altre informazioni, vedere Come creare modelli di disturbo per le simulazioni quantistiche nel simulatore QDK.

Perdita di qubit del modello

Il QDK aggiunge istruzioni e destinazioni di perdita al formato di circuito Stim. La misurazione di un qubit perso restituisce Result.Loss anziché Result.Zero o Result.One.

Costruire Syntax Behavior
Errore di perdita dati LOSS_ERROR(p) 0 1 Perde in modo indipendente ogni target con probabilità p.
Obiettivo di perdita correlata L0 Rappresenta la perdita di un qubit in un evento CORRELATED_ERROR o ELSE_CORRELATED_ERROR.
Verifica della perdita PEEK_LOSS 0 1 Aggiunge 1 per un qubit perso e 0 per un qubit presente senza misurare o reimpostarlo.

L'esempio seguente applica la perdita indipendente a due qubit, controlla lo stato di perdita e quindi li misura:

from qdk import Result, stim

loss_program = """
H 0
LOSS_ERROR(0.2) 0 1
PEEK_LOSS 0 1
M 0 1
"""

results = stim.run(loss_program, shots=100, type="stabilizer")

symbols = {
    Result.Zero: "0",
    Result.One: "1",
    Result.Loss: "L",
}

formatted = ["".join(symbols[value] for value in shot) for shot in results[:10]]

print(formatted)

Ogni scatto formattato contiene quattro caratteri. I primi due caratteri sono i valori PEEK_LOSS e gli ultimi due sono i risultati della misurazione. Un finale L indica che il qubit corrispondente è stato perso.

Usare i target L per combinare la perdita e gli errori Pauli in un unico evento correlato:

CORRELATED_ERROR(0.1) L0 X1
ELSE_CORRELATED_ERROR(0.1) L1

Note

In CORRELATED_ERRORQDK, QDK-Stim e ELSE_CORRELATED_ERROR devono venire uno immediatamente dopo l'altro. In Stim, non è detto che debbano farlo.

Risultati della misurazione post-selezione

QDK aggiunge SELECT blocchi per i modelli di post-selezione e ripetizione fino al successo in base alle misurazioni della parità e ai controlli di qubit-loss. Se una condizione in un blocco SELECT ha esito negativo, il simulatore riesegue quel blocco fino al superamento di tutte le sue condizioni. Un blocco annidato viene riavviato indipendentemente dal blocco contenitore.

Costruire Syntax Behavior
Blocco di selezione SELECT { ... } Esegue nuovamente il corpo del blocco fino a quando non sono soddisfatte tutte le condizioni di selezione.
Condizione di parità REQUIRE rec[-1] Richiede che i record di misurazione a cui si fa riferimento abbiano parità pari. Anche un record mancante non soddisfa la condizione.
Record inverso REQUIRE !rec[-1] Inverte un record prima del controllo della parità. Con un record, viene mantenuto il risultato della misurazione 1.
Condizione solo perdita NOTLEAKED rec[-1] Richiede che le misurazioni a cui si fa riferimento non siano con perdita, ma non vincola i valori di bit.

Elencare più rec[...] destinazioni in un'unica REQUIRE istruzione per selezionare la parità condivisa. Il programma seguente mantiene solo i risultati validi con parità pari, quindi le misurazioni finali sono 00 o 11:

from qdk import stim

post_selected = """
SELECT {
    H 0
    H 1
    LOSS_ERROR(0.1) 0 1
    M 0 1
    REQUIRE rec[-1] rec[-2]
}
"""

results = stim.run(post_selected, shots=1000, type="stabilizer")

Usare NOTLEAKED quando 0 e 1 sono risultati validi, ma si vogliono rimuovere le misurazioni dei qubit persi:

SELECT {
    H 0
    LOSS_ERROR(0.2) 0
    M 0
    NOTLEAKED rec[-1]
}

Ogni condizione deve fare riferimento ad almeno un record prodotto dal blocco corrente SELECT o da un blocco annidato. Il compilatore rifiuta una condizione se una riesecuzione del blocco non può modificare alcun record a cui si fa riferimento.

Simula operazioni non-Clifford

Stim si concentra sui circuiti stabilizzatori e non supporta operazioni non-Clifford come le porte T e Toffoli. QDK QDK-Stim aggiunge operazioni simili a quelle supportate da Clifft, un simulatore per circuiti near-Clifford.

Categoria Istruzioni Raggruppamento di destinazione
Gate di fase T, T_DAG Un qubit per bersaglio
Pauli-gate di fase del prodotto TPP, TPP_DAG Un Pauli prodotto per gruppo target
Varchi controllati CH Coppie consecutive
Cancelli controllati CCX, CCZ Terne consecutive
Rotazioni di qubit singolo R_X(a), R_Y(a), R_Z(a) Un qubit per bersaglio
Porte generali a singolo qubit U3(t, p, l), U(t, p, l) Un qubit per bersaglio
Rotazioni di due qubit R_XX(a), R_YY(a), R_ZZ(a) Coppie consecutive
Pauli-rotazioni dei prodotti R_PAULI(a) Un Pauli prodotto per gruppo di destinazione

Per impostazione predefinita, gli argomenti di rotazione usano mezzi giri. Ad esempio, R_X(0.5) ruota di $\pi/2$ radianti. Aggiungere il rad suffisso per specificare direttamente radianti, ad esempio R_X(0.5rad). È possibile usare U3 o U per combinare le unità di angolo perché entrambe sono le stesse.

Il circuito seguente usa un cancello Toffoli e una rotazione Y arbitraria:

from qdk import stim

near_clifford = """
X 0 1
CCX 0 1 2
R_Y(0.25) 3
M 0 1 2 3
"""

results = stim.run(near_clifford, shots=1000, type="stabilizer")

Il simulatore dello stabilizzatore QDK dirama la scomposizione dello stabilizzatore quando rileva un'operazione non-Clifford. Questo approccio rimane efficiente quando le operazioni non-Clifford sono rare, ma lo spazio di stato richiesto aumenta in modo esponenziale con il numero di operazioni non-Clifford. Usare type="cpu" o type="gpu" per circuiti che contengono molte operazioni non-Clifford.

Per le definizioni complete dei gate non-Clifford, vedere le Clifft informazioni di riferimento sui gate supportati.

Limitazioni correnti

QDK Supporta la maggior parte delle istruzioni nel Stim riferimento di gate, con le limitazioni seguenti. Per lo stato di implementazione corrente, vedere il QDKQDK-Stim issue di monitoraggio delle funzionalità mancanti.

Funzionalità di Stim Comportamento corrente QDK
DETECTOR e OBSERVABLE_INCLUDE Analizzato e ignorato. Il QDK non fornisce detector o campionamento osservabile.
HERALDED_ERASE e HERALDED_PAULI_CHANNEL_1 La compilazione non riesce perché QDK non supporta queste istruzioni.
MPAD La compilazione non riesce perché QDK non supporta queste istruzioni.
Target sweep-bit, ad esempio CX sweep[5] 7 La compilazione non riesce perché il/la QDK non supporta le destinazioni sweep-bit.
Pauli prodotti che si riducono all'identità, ad esempio MPP Z0*Z0 La compilazione non riesce perché QDK non supporta la destinazione di identità risultante.

Usare Stim quando sono necessari modelli di errore di rilevamento, campionatori compilati Stim , Sinter o altre StimPython API. Usare qdk.stim quando si vuole compilare il codice Stim in QIR ed eseguire il QIR sui simulatori QDK, oppure usare la QDK perdita, la post-selezione e le estensioni non-Clifford.