Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

Швидкий старт


title: Швидкий старт description: Посібник зі швидкого старту для addon Qiskit Shaded lightcones (qiskit-addon-slc)​

Цей посібник демонструє мінімальний робочий приклад пакета qiskit-addon-slc. Він обчислює затінений світловий конус, щоб зменшити вартість вибірки ймовірнісного скасування помилок (PEC).

PEC пом'якшує шум вентилів, відбираючи зразки з квазіймовірнісного розкладу оберненого шумового каналу. Вартість його вибірки зростає з кожним членом помилки, який потрібно пом'якшити; проте не кожна помилка впливає на спостережувану однаково. Помилка поза причинним світловим конусом спостережуваної не може вплинути на виміряне очікуване значення, а навіть усередині конуса одні помилки шкодять більше за інші. Затінений світловий конус кількісно оцінює це, обмежуючи вплив кожного члена помилки Паулі на спостережувану. Відсікання членів помилок із найменшим впливом зменшує шумову модель, яку PEC має пом'якшувати, знижуючи вартість вибірки в обмін на невелике обмежене зміщення.

Щоб побачити, як побудувати реалістичний робочий процес і запустити його на квантовому обладнанні, ознайомся з навчальним матеріалом Probabilistic error cancellation with shaded lightcones на IBM Quantum Platform.

1. Підготуй вхідні дані для SLC​

Спочатку побудуй 10-кубітну схему трансверсального поля Ізінга з тротеризацією та вибери однокубітну спостережувану ZZ на середньому кубіті.

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

_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_slc": "qiskit-addon-slc", "samplomatic": "samplomatic"}
_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 Pauli

def trotter_ising_circuit(num_qubits, num_steps, rx_angle, rzz_angle):
"""Trotterized transverse-field Ising evolution on a 1D chain."""
circuit = QuantumCircuit(num_qubits)
for _ in range(num_steps):
circuit.rx(rx_angle, range(num_qubits))
circuit.barrier()
for start in (0, 1): # even then odd bonds
for i in range(start, num_qubits - 1, 2):
circuit.rzz(rzz_angle, i, i + 1)
circuit.barrier()
return circuit

num_qubits = 10
circuit = trotter_ising_circuit(
num_qubits, num_steps=4, rx_angle=np.pi / 16, rzz_angle=-np.pi / 3
)

