إلغاء الأخطاء الاحتمالي بمخاريط الضوء المظللة
الخلفية
يوضح هذا البرنامج التعليمي كيفية تخفيف الأخطاء باستخدام إضافة مخروط الضوء المظلل (SLC). هذه الإضافة هي تطور لـتقنية إلغاء الأخطاء الاحتمالي (PEC)، حيث يتعلم المستخدم ضوضاء الطبقات الفريدة في الدائرة ثم يلغي الضوضاء بتطبيق بوابات Qubit أحادية وتقنيات المعالجة اللاحقة. مقارنةً بالطرق الأخرى، يوفر PEC حدوداً أكثر صرامة على التحيز في النتيجة المخففة، غير أنه يعاني في الغالب من تكلفة أعلى من حيث وقت وحدة معالجة الكم (QPU). خلال PEC، ولتعويض تخفيف قيمة الأمل بسبب الضوضاء، يُعاد قياس المتوسط بضرب عامل ، حيث هو معدل الضوضاء المكتسب لخطأ Pauli في الطبقة من الدائرة. يزيد هذا إعادة القياس التباين بمقدار ، ومن ثم يضرب أيضاً عدد تنفيذات الدائرة المطلوبة على QPU في ، وهو ما نسميه تكلفة أخذ العينات أو العبء الإضافي لأخذ العينات. نظراً لأن يتنامى أسياً، فإن PEC غالباً ما يقتصر على الدوائر الضحلة أو قليلة Qubit. تعرف على المزيد حول PEC في إلغاء الأخطاء الاحتمالي بنماذج Pauli-Lindblad المتفرقة على المعالجات الكمية الصاخبة.
إذا أمكننا تحديد الأخطاء التي لا تحتاج إلى تخفيف، يمكننا تقليل تكلفة أخذ العينات هذه بشكل أسي. خطوة أولى في هذا الاتجاه هي تطبيق تخفيف الأخطاء الواعي محلياً، الذي يستخدم "مخروط ضوء" تقليدياً قابلاً للحساب بسرعة لتقليل عبء PEC الإضافي عن طريق تقييد حساسية العنصر القابل للرصد للأخطاء في جميع أنحاء الدائرة، مما يوسع جدوى PEC لمقاييس أكبر لبعض المسائل. لا يمكن للأخطاء خارج مخروط الضوء هذا أن تؤثر في النتيجة المقاسة، وبالتالي يمكن استبعادها من إجراء إلغاء الأخطاء. يقلل هذا الاستبعاد من العبء الإضافي لأخذ العينات، وأحياناً بشكل ملحوظ، دون إضافة تحيز إضافي. على وجه الخصوص، لقياس عنصر قابل للرصد محلي لدائرة ذات عمق ثابت، يستقر العبء الإضافي المطلوب لأخذ العينات في نهاية المطاف عند تغيير مقياس عدد Qubit في الدائرة (انظر الشكل 2b في الموضعية وتخفيف أخطاء الدوائر الكمية.)
تذهب مخاريط الضوء المظللة (SLC) أبعد من ذلك، مستخدمةً المحاكاة الكلاسيكية لتقييد حساسية الأخطاء في جميع أنحاء الدائرة بدقة أكبر. هذا يستبدل بعض وقت QPU بوقت CPU ويقلل العبء الإضافي لأخذ العينات المطلوب لإعادة تطبيع التحيز. بدلاً من حد صارم، يُخصص لكل خطأ محتمل في الدائرة "ظل" متدرج يقيد بالحد الأعلى قابلية تأثر العنصر القابل للرصد بذلك الخطأ. يتيح هذا التوصيف المُحسَّن تطبيقات PEC أكثر كفاءة وموجهة بتباين مخفض، مع منح المستخدم القدرة على ضبط التحيز في تقدير العنصر القابل للرصد بشكل متحكم به. انظر تظليل مخروط الضوء للتخفيف الكمي للأخطاء المعجَّل كلاسيكياً لمزيد من التفاصيل.
يستفيد سير عملنا لإضافة SLC من إطار عمل Samplomatic و Executor الجديد، مما يمنح المستخدمين تحكماً أكثر نمطية في إعدادات التنفيذ لقمع الأخطاء وتخفيفها مع الحفاظ على سهولة الاستخدام للمستخدمين المتقدمين. لفهم أعمق لفوائد هذا الإطار وميزاته العامة، ارجع إلى البرنامج التعليمي Hello samplomatic.
سير عمل تظليل مخروط الضوء وتعلم الضوضاء وحقن مضاد الضوضاء
لنمذجة ضوضاء QPU، اخترنا استخدام نموذج ضوضاء Pauli-Lindblad المتفرق بمعدلات خطأ Pauli أحادية وثنائية Qubit، يُولَّد محلياً على كل Qubit وحافة في الجهاز. بهذا الاختيار، يسير سير عمل تخفيف أخطاء SLC المقدَّم في هذا البرنامج التعليمي على النحو التالي:
a. CPU — تقييد تأثير الخطأ لكل خطأ من أخطاء Pauli أحادي وثنائي Qubit
- الانتشار للأمام (تقييد التأثير على العنصر القابل للرصد). انشر كل خطأ إلى نهاية الدائرة واحسب معامله مع العنصر القابل للرصد.
- اقتطع حدود المؤثر خلال التطور للحفاظ على قابلية الحساب.
- شد هذه الحدود بشكل أكبر عن طريق انتشار خلفي فضفاض للمتغير الملاحظ بناءً على حدود السرعة الكمية.
- الانتشار للخلف (تقييد التأثير على الحالة الأولية). انشر كل خطأ إلى بداية الدائرة واحسب معامله مع الحالة الأولية.
b. QPU — تعلم معدلات الضوضاء. استخدم NoiseLearner لتقدير معدلات نموذج ضوضاء Pauli-Lindblad.
c. CPU — ترتيب أولويات التخفيف
- تحديث الحدود المدمجة بمعدلات الضوضاء المكتسبة. ادمج الحدود الأمامية والخلفية المحسوبة مسبقاً وحدّثها بمعدلات الضوضاء المكتسبة.
- رتب مكونات الضوضاء للتخفيف باستخدام الحدود المحسوبة والمعدلات المكتسبة. ضع أولوية لكل خطأ ضوضاء محتمل بناءً على تأثيره المقدَّر على التحيز والتكلفة المرتبطة بالتصحيح.
d. QPU — أدرج مضاد الضوضاء ونفِّذ. نفِّذ الدائرة المطلوبة مع مضاد الضوضاء (الضوضاء العكسية) المحدد باستخدام تعليقات Box.
e. CPU — تقدير العنصر القابل للرصد. احسب قيمة الأمل، مطبقاً الانتقاء اللاحق للقياس لتقليل تأثير الضوضاء غير الماركوفية.
نظرة عامة على تعلم الضوضاء
تعلم الضوضاء خطوة شائعة في عدة طرق لتخفيف الأخطاء، تُنفَّذ بواسطة NoiseLearner، ويمكن مشاهدتها في برنامجنا التعليمي تخفيف أخطاء PEA، فضلاً عن البرنامج التعليمي لامتصاص الضوضاء المنتشرة (PNA). في NoiseLearnerV3، يمكن للمستخدم تحديد طبقات الضوضاء المراد تعلمها على وجه الخصوص كـكائنات CircuitInstruction، مما يتيح للمستخدمين حساب حدود ضوضاء SLC المطلوبة لكل طبقة بالأسلوب الموصوف أعلاه. يوفر نموذج Pauli-Lindblad المكتسب معاملات تُستخدم في ترتيب أولويات PEC-SLC. يمكن تحديد الطريقة التي تُجمَّع بها البوابات في طبقات باستخدام دالتَي الراحة generate_boxing_pass_manager وunique_2q_instructions، ثم تُغذَّى في دالة الأداة SLC generate_noise_model_paulis، كما هو موضح في الخطوة 2 أدناه.
| الجزء 1 | الجزء 2 | الجزء 3 |
|---|---|---|
| تلوية Pauli لطبقات البوابة ثنائية Qubit | تكرار أزواج متطابقة من الطبقات وتعلم الضوضاء | اشتقاق درجة أمانة (خطأ لكل قناة ضوضاء) |
![]() | ![]() |
نظرة عامة على المعالجة اللاحقة
بعد التنفيذ على الأجهزة الكمية باستخدام إطار عمل Samplomatic و Executor، نحول قياسات السلاسل البتية إلى قيمة العنصر القابل للرصد المطلوبة. في حالة دائرة Ising المعكوسة لدينا، سنحصل بشكل مثالي على عنصر قابل للرصد مقاس يساوي 1، إذ يجب أن تعود جميع Qubit مثالياً إلى نقطة بدايتها . عند حساب قيمة العنصر القابل للرصد بدالة expectation_values لدينا، سنطبق بعض تقن يات المعالجة اللاحقة التي تقلل تأثير الضوضاء. يشمل ذلك إزالة اللقطات المتأثرة بالضوضاء غير الماركوفية، وتخفيف أخطاء القراءة، فضلاً عن مراعاة تفاصيل تطبيق PEC لدينا. تناقش التفاصيل في الخطوة 4 أدناه.
المتطلبات
قبل البدء في هذا البرنامج التعليمي، تأكد من تثبيت الحزم التالية:
- Qiskit IBM Runtime مع الأساسي Executor (
pip install "qiskit-ibm-runtime @ git+https://github.com/Qiskit/qiskit-ibm-runtime.git") - إضافة Qiskit لمخروط الضوء المظلل 0.1 (
pip install "qiskit-addon-slc~=0.1.0") - أدوات إضافة Qiskit (
pip install "qiskit-addon-utils~=0.3.0") - Samplomatic الإصدار 0.16 أو أحدث (
pip install samplomatic) - دعم تصور Qiskit (
pip install "qiskit[visualization]")
الخطوة 0. الإعداد
أولاً، استورد الحزم والدوال اللازمة لتشغيل هذا الدفتر بنجاح.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-addon-slc qiskit-addon-utils qiskit-ibm-runtime samplomatic
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(module)s %(message)s")
# Setting this value prevents itertools.starmap deadlock on UNIX systems
from multiprocessing import set_start_method
set_start_method("spawn")
# Needed to prevent PySCF from parallelizing internally (SLC only)
%set_env OMP_NUM_THREADS=1
env: OMP_NUM_THREADS=1
import pickle
import numpy as np
import samplomatic
from matplotlib import pyplot as plt
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import PassManager, generate_preset_pass_manager
from qiskit_addon_slc.bounds import (
compute_backward_bounds,
compute_forward_bounds,
compute_local_scales,
merge_bounds,
tighten_with_speed_limit,
)
from qiskit_addon_slc.utils import generate_noise_model_paulis, map_modifier_ref_to_ref
from qiskit_addon_slc.visualization import draw_shaded_lightcone
from qiskit_addon_utils.exp_vals.expectation_values import executor_expectation_values
from qiskit_addon_utils.exp_vals.measurement_bases import get_measurement_bases
from qiskit_addon_utils.noise_management import gamma_from_noisy_boxes, trex_factors
from qiskit_addon_utils.noise_management.post_selection import PostSelector
from qiskit_addon_utils.noise_management.post_selection.transpiler.passes import (
AddPostSelectionMeasures,
AddSpectatorMeasures,
)
from qiskit_ibm_runtime import Executor, QiskitRuntimeService, QuantumProgram
from qiskit_ibm_runtime.noise_learner_v3 import NoiseLearnerV3
from qiskit_ibm_runtime.options import NoiseLearnerV3Options
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic.utils import find_unique_box_instructions
الخطوة 1. تعيين المسألة
لتسهيل العرض، نختار سلسلة Ising مرآتية أحادية البعد. تمنح سلسلة Ising أحادية البعد بنية دائرة كثيفة بشكل لطيف، مما يُعدّ مناسباً لعرض تطبيقات PEC. تجعل الدائرة المرآتية من السهل معرفة النتيجة المتوقعة (أي يجب أن نقيس متغيراً ملاحظاً يساوي 1).
علاوة على ذلك، نريد تشغيل دائرة مرآتية، لذا لكل بوابة في النصف الثاني من الدائرة يجب أن تكون هناك بوابة عكسية في النصف الأول. بما أن العنصر القابل للرصد المقاس يحتوي على قياسات غير Z-أساسية، والمنفِّذ يراعي الأساس المطلوب في نهاية الدائرة، نوفر دالة prepare_basis تدرج البوابات المناسبة في بداية الدائرة المرآتية. هذه التفصيلة خاصة بعرض الدائرة المرآتية لدينا. تتيح لنا دالة get_measurement_bases تح ديد البوابات المطلوبة ومكان إلحاقها بسهولة، فضلاً عن متابعة الدقائق الخاصة بفهرسة Qubit الناشئة عن الاصطلاحات في تعليق box كما نوقش في قسم "تحضير قياسات الأساسيات القانونية".
num_qubits = 20
target_obs_sparse = [("XZ", [6, 13], 1.0)]
observable = SparsePauliOp.from_sparse_list(target_obs_sparse, num_qubits=num_qubits)
bases_virt, reverser_virt = get_measurement_bases(observable)
num_trotter_steps = 10
rx_angle = np.pi / 4
def construct_ising_circuit(
num_qubits: int, num_trotter_steps: int, rx_angle: float, barrier: bool = True
) -> QuantumCircuit:
circuit = QuantumCircuit(num_qubits)
for _step in range(num_trotter_steps):
circuit.rx(rx_angle, range(num_qubits))
if barrier:
circuit.barrier()
for first_qubit in (1, 2):
for idx in range(first_qubit, num_qubits, 2):
# equivalent to Rzz(-pi/2):
circuit.sdg([idx - 1, idx])
circuit.cz(idx - 1, idx)
if barrier:
circuit.barrier()
return circuit
def prepare_basis(circuit: QuantumCircuit, basis: list[int]) -> QuantumCircuit:
# basis is a list of integer values from 0 to 3. These map to the basis measurement as:
# 0 = I; 1 = Z; 2 = X; 3 = Y
assert len(basis) == circuit.num_qubits
out_circ = circuit.copy_empty_like()
for qb, bas in enumerate(basis):
if bas in {0, 1}:
continue
if bas == 2:
out_circ.h(qb)
elif bas == 3:
out_circ.rx(-np.pi / 2, qb)
out_circ.barrier()
out_circ.compose(circuit, inplace=True)
return out_circ
def mirror_circuit(circuit: QuantumCircuit, *, inverse_first: bool = False) -> QuantumCircuit:
mirror_circ = circuit.copy_empty_like()
mirror_circ.compose(circuit.inverse() if inverse_first else circuit, inplace=True)
mirror_circ.barrier()
mirror_circ.compose(circuit if inverse_first else circuit.inverse(), inplace=True)
mirror_circ.measure_active()
return mirror_circ
# Instantiate circuit
circuit = construct_ising_circuit(num_qubits, num_trotter_steps, rx_angle, barrier=False)
mirrored_circuit = mirror_circuit(circuit, inverse_first=True)
mirrored_circuit = prepare_basis(mirrored_circuit, bases_virt[0])
mirrored_circuit.draw("mpl", fold=-1, scale=0.3, idle_wires=False, measure_arrows=False)

