Skip to main content
IBM Quantum Platform

Schnellstart

Diese Anleitung zeigt ein minimales, funktionsfähiges Beispiel für das qiskit-addon-pna Paket. Wir verwenden die propagierte Schallabsorption (PNA), um eine lärmmindernde Beobachtable zu erstellen. Ausgehend von einer Schaltung und einem Pauli-Lindblad-Rauschmodell überträgt die PNA die Observable klassisch über den inversen Rauschkanal. Durch die Messung der resultierenden Observable auf der verrauschten QPU wird das gelernte Gatterrauschen gemildert.

Um zu erfahren, wie man einen realistischen Workflow aufbaut und diesen auf Quantenhardware mit dem „Directed Execution Model“ ausführt – einschließlich des Trainings des Rauschmodells mit NoiseLearnerV3–, sehen Sie sich das PNA-Tutorial auf der „ IBM Quantum Platform “ an.


1. Bereiten Sie die Eingaben für PNA vor

PNA nimmt als Eingabe eine Schaltung, ein Rauschmodell und eine Beobachtungsgröße entgegen. Hier bauen wir ein 10-Qubit-Trotter-Ising-Modell mit transversalen Feldern auf einer „ 1D “-Kette auf. Wir generieren für jedes Verschränkungsgatter ein zufälliges 2-lokales Pauli-Lindblad-Rauschmodell und binden es als Qiskit-Aer-Befehl PauliLindbladError unmittelbar vor diesem Gatter ein. Wir wählen eine weight-4 Pauli-Z-Beobachtungsgröße zur Messung aus.

import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp, pauli_basis
from qiskit_aer.noise import PauliLindbladError


def random_pauli_lindblad_noise(generators, seed, noise_scale=2e-3):
    rates = np.random.default_rng(seed).random(len(generators)) * noise_scale
    return PauliLindbladError(generators, rates)


def ising_circuit(
    num_qubits,
    layers,
    edge_noise=None,
    *,
    num_steps=3,
    rx_angle=np.pi / 8,
    rzz_angle=-np.pi / 2,
):
    """Trotterized transverse-field Ising model; edge_noise=None gives the noiseless circuit."""
    qc = QuantumCircuit(num_qubits)
    for _ in range(num_steps):
        qc.rx(rx_angle, range(num_qubits))
        for layer in layers:
            for edge in layer:
                if edge_noise is not None:
                    qc.append(
                        edge_noise[edge], edge
                    )  # inject synthetic gate noise
                qc.rzz(rzz_angle, *edge)
    return qc


num_qubits = 10

# Two entangling layers per Trotter step: even and odd bonds of a 1D chain
layers = [
    [(i, i + 1) for i in range(0, num_qubits - 1, 2)],
    [(i, i + 1) for i in range(1, num_qubits - 1, 2)],
]
edges = [edge for layer in layers for edge in layer]

# Random 2-local Pauli-Lindblad noise, one instance per entangling gate
two_qubit_paulis = SparsePauliOp(
    [p for p in pauli_basis(2) if np.sum(p.x + p.z)]
).paulis
edge_noise = {
    edge: random_pauli_lindblad_noise(two_qubit_paulis, seed=1234 + j)
    for j, edge in enumerate(edges)
}

noisy_circuit = ising_circuit(num_qubits, layers, edge_noise)

# A single weight-4 observable: <Z3 Z4 Z5 Z6>
observable = SparsePauliOp.from_sparse_list(
    [("ZZZZ", [3, 4, 5, 6], 1.0)], num_qubits=num_qubits
)

noisy_circuit.draw("mpl", fold=-1, scale=0.6)

Output:

Output of the previous code cell

2. Die rauschmindernde Observable generieren

„generate_noise_mitigating_observable“ leitet jeden Pauli-Generator des inversen Rauschkanals bis zum Ende der Schaltung weiter. Die Beobachtungsgröße wird dann durch den inversen Rauschkanal rückwärts propagiert, wodurch ein neuer Beobachtungswert O~\tilde{O} zurückgegeben wird. Drei Schlüsselparameter beeinflussen den Rechenaufwand:

  • max_err_terms: die Anzahl der Terme, die in jedem Anti-Rausch-Generator beibehalten werden, während die Berechnung vorwärts fortgesetzt wird.
  • max_obs_terms: die Anzahl der in „ O~\tilde{O} “ gespeicherten Begriffe.
  • atol: Terme, deren Koeffizient unter diesem Schwellenwert liegt, werden verworfen.

atolFür diesen kleinen, an Clifford-Schaltungen angelehnten Schaltkreis legen wir die Termbegrenzung hoch fest und verwenden einen bescheidenen Wert, sodass O~\tilde{O} klein bleibt und wir alle seine Terme messen können.

Hinweis: Diese Funktion verwendet Python multiprocessing. Wenn Sie es als Skript ausführen, rufen Sie es innerhalb eines if __name__ == "__main__": guard auf.

from qiskit_addon_pna import generate_noise_mitigating_observable

mitigating_observable = generate_noise_mitigating_observable(
    noisy_circuit,
    observable,
    max_err_terms=100_000,
    max_obs_terms=100_000,
    atol=1e-5,
    num_processes=4,
)

print(f"Original observable:         {len(observable)} term")
print(f"Noise-mitigating observable: {len(mitigating_observable)} terms")

Output:

Original observable:         1 term
Noise-mitigating observable: 207 terms

3. Gate-Fehler durch Messung der rauschmindernden Observable minimieren

Hier sehen wir, dass die neue Observable das das Experiment beeinträchtigende Gate-Rauschen wirksam mindert.

import matplotlib.pyplot as plt
from qiskit_aer.primitives import EstimatorV2

noiseless_circuit = ising_circuit(num_qubits, layers)

# density_matrix method at zero precision -> exact expectation values (no shot noise)
estimator = EstimatorV2(
    options={
        "backend_options": {"method": "density_matrix"},
        "default_precision": 0.0,
    }
)

ideal, noisy, mitigated = (
    result.data.evs
    for result in estimator.run(
        [
            (noiseless_circuit, observable),
            (noisy_circuit, observable),
            (noisy_circuit, mitigating_observable),
        ]
    ).result()
)

print(f"Ideal (noiseless):   {ideal:.4f}")
print(f"Noisy (unmitigated): {noisy:.4f}")
print(f"Mitigated (PNA):     {mitigated:.4f}")

fig, ax = plt.subplots()
ax.bar(
    ["Noisy", "Mitigated"],
    [noisy, mitigated],
    width=0.6,
    color=["#b0b0b0", "#4c4c4c"],
)
ax.axhline(ideal, color="green", linestyle="--", label="Ideal (noiseless)")
ax.set_ylabel(r"$\langle Z_3 Z_4 Z_5 Z_6 \rangle$")
ax.legend()
plt.show()

Output:

Ideal (noiseless):   0.8073
Noisy (unmitigated): 0.6431
Mitigated (PNA):     0.8071
Output of the previous code cell
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.