انتقل إلى المحتوى الرئيسي
هذا المشروع في مرحلة تجريبية. وجدت خطأ؟ افتح مشكلة على GitHub. لديك سؤال أو فكرة؟ اسأل في Discussions — نحب سماع ملاحظاتك!
كيف جودة الترجمة في هذه الصفحة؟

البداية السريعة


title: البدء السريع description: دليل بدء سريع لإضافة Qiskit المسماة Shaded lightcones (qiskit-addon-slc)​

يعرض هذا الدليل مثالاً عملياً بسيطاً للحزمة qiskit-addon-slc. يحسب مخروط ضوء مظلَّلاً لتقليل تكلفة أخذ العيّنات في إلغاء الأخطاء الاحتمالي (PEC).

تخفف PEC من ضوضاء البوابات بأخذ عيّنات من تفكيك شبه احتمالي لقناة الضوضاء المعكوسة. تزداد تكلفة أخذ العيّنات فيها مع كل حد خطأ يجب تخفيفه؛ لكن ليست كل الأخطاء تؤثر في المرصود بالقدر نفسه. فالخطأ الواقع خارج مخروط الضوء السببي للمرصود لا يمكنه التأثير في القيمة المتوقعة المقيسة، وحتى داخل مخروط الضوء، بعض الأخطاء أشد ضرراً من غيرها. يقيس مخروط الضوء المظلَّل ذلك عبر وضع حد لتأثير كل حد خطأ باولي في المرصود. يؤدي حذف حدود الخطأ الأقل تأثيراً إلى تصغير نموذج الضوضاء الذي يتعين على PEC تخفيفه، فتنخفض تكلفة أخذ العيّنات مقابل انحياز صغير محدود.

لمعرفة كيفية بناء سير عمل واقعي وتشغيله على عتاد كمّي، اطّلع على الدرس التعليمي إلغاء الأخطاء الاحتمالي مع مخاريط الضوء المظلَّلة على IBM Quantum Platform.

1. تجهيز المدخلات لـ SLC​

أولاً، ابنِ دارة Ising ذات الحقل المستعرض بتقسيم تروتر على 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