الخطوة 2. التحسين
سنقوم بتحسين التفاصيل المتعلقة بالدائرة المراد تشغيلها، والمقدار الكمي المراد قياسه، ومعاملات تعلم الضوضاء. كنقطة انطلاق، نتأكد من إنشاء Backend مع تفعيل البوابات الكسرية كخيار. ستتيح هذه البوابات الكسرية حساسية أكبر في بعض عمليات تصفية ما بعد الاختيار.
token = "<YOUR_TOKEN>"
instance = "<YOUR_INSTANCE>"
# This is used to retrieve shared results
shared_service = QiskitRuntimeService(
channel="ibm_quantum_platform",
token=token,
instance=instance,
)
# This is used to run on real hardware
service = service = QiskitRuntimeService()
qiskit_runtime_service._discover_account:WARNING:2025-11-10 11:19:40,108: Loading account with the given token. A saved account will not be used.
backend = service.backend("ibm_kingston", use_fractional_gates=True)
أولاً، سنقوم بترجمة دائرتنا إلى تعليمات ISA، كما هو مطلوب للتنفيذ على وحدات معالجة الكم (QPUs) لدينا. بالنسبة للبيانات المجمَّعة في هذه التجربة، نختار يدوياً الـ Qubits الخاصة بنا بناءً على تقييم سلسلة الجودة الأعلى.
layout = [44, 45, 46, 47, 57, 67, 68, 69, 78, 89, 88, 87, 97, 107, 106, 105, 104, 103, 96, 83]
isa_pm = generate_preset_pass_manager(backend=backend, initial_layout=layout, optimization_level=0)
isa_circuit = isa_pm.run(mirrored_circuit)
assert isa_circuit.layout.final_index_layout() == layout
isa_observable = observable.apply_layout(layout, num_qubits=isa_circuit.num_qubits)
2025-11-10 11:19:57,810 INFO base_tasks Pass: ContainsInstruction - 0.00715 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: UnitarySynthesis - 0.00525 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: HighLevelSynthesis - 0.02599 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: BasisTranslator - 0.09131 (ms)
2025-11-10 11:19:57,811 INFO base_tasks Pass: SetLayout - 0.02623 (ms)
2025-11-10 11:19:57,812 INFO base_tasks Pass: FullAncillaAllocation - 0.14400 (ms)
2025-11-10 11:19:57,812 INFO base_tasks Pass: EnlargeWithAncilla - 0.06318 (ms)
2025-11-10 11:19:57,813 INFO base_tasks Pass: ApplyLayout - 0.29802 (ms)
2025-11-10 11:19:57,813 INFO base_tasks Pass: CheckMap - 0.07820 (ms)
2025-11-10 11:19:57,814 INFO base_tasks Pass: FilterOpNodes - 0.33283 (ms)
2025-11-10 11:19:57,814 INFO base_tasks Pass: UnitarySynthesis - 0.00691 (ms)
2025-11-10 11:19:57,814 INFO base_tasks Pass: HighLevelSynthesis - 0.13208 (ms)
2025-11-10 11:19:57,816 INFO base_tasks Pass: BasisTranslator - 1.00303 (ms)
2025-11-10 11:19:57,818 INFO base_tasks Pass: FoldRzzAngle - 1.78719 (ms)
2025-11-10 11:19:57,818 INFO base_tasks Pass: ContainsInstruction - 0.00691 (ms)
2025-11-10 11:19:57,818 INFO base_tasks Pass: InstructionDurationCheck - 0.00405 (ms)
wire_order = layout + [q for q in range(isa_circuit.num_qubits) if q not in layout]
isa_circuit.draw(
"mpl", fold=-1, scale=0.3, idle_wires=False, wire_order=wire_order, measure_arrows=False
)

