So erstellen Sie Rauschmodelle für Quantensimulationen in der QDK

Die Microsoft Quantum Development Kit (QDK) enthält eine Reihe von Quantensimulatoren, die modellieren, wie Ihr Programm auf einem Quantencomputer ausgeführt wird. Programme, die Sie auf einem Quantencomputer ausführen, enthalten immer eine bestimmte Art und ein bestimmtes Maß an Rauschen. Mit dem QDKPython Paket können Sie benutzerdefinierte Rauschmodelle erstellen, die in Ihren Simulationen über die NoiseConfig API verwendet werden.

Anweisungen zum Installieren und Verwenden der QDK Simulatoren finden Sie unter Installieren und Ausführen der QDK Quantensimulatoren.

Arten von Rauschen

Jede Operation oder Anweisung in einem Quantenprogramm kann Rauschen verursachen. In der folgenden Tabelle sind alle Vorgänge und Anweisungen aufgeführt, für die Sie Rauschen einstellen können.

Rauschquelle Rauschmodellparameter Quellbeschreibung
$X$-Gatter x Einzel-Qubit-Pauli-Gatter, Bit-Flip
$Y$-Gatter y Single-Qubit-Pauli-Gatter, Bit-Flip und Phasen-Flip
$Z$-Gatter z Einzel-Qubit-Pauli-Gatter, Phasenflip
$H$-Gatter h Single-Qubit-Hadamard-Gatter, erstellt den gleichen Superpositionszustand
$S$-Gatter s Einzel-Qubit-Gatter, π/2-Phasenflip
$S^\dagger$-Gatter s_adj Einzel-Qubit-Gatter, Adjunkt von $S$
$T$-Gatter t Einzel-Qubit-Gatter, Viertel-Pi-Phasen-Flip
$T^\dagger$-Gatter t_adj Einzel-Qubit-Gatter, Adjunkt von $T$
$S_X$ Gate sx Einzel-Qubit-Gate, Halbbit-Flip
$S_X^\dagger$-Gatter sx_adj Einzel-Qubit-Gatter, Adjunkt von $S_X$
$R_X$-Gatter rx Single-Qubit-Gate, allgemeine Phasendrehung um die $x$-Achse
$R_Y$-Gatter ry Einzel-Qubit-Gatter, allgemeine Phasendrehung um $y$-Achse
$R_Z$-Gate rz Einzel-Qubit-Gatter, allgemeine Phasendrehung um $z$-Achse
$CX$-Gatter cx Zwei-Qubit-Tor, kontrolliertes $X$-Gate
$CY$-Gatter cy Zwei-Qubit-Tor, kontrolliertes $Y$ Gate
$CZ$-Gate cz Zwei-Qubit-Gatter, kontrolliertes $Z$-Gatter
$R_{XX}$-Gatter rxx Zwei-Qubit-Gate, analog zu $R_X$
$R_{YY}$-Gatter ryy Zwei-Qubit-Tor, analog zu $R_Y$
$R_{ZZ}$-Gatter rzz Zwei-Qubit-Gate, analog zu $R_Z$
$SWAP$-Gatter swap Zwei-Qubit-Gatter, tauscht die Zustände der Qubits
$CCX$-Gatter ccx Drei-Qubit-Tor, Zwei-Qubit-kontrolliertes $X$-Gatter
Qubit-Bewegung mov Qubit-Bewegung zwischen Gerätezonen (für neutrale Atomgerätesimulation)
Qubit-Messung mz Einzel-Qubit-Messung in der Pauli-$Z$ Basis
Qubit-Messung und Zurücksetzen mresetz Single-Qubit-Messung und Zurücksetzen auf den Zustand 0

Mit NoiseConfig können Sie vier verschiedene Arten von Rauschen mit jeweils bestimmten Wahrscheinlichkeiten auf die vorangehenden Operationen anwenden. Die folgende Tabelle listet die Parameter für die Rauscharten auf, die Sie mit NoiseConfig festlegen können, einschließlich eines Parameters für kein Rauschen.