# Measure <Z> on the middle qubit
observable = Pauli("I" * num_qubits).compose("Z", [num_qubits // 2])

print(f"Observable: {observable}")
circuit.draw("mpl", fold=-1, scale=0.7)
Observable: IIIIZIIIII

Output of the previous code cell

SLC працює з шумовими шарами двокубітних вентилів схеми. Тут ми використовуємо samplomatic, щоб згрупувати вентилі в анотовані блоки та прикріпити анотацію ін'єкції шуму до кожного двокубітного шару. SLC вимагає, щоб кожен шумовий блок мав унікальний modifier_ref, який забезпечує inject_noise_strategy="individual_modification"; зі стратегією samplomatic за замовчуванням межі виходять неправильними або їх обчислення ніколи не завершується. Потім generate_noise_model_paulis перелічує члени помилок Паулі кожного унікального шумового шару.

from qiskit_addon_slc.utils import generate_noise_model_paulis
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic.utils import find_unique_box_instructions

# Group gates into boxes and annotate each two-qubit layer with a noise-injection point
boxing_pass = generate_boxing_pass_manager(
inject_noise_targets="all",
inject_noise_strategy="individual_modification", # required: one modifier_ref per box
inject_noise_site="after",
twirling_strategy="active",
remove_barriers="never",
)
boxed_circuit = boxing_pass.run(circuit)

# Enumerate the 1- and 2-weight Pauli error terms of each unique noisy layer
noise_model_paulis = generate_noise_model_paulis(
find_unique_box_instructions(boxed_circuit)
)

num_terms = sum(len(paulis) for paulis in noise_model_paulis.values())
print(f"Noisy layers: {len(noise_model_paulis)}")
print(f"Pauli error terms across all layers: {num_terms}")
Noisy layers: 2
Pauli error terms across all layers: 198

2. Обчисли затінений світловий конус​

Затінений світловий конус збирається шляхом призначення масштабу кожному члену помилки Паулі в шумовій моделі залежно від того, наскільки він впливає на очікуване значення спостережуваної. Ці масштаби виводяться з прямих і зворотних меж помилки кожного члена (описаних нижче), а також з її швидкості помилки:

  • compute_forward_bounds еволюціонує кожен член помилки вперед до кінця схеми, щоб обмежити його вплив на спостережувану, виміряну там.

  • compute_backward_bounds еволюціонує кожен член помилки назад до початку схеми, щоб обмежити його вплив на початковий стан.

merge_bounds поєднує обидві межі в одну межу на член помилки. Кожна межа масштабується швидкістю помилки члена. Ці швидкості зазвичай походять з експерименту з навчання шуму (наприклад, NoiseLearnerV3); для простоти цей посібник використовує випадкові швидкості.

from qiskit.quantum_info import PauliLindbladMap, QubitSparsePauliList
from qiskit_addon_slc.bounds import (
compute_backward_bounds,
compute_forward_bounds,
merge_bounds,
)

forward_bounds = compute_forward_bounds(
boxed_circuit, noise_model_paulis, observable
)
backward_bounds = compute_backward_bounds(boxed_circuit, noise_model_paulis)

# Stand-in for rates that would be measured by a noise-learning experiment on hardware
rng = np.random.default_rng(42)
noise_rates = {
layer_id: PauliLindbladMap.from_components(
rng.random(len(paulis)) * 5e-3,
QubitSparsePauliList.from_sparse_list(
paulis.to_sparse_list(), paulis.num_qubits
),
)
for layer_id, paulis in noise_model_paulis.items()
}

merged_bounds = merge_bounds(
boxed_circuit, forward_bounds, backward_bounds, noise_rates
)
Optimal spacetime partitioning not implemented!Just partitioning list of noisy boxes.

У візуалізації затіненого світлового конуса нижче кожен блок затінений залежно від того, наскільки сильно помилки на цій ділянці можуть впливати на спостережувану. Яскраві блоки мають найбільші межі, а блоки, що зливаються з тлом, містять члени помилок, які мало впливають на обчислення — ці помилки є природними кандидатами на видалення з шумової моделі. Значення у візуалізації нижче є сумами меж усіх помилок Паулі на цій ділянці, через що деякі значення зростають понад 2.0 — межу для будь-якої окремої помилки Паулі.

from qiskit_addon_slc.visualization import draw_shaded_lightcone

draw_shaded_lightcone(
boxed_circuit, merged_bounds, noise_model_paulis, fold=-1, scale=0.5
)

Output of the previous code cell

3. Зменш вартість вибірки​

compute_local_scales перетворює затінений світловий конус на конкретну конфігурацію PEC. Вона пріоритизує члени помилок за їхнім обмеженим впливом на спостережувану та відсікає найменш впливові, доки не буде досягнуто заданого bias_tolerance. Вона повертає масштаби для кожного члена помилки: 0.0 для членів, які слід ігнорувати під час пом'якшення, і -1.0 для членів, які слід пом'якшувати. Функція також повертає отриману накладну вартість вибірки (γ2\gamma^2) і межу залишкового зміщення, спричиненого відсіканням.

Встановлення bias_tolerance=0.0 пом'якшує кожен член помилки в причинному світловому конусі спостережуваної та дає базову вартість вибірки. Допуск невеликого зміщення дозволяє SLC відкинути малоімпактні члени й ще більше знизити цю вартість.

from qiskit_addon_slc.bounds import compute_local_scales

_, full_cost, full_bias = compute_local_scales(
boxed_circuit, merged_bounds, noise_rates, bias_tolerance=0.0
)
local_scales, reduced_cost, reduced_bias = compute_local_scales(
boxed_circuit, merged_bounds, noise_rates, bias_tolerance=0.05
)

print(
f"Full PEC (bias_tolerance=0.0) : sampling cost {full_cost:6.3f}, residual bias {full_bias:5.3f}"
)
print(
f"Shaded (bias_tolerance=0.05): sampling cost {reduced_cost:6.3f}, residual bias {reduced_bias:5.3f}"
)
print(
f"\nSampling-cost reduction: {(1 - reduced_cost / full_cost):.0%} for <= 0.05 bias"
)
Full PEC (bias_tolerance=0.0) : sampling cost 21.206, residual bias 0.000
Shaded (bias_tolerance=0.05): sampling cost 5.403, residual bias 0.049

Sampling-cost reduction: 75% for <= 0.05 bias