وضع الدائرة في صناديق
لتسهيل التنفيذ، سنستخدم مرور الترجمة generate_boxing_pass_manager، الذي يضع تعليمات الدائرة في صناديق مُعلَّقة بتعليقات توضيحية. تشير هذه الصناديق بوضوح إلى المكان الذي يجب فيه، في حالة PEC، حقن مضاد الضوضاء في الدائرة. للاطلاع على تفاصيل الإعدادات، يُرجى الرجوع إلى توثيق Samplomatic.
لاحظ أن سير عمل SLC يستخدم inject_noise_strategy="individual_modification" لاحقاً في العملية لأن ذلك يتيح لنا التعرف الفريد على كل BoxOp في الدائرة.
تقوم الدالة find_unique_box_instructions بالتكرار عبر الدائرة المُصنَّفة المُقدَّمة وتحديد تلك التي تحتوي على طبقات ثنائية الـ Qubit أو قياسات فريدة، لأغراض تعلم الضوضاء وحقنها.
# Box circuit with Twirl and InjectNoise annotations
boxes_pm = generate_boxing_pass_manager(
twirling_strategy="active",
inject_noise_strategy="individual_modification",
inject_noise_targets="gates",
measure_annotations="all",
)
boxed_circuit = boxes_pm.run(isa_circuit)
# Find the unique instructions (layers) from boxed circuit
unique_2q_instructions = find_unique_box_instructions(
boxed_circuit, normalize_annotations=None, undress_boxes=True
)
2025-11-10 11:20:01,088 INFO base_tasks Pass: RemoveBarriers - 0.02289 (ms)
2025-11-10 11:20:01,100 INFO base_tasks Pass: GroupGatesIntoBoxes - 12.38990 (ms)
2025-11-10 11:20:01,101 INFO base_tasks Pass: GroupMeasIntoBoxes - 0.47898 (ms)
2025-11-10 11:20:01,104 INFO base_tasks Pass: AddTerminalRightDressedBoxes - 2.88177 (ms)
2025-11-10 11:20:01,111 INFO base_tasks Pass: AddInjectNoise - 6.66904 (ms)
boxed_circuit.draw(
"mpl", fold=-1, scale=0.3, idle_wires=False, wire_order=wire_order, measure_arrows=False
)