Rauschtyp Rauschmodellparameter Rauschbeschreibung Beispielverwendung Beispielbeschreibung
Pauli-$X$-Rauschen x Bit-Flip noise.z.x = 0.03 Bitfehler treten bei 3 % der $Z$-Operationen auf.
Pauli-$Y$-Rauschen y Bit-Flip und Phasen-Flip noise.sx.y = 0.01 Bit-Flip und Phasen-Flip treten in 1% der $S_X$-Operationen auf.
Pauli-$Z$-Rauschen z Phasendrehung noise.h.z = 0.02 Phasenflip tritt bei 2 % der $H$-Operationen auf.
Kein Rauschen i Identitätsvorgang, kein Effekt noise.cz.ix = 0.02 Ein Bit-Flip tritt nur auf dem Ziel-Qubit bei 2 % der $CZ$-Operationen auf.
Qubit-Verlust l Qubit geht vom Gerät verloren noise.mov.l = 0.03 Ein Qubit geht bei 3 % der Bewegungen zwischen den Gerätezonen in einem Neutralatom-Quantencomputer verloren

Das Rauschen tritt nach dem Quellenvorgang auf, nicht anstelle des Quellenvorgangs. Bedeutet beispielsweise, noise.z.x dass das Programm das beabsichtigte $Z$ Gate auf das Qubit anwendet und dann ein unbeabsichtigtes $X$ Gate auf das Qubit anwendet. Da das Rauschen nach der Quelle angewendet wird, können Sie ein Rauschen konfigurieren, das dieselbe Wirkung wie die Quelle hat. Beispielsweise wendet noise.x.x nach dem beabsichtigten Bit-Flip einen unbeabsichtigten Bit-Flip an.

Hinweis

Die neutralen Atomgerätesimulations-APIs unterstützen Rauschen aus einer begrenzten Anzahl von Quellen. Weitere Informationen finden Sie unter So erstellen Sie Rauschmodelle für Simulationen von Neutralatom-Geräten im QDK.

Erstellen eines Rauschmodells

Führen Sie die folgenden Schritte aus, um ein Rauschmodell für eine Simulation zu erstellen und die Auswirkungen dieses Rauschens auf die Ergebnisse Ihres Quantenprogramms anzuzeigen.

  1. VS CodeÖffnen Sie im Menü "Ansicht" das Menü "Ansicht", und wählen Sie "Befehlspalette" aus.

  2. Geben Sie "Erstellen: Neu" Jupyter Notebookein. Eine leere Jupyter Notebook Datei wird auf einer neuen Registerkarte geöffnet.

  3. Importieren Sie in der ersten Zelle des Notizbuchs die erforderlichen Python Objekte.

    from qdk import init, TargetProfile
    from qdk.openqasm import compile
    from qdk.simulation import NoiseConfig, run_qir
    from qdk.widgets import Histogram
    
  4. Legen Sie in einer neuen Zelle das Geräte-QIR-Zielprofil fest, und kompilieren Sie Ihren OpenQASM-Schaltkreis in QIR.

    init(target_profile=TargetProfile.Base)
    
    qasm_src = """
    include "stdgates.inc";
    qubit[2] qs;
    bit[2] r;
    
    h qs[0];
    cx qs[0], qs[1];
    r = measure qs;
    """
    
    qir = compile(qasm_src)
    
  5. Erstellen Sie ein NoiseConfig-Objekt, um Ihr Rauschmodell zu erstellen.

    noise = NoiseConfig()
    
    noise.h.x = 0.01
    noise.cx.zi = 0.02
    

    Dieser Code erzeugt das folgende Rauschmodell, wobei das Rauschverhältnis die Wahrscheinlichkeit ist, mit der die Quelle den entsprechenden Rauschtyp verursacht.

    Rauschquelle Rauschtyp Rauschrate
    $H$-Gatter Bit-Flip 1 %
    $CX$-Gatter Phasenumkehr am Steuerqubit 2%
  6. Führen Sie den Simulator mit dem Rauschmodell aus, und zeigen Sie ein Histogramm der Messergebnisse an. Führen Sie beispielsweise den folgenden Code aus, um 1.000 Aufnahmen Ihres Programms im Clifford-Simulator zu simulieren.

    results = run_qir(qir, shots=1000, noise=noise, type="clifford")
    Histogram(results, labels="kets")
    
  7. Um die lauten Ergebnisse mit einer rauschfreien Simulation zu vergleichen, führen Sie die Simulation erneut ohne Rauschmodell aus.

    results = run_qir(qir, shots=1000, type="clifford")
    Histogram(results, labels="kets")
    

