ข้ามไปยังเนื้อหาหลัก
โครงการนี้อยู่ในช่วงเบต้า พบข้อผิดพลาด? สร้าง GitHub Issue มีคำถามหรือไอเดีย? ถามใน Discussions — ยินดีรับฟังความคิดเห็น!
คุณภาพการแปลในหน้านี้เป็นอย่างไร?

เริ่มต้นอย่างรวดเร็ว

คู่มือนี้แสดงตัวอย่างขั้นต่ำที่ใช้งานได้จริงของแพ็กเกจ qiskit-addon-pna เราใช้ propagated noise absorption (PNA) เพื่อสร้าง observable ที่ลดสัญญาณรบกวน เมื่อมี circuit และ noise model แบบ Pauli-Lindblad แล้ว PNA จะส่ง observable ผ่าน inverse noise channel แบบคลาสสิก การวัด observable ที่ได้บน QPU ที่มีสัญญาณรบกวนจะลดสัญญาณรบกวนของ gate ที่เรียนรู้ไว้

หากต้องการดูวิธีสร้างเวิร์กโฟลว์ที่สมจริงและรันบนฮาร์ดแวร์ควอนตัมด้วยโมเดลการรันแบบกำกับ (directed execution model) รวมถึงการเรียนรู้ noise model ด้วย NoiseLearnerV3 ดูบทช่วยสอน PNA บน IBM Quantum Platform

1. เตรียมอินพุตสำหรับ PNA​

PNA รับ circuit, noise model และ observable เป็นอินพุต ในที่นี้เราสร้างแบบจำลอง Ising แบบ transverse-field ที่ทำ Trotter ขนาด 10 qubit บนห่วงโซ่ 1 มิติ เราสร้าง noise model แบบ Pauli-Lindblad 2-local แบบสุ่มสำหรับ entangling gate แต่ละตัว และฝังเป็นคำสั่ง PauliLindbladError ของ Qiskit Aer ก่อน gate นั้นพอดี เราเลือก observable Pauli-Z น้ำหนัก 4 เพื่อใช้วัด

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_pna": "qiskit-addon-pna", "qiskit_aer": "qiskit-aer"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 of the previous code cell

2. สร้าง observable ที่ลดสัญญาณรบกวน​

generate_noise_mitigating_observable ส่ง Pauli generator แต่ละตัวของ inverse noise channel ไปข้างหน้าจนถึงท้าย circuit จากนั้น observable จะถูกส่งย้อนกลับผ่าน inverse noise channel ได้ observable ใหม่ O~\tilde{O} พารามิเตอร์หลักสามตัวส่งผลต่อต้นทุนการคำนวณ:

  • max_err_terms: จำนวนพจน์ที่เก็บไว้ใน anti-noise generator แต่ละตัวขณะส่งไปข้างหน้า

  • max_obs_terms: จำนวนพจน์ที่เก็บไว้ใน O~\tilde{O}

  • atol: พจน์ที่มีขนาดสัมประสิทธิ์ต่ำกว่าเกณฑ์นี้จะถูกทิ้ง

สำหรับ circuit ขนาดเล็กที่ใกล้เคียง Clifford นี้ เราตั้งขีดจำกัดจำนวนพจน์ไว้สูงและใช้ atol ที่พอประมาณ เพื่อให้ O~\tilde{O} ยังมีขนาดเล็กและเราวัดได้ทุกพจน์

หมายเหตุ: ฟังก์ชันนี้ใช้ multiprocessing ของ Python เมื่อรันเป็นสคริปต์ ให้เรียกภายในการป้องกัน if __name__ == "__main__":

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")
Original observable: 1 term
Noise-mitigating observable: 207 terms

3. ลดข้อผิดพลาดของ gate โดยการวัด observable ที่ลดสัญญาณรบกวน​

ที่นี่เราจะเห็นว่า observable ใหม่ช่วยลดสัญญาณรบกวนของ gate ที่กระทบการทดลองได้อย่างมีประสิทธิภาพ

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()
Ideal (noiseless): 0.8073
Noisy (unmitigated): 0.6431
Mitigated (PNA): 0.8071

Output of the previous code cell