إعداد قياسات الأسس القانونية
نظراً لطريقة تسمية الـ Qubits عند تحديد الطبقات ثنائية الـ Qubit الفريدة، يجب توخي الحذر الخاص لتتبع ترتيب الـ Qubits. فيما يلي، نقدم مفهوم canonical_qubits كوسيلة لتحديث ترتيب الـ Qubits بشكل مناسب عند تقديمه للمُنفِّذ، نتيجةً لطريقة التقاط ترتيب الـ Qubit عند وضع الدوائر في صناديق وإيجاد التعليمات الفريدة. راجع توثيق اتفاقية ترتيب الـ Qubit للاطلاع على التفاصيل.
# Determine the canonical qubits order
meas_box = boxed_circuit.data[-1]
canonical_qubits = [
idx for idx, qubit in enumerate(boxed_circuit.qubits) if qubit in meas_box.qubits
]
# map canonical qubit to physical (isa) qubit
c_2_p = {c: p for c, p in enumerate(canonical_qubits)}
# map physical (isa) qubit to virtual qubit (index in original circuit)
p_2_v = {p: v for v, p in enumerate(layout)}
# compute map between virtual and canonical qubit indices.
c_2_v = {c: p_2_v[p] for c, p in c_2_p.items()}
assert len(c_2_v) == num_qubits
bases_canon = [
np.array([base_i[c_2_v[c]] for c in range(num_qubits)], dtype=np.uint8) for base_i in bases_virt
]
سير عمل التظليل بالمخروط الضوئي وتعلّم الضوضاء وحقن مضاد الضوضاء
ملاحظة: في تنفيذ SLC-PEC ضمن هذا البرنامج التعليمي، نُجري حسابات حدود SLC قبل اكتمال تعلّم الضوضاء، وذلك لتشغيل الدائرة المراد تخفيف ضوضائها في أقرب وقت ممكن من نموذج الضوضاء المُتعلَّم. ويمكن من حيث المبدأ تعزيز هذا سير العمل لتنفيذ المهام في آنٍ واحد، إذ يُشغَّل كلٌّ من مهمة تعلّم الضوضاء ومهمة تقدير حدود الضوضاء بالتوازي. وبالنسبة إلى دائرة كمية عشوائية، قد يتوسع حساب حدود الضوضاء بتبعية أسية ضعيفة. لذلك، قد يكون من المناسب اعتماد التنفيذ المتوازي لتعظيم كفاءة سير العمل. ولتوضيح ذلك، نستعرض باختصار كيفية استخدام موارد مجموعة عنقودية (128 خيطًا) وكيف يمكن الحصول على مجموعة أكثر دقةً من الحدود لدائرة معطاة عند تقييد زمن الحوسبة بالتساوي مقارنةً بالحاسوب المحمول (8 خيوط). وعلاوةً على ذلك، يمكن تعظيم كفاءة سير العمل بتوازي تنفيذات وحدة معالجة الكم لتعلّم الضوضاء وحسابات حدودها، وإن لم يُنفَّذ ذلك في هذا سير العمل.
التنبؤ بحدود باولي لنموذج الضوضاء المراد تعلّمه
تمرّ دالة generate_noise_model_paulis عبر كل طبقة مُعلَّبة في الدائرة المعطاة، وتُولّد جميع حدود باولي ذات الوزن الواحد وحدود باولي ذات الوزن الثنائي ذات الصلة، مع مراعاة اتصالية Qubit في الدائرة واختيار الحدود المرتبطة بالعقد والحواف النشطة. وتُستخدم هذه الحدود لاحقًا في حساب حدود الضوضاء الأمامية والخلفية.
noise_model_paulis = generate_noise_model_paulis(
unique_2q_instructions, backend.coupling_map, boxed_circuit
)
noise_model_rates = {ref: None for ref in noise_model_paulis}
أ. حساب الحدود الأمامية وتضييقها
تُقيّم دالة compute_forward_bounds علاقات التبديل بين البوابات في كل طبقة وحدود باولي المولَّدة أعلاه، من حيث تأثير أخطاء الانتشار الأمامي على الرصيد المطلوب . فالبوابات المتبادلة مع حدود باولي لا تستدعي أي إجراء، أما البوابات من نوع كليفورد فتُدفع نحو بداية الدائرة، وبالنسبة إلى البوابات غير الكليفوردية فيُقدَّر تأثيرها على الرصيد المستهدف لإعطائها الأولوية في إلغاء الضوضاء لاحقًا (بعد دمج جميع الحدود). ويُحقَّق هذا الحد بتطبيق معيار L2 أولاً (أي الجذر التربيعي لمجموع مربعات معاملات حدود باولي ذات الصلة). وحين يكثر عدد Qubit المتضمنة، يُلجأ إلى حدٍّ أرخى يعتمد متراجحة المثلث.
موارد مستوى الحاسوب المحمول
slc_atol = 1e-8
slc_eigval_max_qubits = 18
slc_evolution_max_terms = 1000
slc_num_processes = 8
slc_timeout = 60
forward_bounds = compute_forward_bounds(
boxed_circuit,
noise_model_paulis,
isa_observable,
evolution_max_terms=slc_evolution_max_terms,
eigval_max_qubits=slc_eigval_max_qubits,
atol=slc_atol,
num_processes=slc_num_processes,
timeout=slc_timeout,
)
2025-11-10 11:20:04,344 INFO forward Evolving Pauli error terms forwards through the circuit.
2025-11-10 11:20:04,344 INFO forward Modelling errors as though they happen *after* each noise layer.
2025-11-10 11:20:04,345 INFO remove_measure Removing ANY Measure operations from the provided circuit!
2025-11-10 11:20:04,453 INFO circuit_iter Noisy box 'm39'
2025-11-10 11:20:05,254 INFO circuit_iter Noisy box 'm38'
2025-11-10 11:20:05,304 INFO circuit_iter Noisy box 'm37'
2025-11-10 11:20:05,382 INFO circuit_iter Noisy box 'm36'
2025-11-10 11:20:05,467 INFO circuit_iter Noisy box 'm35'
2025-11-10 11:20:05,580 INFO circuit_iter Noisy box 'm34'
2025-11-10 11:20:05,705 INFO circuit_iter Noisy box 'm33'
2025-11-10 11:20:05,857 INFO circuit_iter Noisy box 'm32'
2025-11-10 11:20:06,034 INFO circuit_iter Noisy box 'm31'
2025-11-10 11:20:06,221 INFO circuit_iter Noisy box 'm30'
2025-11-10 11:20:06,449 INFO circuit_iter Noisy box 'm29'
2025-11-10 11:20:06,724 INFO circuit_iter Noisy box 'm28'
2025-11-10 11:20:07,628 INFO circuit_iter Noisy box 'm27'
2025-11-10 11:20:09,110 INFO circuit_iter Noisy box 'm26'
2025-11-10 11:20:11,696 INFO circuit_iter Noisy box 'm25'
2025-11-10 11:20:16,100 INFO circuit_iter Noisy box 'm24'
2025-11-10 11:20:21,781 INFO circuit_iter Noisy box 'm23'
2025-11-10 11:20:30,244 INFO circuit_iter Noisy box 'm22'
2025-11-10 11:20:40,416 INFO circuit_iter Noisy box 'm21'
2025-11-10 11:20:53,437 INFO circuit_iter Noisy box 'm20'
2025-11-10 11:21:06,038 INFO circuit_iter Noisy box 'm19'
2025-11-10 11:21:06,038 WARNING commutator_bounds Bounds computation timed out.
2025-11-10 11:21:06,039 INFO circuit_iter Noisy box 'm18'
2025-11-10 11:21:06,039 INFO circuit_iter Noisy box 'm17'
2025-11-10 11:21:06,039 INFO circuit_iter Noisy box 'm16'
2025-11-10 11:21:06,040 INFO circuit_iter Noisy box 'm15'
2025-11-10 11:21:06,040 INFO circuit_iter Noisy box 'm14'
2025-11-10 11:21:06,040 INFO circuit_iter Noisy box 'm13'
2025-11-10 11:21:06,040 INFO circuit_iter Noisy box 'm12'
2025-11-10 11:21:06,041 INFO circuit_iter Noisy box 'm11'
2025-11-10 11:21:06,041 INFO circuit_iter Noisy box 'm10'
2025-11-10 11:21:06,041 INFO circuit_iter Noisy box 'm9'
2025-11-10 11:21:06,042 INFO circuit_iter Noisy box 'm8'
2025-11-10 11:21:06,042 INFO circuit_iter Noisy box 'm7'
2025-11-10 11:21:06,042 INFO circuit_iter Noisy box 'm6'
2025-11-10 11:21:06,042 INFO circuit_iter Noisy box 'm5'
2025-11-10 11:21:06,043 INFO circuit_iter Noisy box 'm4'
2025-11-10 11:21:06,043 INFO circuit_iter Noisy box 'm3'
2025-11-10 11:21:06,043 INFO circuit_iter Noisy box 'm2'
2025-11-10 11:21:06,043 INFO circuit_iter Noisy box 'm1'
2025-11-10 11:21:06,044 INFO circuit_iter Noisy box 'm0'
تمثيل SLC بصريًا للفحص اليدوي
يمكن تفسير سلوك الحدود المظللة من خلال دراسة تفاعل القياسات وحدود باولي مع الأخطاء المحلية. وهذه الأنماط مميزة لمسألة تطور الزمن لهاملتونية إيزينج المضروبة، وقد وردت أيضًا في الورقة البحثية Lightcone Shading for Classically Accelerated Quantum Error Mitigation، وتبرز فيها عدة سمات لافتة:
- يمكن تمييز المخروطين الضوئيين الناشئين عن حدَّي باولي غير الهويّة في الرصيد بوضوح.
- يتبيّن أن قياس X على Qubit رقم 6 يتبادل مع خطأ X في الطبقة الأقصى يمينًا.
- يتبيّن أن باولي Z على Qubit رقم 13 يتبادل مع خطأ Z في الطبقة الأقصى يمينًا.
- عند الوصول إلى حد المهلة المحدد أعلاه، تُملأ الطبقات المتبقية على اليسار بالكامل بحدود تافهة قيمتها اثنان.
for p in "XYZ":
display(
draw_shaded_lightcone(
boxed_circuit,
forward_bounds,
noise_model_paulis,
pauli_filter=p,
scale=0.15,
fold=-1,
idle_wires=False,
wire_order=wire_order,
measure_arrows=False,
)
)