Festlegen mehrerer Arten von Rauschen für dieselbe Quelle

Sie können verschiedene Arten von Rauschen auf derselben Quelle modellieren, mit unterschiedlichen Wahrscheinlichkeiten für jeden Rauschtyp. Zum Beispiel legt der folgende Code eine Wahrscheinlichkeit von 1 % fest, dass ein Bit-Flip auftritt, und eine Wahrscheinlichkeit von 3 %, dass nach einem Hadamard-Gate eine Phasen-Flip auftritt.

noise.h.x = 0.01
noise.h.z = 0.03

Wenn Sie mehrere Arten von Rauschen für denselben Vorgang konfigurieren, kann in Ihrem Programm auf jeden Vorgang nur eine Art von Rauschen angewendet werden. Beispielsweise kann jedes Hadamard-Tor entweder $X$ Lärm oder $Z$ Lärm aufweisen, aber nicht beides.

Funktionen des Rauschmodells

Anstelle von Rauschmodellparametern können Sie die folgenden Rauschfunktionen verwenden, um Ihr Rauschmodell zu erstellen.

Festlegen von Pauli-Rauschen

Um Pauli-Rauschen in Ihr Modell einzuschließen, rufen Sie die set_pauli_noise-Funktion für ein Gatter oder einen Umlagerungsvorgang auf.

Für Einzel-Qubit-Vorgänge übergeben Sie eine einstellige Pauli-Zeichenfolge und ein Rauschverhältnis. Der folgende Code legt beispielsweise eine 1% Chance fest, dass während der Qubit-Bewegung ein Bit flip auftritt.

# Equivalent to: noise.mov.x = 0.01
noise.mov.set_pauli_noise('X', 0.01)

Für Zwei-Qubit-Vorgänge übergeben Sie eine zweistellige Pauli-Zeichenfolge und ein Rauschverhältnis. Das erste Zeichen der Pauli-Zeichenfolge entspricht Rauschen auf dem Steuerqubit und das zweite Zeichen entspricht Rauschen auf dem Ziel-Qubit. Zum Beispiel legt der folgende Code korrelierte Phasenumkehrungen nach 1 % der $CX$-Operationen fest.

# Equivalent to: noise.cx.zz = 0.01
noise.cx.set_pauli_noise('ZZ', 0.01)

Depolarisierendes Rauschen festlegen

Die set_depolarizing Funktion legt gleiche, aber nicht korrelierte Rauschraten für alle drei Arten von Pauli-Rauschen fest. Der folgende Code legt beispielsweise eine Chance von 3 % dafür fest, dass nach einem $H$-Vorgang Pauli-Rauschen auftritt, gleichmäßig verteilt als Chance von 1 %für jede der drei Pauli-Rauscharten.

# Equivalent to:
#     noise.h.x = 0.01
#     noise.h.y = 0.01
#     noise.h.z = 0.01
noise.h.set_depolarizing(0.03)

Festlegen von Bit-Flip-Rauschen

Um das Rauschverhältnis für Bit-Flips festzulegen, wenden Sie die set_bitflip-Funktion auf einen Gatter- oder Umlagerungsvorgang an. Zum Beispiel legt der folgende Code eine Wahrscheinlichkeit von 1 % fest, dass nach einer $R_Z$-Operation ein Phasenflip auftritt.

# Equivalent to: noise.rz.x = 0.01
noise.rz.set_bitflip(0.01)

Festlegen von Phasen-Flip-Rauschen

Um in einem Vorgang das Rauschverhältnis für Phasen-Flips festzulegen, wenden Sie die set_phaseflip-Funktion auf einen Gatter- oder Umlagerungsvorgang an. Der folgende Code legt beispielsweise fest, dass nach einer $R_Y$-Operation mit einer Wahrscheinlichkeit von 1 % ein Phasenflip auftritt.

# Equivalent to: noise.ry.z = 0.01
noise.ry.set_phaseflip(0.01)