Erstellen Sie Rauschmodelle für Quantensimulationen im 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 Ausführen von Quantensimulationen mit dem QDKPython Paket.

Arten von Rauschen

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

Rauschquelle Rauschmodellparameter Quellbeschreibung
$X$-Gatter x Einzel-Qubit-Pauli-Gatter, Bit-Flip
$Y$-Gatter y Single-Qubit-Gate Pauli , Bit-Flip und Phasen-Flip
$Z$-Gatter z Einzel-Qubit-Pauli-Gatter, Phasen-Flip
$H$-Gatter h Single-qubit gate Hadamard, erstellt einen gleichgewichteten Superpositionszustand
$S$-Gatter s Single-Qubit-Gate, Halb-Pi-Phasenverschiebung
$S^\dagger$-Gatter s_adj Einzel-Qubit-Gatter, Adjunkt von $S$
$T$-Gatter t Single-Qubit-Gate, Viertel-Pi-Phasenverschiebung
$T^\dagger$-Gatter t_adj Einzel-Qubit-Gatter, Adjunkt von $T$
$S_X$ Gate sx Single-Qubit-Gate, halber Bit-Flip-Drehung
$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. In dieser Tabelle sind die Rauschtypparameter aufgeführt, die Sie mit NoiseConfig festlegen können. Es enthält außerdem einen Parameter 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. Beispielsweise bedeutet noise.z.x, dass das Programm das beabsichtigte Z -Gatter auf das Qubit anwendet und anschließend ein unbeabsichtigtes X -Gatter 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ätezielprofil QIR 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];
    t 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.t.z = 0.01
    noise.cx.zi = 0.02
    

    Dieser Code erzeugt dieses Rauschmodell, wobei die Rauschrate die Wahrscheinlichkeit ist, dass die Quelle die entsprechende Art von Rauschen erzeugt.

    Rauschquelle Rauschtyp Rauschrate
    $T$-Gatter Phasendrehung 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. Dieser Code simuliert 1.000 Schüsse im Stabilisierungssimulator. Das $T$-Gate verursacht eine Verzweigung des Stabilisators, und der konfigurierte $Z$-Fehler wird nach dem $T$-Gate abgesampt.

    results = run_qir(qir, shots=1000, noise=noise, type="stabilizer")
    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="stabilizer")
    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. Dieser Code legt beispielsweise eine 1% Chance fest, dass ein Bit flip auftritt, und eine 3% Chance, dass ein Phasenflip nach einem Hadamard Gate 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-Gatter entweder X -Rauschen oder Z -Rauschen aufweisen, jedoch nicht beides.

Funktionen des Rauschmodells

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

Rauschen Pauli festlegen

Um Rauschen in Ihr Modell einzuschließen Pauli , rufen Sie die set_pauli_noise Funktion auf einem Gate- oder Bewegungsvorgang auf.

Übergeben Sie bei Einzel-Qubit-Vorgängen eine Zeichenfolge mit einem Zeichen Pauli und eine Rauschrate. Dieser 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)

Übergeben Sie bei Zwei-Qubit-Vorgängen eine Pauli Zeichenfolge mit zwei Zeichen und eine Rauschrate. Das erste Zeichen der Pauli Zeichenfolge entspricht Rauschen auf dem Steuer-Qubit, und das zweite Zeichen entspricht Rauschen auf dem Ziel-Qubit. Dieser Code legt beispielsweise 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 Raten für alle drei Arten von Pauli Rauschen fest. Dieser Code legt z. B. eine 3% Chance fest, dass Pauli Rauschen nach einem $H$-Vorgang auftritt, gleichmäßig verteilt als 1% Chance für jeden der drei Pauli Rauschtypen.

# 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. Dieser Code legt beispielsweise eine 1% Chance fest, dass ein Bit-Flip nach einem $R_Z$-Vorgang 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. Dieser Code legt z. B. eine 1% Chance fest, dass eine Phasendrehung nach einem $R_Y$-Vorgang auftritt.

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