ب. حساب الحدود الأمامية وتضييقها
نضيّق الحدود بعد ذلك باستخدام دالة tighten_with_speed_limit، التي تتتبع كيفية انتشار الرصيد في الاتجاه الخلفي عبر الدائرة وتستخدم هذا الانتشار لوضع حدود عليا لتأثير كل مؤثر ضوضاء، مختارةً القيمة الأصغر بين الحد الأمامي المحسوب للتو والحد الناتج عن الانتشار الخلفي.
forward_bounds_tighter = tighten_with_speed_limit(
forward_bounds, boxed_circuit, noise_model_paulis, isa_observable
)
2025-11-10 11:21:08,270 INFO speed_limit Tighting bounds using information propagation speed limits
2025-11-10 11:21:08,270 INFO speed_limit Modelling errors as though they happen *after* each noise layer.
2025-11-10 11:21:08,298 INFO remove_measure Removing ANY Measure operations from the provided circuit!
2025-11-10 11:21:08,310 INFO circuit_iter Noisy box 'm39'
2025-11-10 11:21:08,314 INFO circuit_iter Noisy box 'm38'
2025-11-10 11:21:08,317 INFO circuit_iter Noisy box 'm37'
2025-11-10 11:21:08,319 INFO circuit_iter Noisy box 'm36'
2025-11-10 11:21:08,323 INFO circuit_iter Noisy box 'm35'
2025-11-10 11:21:08,325 INFO circuit_iter Noisy box 'm34'
2025-11-10 11:21:08,328 INFO circuit_iter Noisy box 'm33'
2025-11-10 11:21:08,330 INFO circuit_iter Noisy box 'm32'
2025-11-10 11:21:08,334 INFO circuit_iter Noisy box 'm31'
2025-11-10 11:21:08,336 INFO circuit_iter Noisy box 'm30'
2025-11-10 11:21:08,338 INFO circuit_iter Noisy box 'm29'
2025-11-10 11:21:08,340 INFO circuit_iter Noisy box 'm28'
2025-11-10 11:21:08,344 INFO circuit_iter Noisy box 'm27'
2025-11-10 11:21:08,346 INFO circuit_iter Noisy box 'm26'
2025-11-10 11:21:08,349 INFO circuit_iter Noisy box 'm25'
2025-11-10 11:21:08,351 INFO circuit_iter Noisy box 'm24'
2025-11-10 11:21:08,355 INFO circuit_iter Noisy box 'm23'
2025-11-10 11:21:08,357 INFO circuit_iter Noisy box 'm22'
2025-11-10 11:21:08,360 INFO circuit_iter Noisy box 'm21'
2025-11-10 11:21:08,362 INFO circuit_iter Noisy box 'm20'
2025-11-10 11:21:08,367 INFO circuit_iter Noisy box 'm19'
2025-11-10 11:21:08,369 INFO circuit_iter Noisy box 'm18'
2025-11-10 11:21:08,372 INFO circuit_iter Noisy box 'm17'
2025-11-10 11:21:08,375 INFO circuit_iter Noisy box 'm16'
2025-11-10 11:21:08,378 INFO circuit_iter Noisy box 'm15'
2025-11-10 11:21:08,380 INFO circuit_iter Noisy box 'm14'
2025-11-10 11:21:08,383 INFO circuit_iter Noisy box 'm13'
2025-11-10 11:21:08,386 INFO circuit_iter Noisy box 'm12'
2025-11-10 11:21:08,389 INFO circuit_iter Noisy box 'm11'
2025-11-10 11:21:08,391 INFO circuit_iter Noisy box 'm10'
2025-11-10 11:21:08,394 INFO circuit_iter Noisy box 'm9'
2025-11-10 11:21:08,396 INFO circuit_iter Noisy box 'm8'
2025-11-10 11:21:08,399 INFO circuit_iter Noisy box 'm7'
2025-11-10 11:21:08,401 INFO circuit_iter Noisy box 'm6'
2025-11-10 11:21:08,404 INFO circuit_iter Noisy box 'm5'
2025-11-10 11:21:08,406 INFO circuit_iter Noisy box 'm4'
2025-11-10 11:21:08,410 INFO circuit_iter Noisy box 'm3'
2025-11-10 11:21:08,412 INFO circuit_iter Noisy box 'm2'
2025-11-10 11:21:08,415 INFO circuit_iter Noisy box 'm1'
2025-11-10 11:21:08,417 INFO circuit_iter Noisy box 'm0'
تمثيل SLC بصريًا للفحص اليدوي
يمكن تضييق الحدود أكثر بالأخذ بعين الاعتبار قيود المخروط الضوئي. ويُتيح ذلك من حيث المبدأ انتقالًا أكثر سلاسة من الحدود المحسوبة إلى الحدود التافهة المحددة بعد انتهاء مهلة الحساب. غير أن التأثير هنا غير واضح المعالم لأن المخروطات الضوئية بلغت حافة الدائرة بالفعل.
for p in "XYZ":
display(
draw_shaded_lightcone(
boxed_circuit,
forward_bounds_tighter,
noise_model_paulis,
pauli_filter=p,
scale=0.15,
fold=-1,
idle_wires=False,
wire_order=wire_order,
measure_arrows=False,
)
)



