Skip to main content
IBM Quantum Platform

Démarrage rapide

qiskit-addon-pna Ce guide présente un exemple minimal fonctionnel du paquet. Nous utilisons l'absorption du bruit propagé (PNA) pour construire un observable permettant d'atténuer le bruit. Pour un circuit donné et un modèle de bruit de Pauli-Lindblad, la méthode PNA propage de manière classique l'observable à travers le canal de bruit inverse. La mesure de l'observable obtenue sur le QPU sujet au bruit permet d'atténuer le bruit des portes appris.

Pour découvrir comment mettre en place un workflow réaliste et l'exécuter sur du matériel quantique à l'aide du modèle d'exécution dirigée, y compris l'apprentissage du modèle de bruit avec NoiseLearnerV3, consultez le tutoriel PNA sur le site IBM Quantum Platform.


1. Préparer les données d'entrée pour le PNA

La PNA prend en entrée un circuit, un modèle de bruit et une grandeur observable. Nous construisons ici un modèle d'Ising à champ transversal « trotterisé » de 10 qubits sur une chaîne de type « 1D ». Nous générons un modèle de bruit aléatoire de Pauli-Lindblad à 2 locaux pour chaque porte d'intrication et l'intégrons sous la forme d'une instruction Qiskit Aer PauliLindbladError juste avant cette porte. Nous choisissons de mesurer une observable de Pauli-Z weight-4.

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. Générer l'observable permettant d'atténuer le bruit

La fonction « generate_noise_mitigating_observable » propage chaque générateur de Pauli du canal de bruit inverse vers l'avant, jusqu'à la fin du circuit. L'observable est ensuite soumise à une rétropropagation à travers le canal de bruit inverse, ce qui donne une nouvelle observable O~\tilde{O}. Trois paramètres clés influent sur le coût de calcul :

  • max_err_terms: le nombre de termes conservés dans chaque générateur anti-bruit au fur et à mesure de sa propagation vers l'avant.
  • max_obs_terms: le nombre de termes conservés dans « O~\tilde{O} ».
  • atol: les termes dont le coefficient est inférieur à ce seuil sont supprimés.

Pour ce petit circuit proche de Clifford, nous fixons des limites élevées pour les termes et utilisons une valeur modeste atolde, de sorte que O~\tilde{O} reste petit et que nous puissions mesurer tous ses termes.

Remarque : cette fonction utilise Python multiprocessing. Si vous l'exécutez sous forme de script, appelez-le à l'intérieur d'un if __name__ == "__main__": guard.

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. Réduire les erreurs de porte en mesurant l'observable de réduction du bruit

On constate ici que la nouvelle observable atténue efficacement le bruit de la porte qui affecte l'expérience.

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
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.