ج. حساب الحدود الخلفية
يُقيّم هذا الجزء من التنبؤ بالضوضاء كيف يمكن لخطأ في طبقة بعينها أن يؤثر على حالة الإدخال . وتعمل دالة compute_backward_bounds بقلب الدائرة أولاً وإزالة بوابات القياس منها، ثم تمضي في تحليل مشابه لما أُجري في حسابات الحدود الأمامية.
backward_bounds = compute_backward_bounds(
boxed_circuit,
noise_model_paulis,
evolution_max_terms=slc_evolution_max_terms,
num_processes=slc_num_processes,
timeout=slc_timeout,
)
2025-11-10 11:21:10,666 INFO backward Evolving Pauli error terms backwards through the circuit.
2025-11-10 11:21:10,666 INFO backward Modelling errors as though they happen *after* each noise layer.
2025-11-10 11:21:10,667 INFO remove_measure Removing ANY Measure operations from the provided circuit!
2025-11-10 11:21:10,774 INFO circuit_iter Noisy box 'm0'
2025-11-10 11:21:11,640 INFO circuit_iter Noisy box 'm1'
2025-11-10 11:21:11,681 INFO circuit_iter Noisy box 'm2'
2025-11-10 11:21:11,867 INFO circuit_iter Noisy box 'm3'
2025-11-10 11:21:12,078 INFO circuit_iter Noisy box 'm4'
2025-11-10 11:21:12,329 INFO circuit_iter Noisy box 'm5'
2025-11-10 11:21:12,637 INFO circuit_iter Noisy box 'm6'
2025-11-10 11:21:13,110 INFO circuit_iter Noisy box 'm7'
2025-11-10 11:21:13,705 INFO circuit_iter Noisy box 'm8'
2025-11-10 11:21:14,384 INFO circuit_iter Noisy box 'm9'
2025-11-10 11:21:15,213 INFO circuit_iter Noisy box 'm10'
2025-11-10 11:21:15,946 INFO circuit_iter Noisy box 'm11'
2025-11-10 11:21:16,754 INFO circuit_iter Noisy box 'm12'
2025-11-10 11:21:17,557 INFO circuit_iter Noisy box 'm13'
2025-11-10 11:21:18,447 INFO circuit_iter Noisy box 'm14'
2025-11-10 11:21:19,453 INFO circuit_iter Noisy box 'm15'
2025-11-10 11:21:20,472 INFO circuit_iter Noisy box 'm16'
2025-11-10 11:21:21,479 INFO circuit_iter Noisy box 'm17'
2025-11-10 11:21:22,660 INFO circuit_iter Noisy box 'm18'
2025-11-10 11:21:23,705 INFO circuit_iter Noisy box 'm19'
2025-11-10 11:21:24,849 INFO circuit_iter Noisy box 'm20'
2025-11-10 11:21:26,030 INFO circuit_iter Noisy box 'm21'
2025-11-10 11:21:27,111 INFO circuit_iter Noisy box 'm22'
2025-11-10 11:21:28,354 INFO circuit_iter Noisy box 'm23'
2025-11-10 11:21:29,554 INFO circuit_iter Noisy box 'm24'
2025-11-10 11:21:30,897 INFO circuit_iter Noisy box 'm25'
2025-11-10 11:21:32,113 INFO circuit_iter Noisy box 'm26'
2025-11-10 11:21:33,622 INFO circuit_iter Noisy box 'm27'
2025-11-10 11:21:34,962 INFO circuit_iter Noisy box 'm28'
2025-11-10 11:21:36,504 INFO circuit_iter Noisy box 'm29'
2025-11-10 11:21:38,021 INFO circuit_iter Noisy box 'm30'
2025-11-10 11:21:39,750 INFO circuit_iter Noisy box 'm31'
2025-11-10 11:21:41,237 INFO circuit_iter Noisy box 'm32'
2025-11-10 11:21:42,974 INFO circuit_iter Noisy box 'm33'
2025-11-10 11:21:44,527 INFO circuit_iter Noisy box 'm34'
2025-11-10 11:21:46,535 INFO circuit_iter Noisy box 'm35'
2025-11-10 11:21:48,152 INFO circuit_iter Noisy box 'm36'
2025-11-10 11:21:50,074 INFO circuit_iter Noisy box 'm37'
2025-11-10 11:21:51,814 INFO circuit_iter Noisy box 'm38'
2025-11-10 11:21:53,943 INFO circuit_iter Noisy box 'm39'

