انتقال طور نيشيموري
تقدير الاستخدام: 3 دقائق على معالج Heron r2 (ملاحظة: هذا تقدير فحسب. قد يختلف وقت التشغيل الفعلي لديك.)
مخرجات التعلم
بعد المرور بهذا البرنامج التعليمي، يُتوقع أن يحقق المستخدمون النتائج التالية:
- فهم انتقال طور نيشيموري وكيفية تجلّيه على شكل ظهور تشابك بعيد المدى في نموذج Ising ذي الروابط العشوائية.
- تنفيذ بروتوكول توليد التشابك بالقياس (GEM) على عتاد كمي باستخدام القياسات وسط الدارة ودوائر ذات عمق ثابت.
- توصيف الانتقال باستخراج الارتباط ثنائي النقاط والتباين المُعيَّر للمغنطة من البيانات التجريبية.
المتطلبات الأساسية
نوصي بالتعرف على الموضوعات التالية قبل المرور بهذا البرنامج التعليمي:
- دليل قياس البتات الكمومية، ولا سيما القسم الخاص بالقياس وسط الدارة الذي يعتمد عليه بروتوكول GEM.
- المحاكاة الدقيقة والمُشوَّشة باستخدام Qiskit Aer primitives، وهي الطريقة التي تُنفَّذ بها قسم النطاق الصغير.
- التشابك بعيد المدى باستخدام الدوائر الديناميكية، برنامج تعليمي مرافق يستخدم نفس نموذج التشابك المبني على القياس.
- شبكة heavy-hex، طوبولوجيا عتاد IBM® التي تُبنى عليها شبكة اللويحات.
الخلفية
يوضح هذا البرنامج التعليمي كيفية تحقيق انتقال طور نيشيموري على معالج كمي. وُصفت هذه التجربة في الأصل في Realizing the Nishimori transition across the error threshold for constant-depth quantum circuits.
يشير انتقال طور نيشيموري إلى الانتقال بين الأطوار ذات الترتيب قصير المدى وبعيد المدى في نموذج Ising ذي الروابط العشوائية. على الحاسوب الكمي، يتجلى الطور ذو الترتيب بعيد المدى على شكل حالة تكون فيها البتات الكمومية متشابكة عبر الجهاز بأكمله. تُحضَّر هذه الحالة شديدة التشابك باستخدام بروتوكول توليد التشابك بالقياس (GEM). وبفضل استخدام القياسات وسط الدارة، يستطيع بروتوكول GEM تشبيك البتات الكمومية عبر الجهاز بأكمله باستخدام دوائر ذات عمق ثابت فحسب. يستخدم هذا البرنامج التعليمي تنفيذ بروتوكول GEM من حزمة برامج GEM Suite.
المتطلبات
قبل البدء في هذا البرنامج التعليمي، تأكد من تثبيت ما يلي:
- Qiskit SDK الإصدار 1.0 أو أحدث، مع دعم التصور
- Qiskit Runtime الإصدار 0.22 أو أحدث (
pip install qiskit-ibm-runtime) - Qiskit Aer الإصدار 0.14 أو أحدث (
pip install qiskit-aer) - GEM Suite (
pip install gem-suite)
الإعداد
# Added by doQumentation — required packages for this notebook
!pip install -q gem-suite matplotlib qiskit qiskit-aer qiskit-ibm-runtime
import matplotlib.pyplot as plt
import warnings
from collections import defaultdict
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_aer import AerSimulator
from qiskit.transpiler import generate_preset_pass_manager
from gem_suite import PlaquetteLattice
from gem_suite.experiments import GemExperiment
مثال على محاكٍ صغير النطاق
في هذا القسم، سنستعرض سير العمل الكامل على محاكٍ AerSimulator خالٍ من الضوضاء. تقتصر شبكة اللويحات على لويحة واحدة (12 بتة كمومية) لتبقى المحاكاة صغيرة وسريعة، مع ممارسة كل جزء من بروتوكول GEM: القياس وسط الدارة، واجتياح زاوية ، وفك الترميز، وتحليل التباين المُعيَّر. ثم يُوسَّع نفس سير العمل لاحقًا إلى لويحات متعددة وشبكة اللويحات الكاملة على عتاد حقيقي.
الخطوة 1: ربط المدخلات الكلاسيكية بمسألة كمية
يعمل بروتوكول GEM على معالج كمي تُوصف فيه ترابطية البتات الكمومية بشبكة. تستخدم معالجات IBM الكمية الحالية شبكة heavy-hex. تُجمَّع البتات الكمومية للمعالج في لويحات (plaquettes) بناءً على خلية الوحدة التي تشغلها في الشبكة. ونظرًا لإمكانية ظهور بتة كمومية واحدة في أكثر من خلية وحدة، فإن اللويحات ليست متقاطعة. في شبكة heavy-hex، تحتوي اللويحة على 12 بتة كمومية. كما تُشكّل اللويحات بحد ذاتها شبكة، حيث تكون لويحتان متصلتين إذا كانتا تتشاركان أي بتات كمومية. في شبكة heavy-hex، تتشارك اللويحات المتجاورة 3 بتات كمومية.
في حزمة برامج GEM Suite، الفئة الأساسية لتنفيذ بروتوكول GEM هي PlaquetteLattice، التي تمثل شبكة اللويحات (وهي مختلفة عن شبكة heavy-hex). يمكن تهيئة PlaquetteLattice من خريطة اقتران البتات الكمومية. حاليًا، لا تُدعم إلا خرائط اقتران heavy-hex.
تُهيئ خلية الكود التالية شبكة لويحات من خريطة اقتران وحدة معالجة كمية (QPU). لا تشمل شبكة اللويحات دائمًا الجهاز بأكمله. على سبيل المثال، يحتوي ibm_torino على 133 بتة كمومية إجمالًا، لكن أكبر شبكة لويحات تناسب الجهاز تستخدم 125 منها فحسب، وتضم 18 لويحة؛ أما ibm_pittsburgh (156 بتة كمومية) فيضم 144 بتة كمومية في 21 لويحة. وينطبق النمط ذاته على سائر وحدات معالجة heavy-hex الكمية ذات الأعداد المختلفة من البتات الكمومية.
# QiskitRuntimeService.save_account(channel="ibm_quantum", token="<YOUR_API_KEY>", overwrite=True,
# set_as_default=True)
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
aer_backend = AerSimulator.from_backend(backend)
plaquette_lattice = PlaquetteLattice.from_coupling_map(backend.coupling_map)
print(f"Number of qubits in backend: {backend.num_qubits}")
print(
f"Number of qubits in plaquette lattice: {len(list(plaquette_lattice.qubits()))}"
)
print(f"Number of plaquettes: {len(list(plaquette_lattice.plaquettes()))}")
يمكنك تصور شبكة اللويحات بإنشاء مخطط لتمثيلها البياني. في المخطط، تُمثَّل اللويحات بسداسيات مُعلَّمة، وتُربط لويحتان بحافة إذا كانتا تتشاركان بتات كمومية.
plaquette_lattice.draw_plaquettes()

يمكنك استرداد معلومات حول اللويحات الفردية، مثل البتات الكمومية التي تحتوي عليها، باستخدام طريقة plaquettes.
# Get a list of the plaquettes
plaquettes = list(plaquette_lattice.plaquettes())
# Display information about plaquette 0
plaquettes[0]
PyPlaquette(index=0, qubits=[3, 4, 5, 6, 7, 16, 17, 23, 24, 25, 26, 27], neighbors=[4, 3, 1])
يمكنك أيضًا إنتاج مخطط للبتات الكمومية الأساسية المكوِّنة لشبكة اللويحات.
plaquette_lattice.draw_qubits()

إضافة إلى تسميات البتات الكمومية والحواف الدالة على اتصالها، يتضمن المخطط ثلاث معلومات إضافية ذات صلة ببروتوكول GEM:
- كل بتة كمومية إما مظللة (باللون الرمادي) أو غير مظللة. البتات المظللة هي بتات "الموقع" التي تمثل مواقع نموذج Ising، أما البتات غير المظللة فهي بتات "الرابطة" المستخدمة للوساطة في التفاعلات بين بتات الموقع.
- كل بتة موقع مُعلَّمة بـ (A) أو (B)، مما يشير إلى أحد دورين يمكن أن تضطلع بهما بتة الموقع في بروتوكول GEM (يُشرح الدوران لاحقًا).
- كل حافة مُلوَّنة بإحدى ست ألوان، مما يقسم الحواف إلى ست مجموعات. يحدد هذا التقسيم كيفية توازي بوابات ثنائية البتات الكمومية، فضلًا عن أنماط جدولة مختلفة يُرجَّح أن تُسبب قدرًا مختلفًا من الأخطاء على معالج كمي مُشوَّش. ونظرًا لأن الحواف في كل مجموعة متفرقة، يمكن تطبيق طبقة من بوابات ثنائية البتات على تلك الحواف في آنٍ واحد. في الواقع، من الممكن تقسيم الألوان الست إلى ثلاث مجموعات من لونين بحيث يظل اتحاد كل مجموعة من اللونين متفرقًا. وبالتالي، لا تلزم سوى ثلاث طبقات من بوابات ثنائية البتات لتنشيط كل حافة. ثمة 12 طريقة لتقسيم الألوان الست على هذا النحو، وينتج عن كل تقسيم جدول بوابات مختلف من 3 طبقات.
الآن بعد أن أنشأت شبكة لويحات، تتمثل الخطوة التالية في تهيئة كائن GemExperiment، مع تمرير شبكة اللويحات والخلفية التي تعتزم تشغيل التجربة عليها. تدير فئة GemExperiment التنفيذ الفعلي لبروتوكول GEM، بما في ذلك توليد الدوائر وإرسال المهام وتحليل البيانات. تُهيئ خلية الكود التالية فئة التجربة مع تقييد شبكة اللويحات بلويحة واحدة (12 بتة كمومية) للحفاظ على المحاكاة صغيرة وسريعة. تُستخدم شبكة اللويحات الكاملة لاحقًا عند التوسع إلى عتاد حقيقي.
# Filter the plaquette lattice down to a single plaquette (12 qubits)
# so the AerSimulator run stays fast. The full lattice is used later
# in the large-scale hardware example.
gem_exp = GemExperiment(plaquette_lattice.filter([9]), backend=aer_backend)
# visualize the plaquette lattice after filtering
plaquette_lattice.filter([9]).draw_qubits()
تُبنى دارة بروتوكول GEM وفق الخطوات التالية:
- تحضير حالة الكلية بتطبيق بوابة Hadamard على كل بتة كمومية.
- تطبيق بوابة بين كل زوج من البتات الكمومية المتصلة. يمكن تحقيق ذلك باستخدام 3 طبقات من البوابات. تعمل كل بوابة على بتة موقع وبتة رابطة. إذا كانت بتة الموقع مُعلَّمة بـ (B)، فإن الزاوية تكون ثابتة عند . أما إذا كانت بتة الموقع مُعلَّمة بـ (A)، فإن الزاوية مسموح لها بالتغيير، مما ينتج دوائر مختلفة. بشكل افتراضي، يُضبط نطاق الزوايا على 21 نقطة متساوية التباعد بين و شاملةً طرفيه.
- قياس كل بتة رابطة في أساس Pauli . نظرًا لأن البتات الكمومية تُقاس في أساس Pauli ، يمكن تحقيق ذلك بتطبيق بوابة Hadamard قبل قياس البتة الكمومية.
لاحظ أن الورقة المشار إليها في مقدمة هذا البرنامج التعليمي تستخدم اصطلاحًا مختلفًا لزاوية ، يختلف عن الاصطلاح المستخدم هنا بعامل مقداره 2.
في الخطوة 3، تُقاس بتات الرابطة فحسب. لفهم الحالة التي تبقى عليها بتات الموقع، من المفيد النظر في الحالة التي تكون فيها زاوية المُطبَّقة على بتات الموقع (A) في الخطوة 2 مساوية لـ . في هذه الحالة، تبقى بتات الموقع في حالة شديدة التشابك تشبه حالة GHZ،
نظرًا لعشوائية نتائج القياس، قد تكون الحالة الفعلية لبتات الموقع حالة مختلفة ذات ترتيب بعيد المدى، مثل . غير أن حالة GHZ يمكن استعادتها بتطبيق عملية فك ترميز مبنية على نتائج القياس. عند خفض زاوية من ، لا يزال بالإمكان استعادة الترتيب بعيد المدى حتى زاوية حرجة تبلغ في غياب الضوضاء نحو . دون هذه الزاوية، لا تُظهر الحالة الناتجة تشابكًا بعيد المدى بعد الآن. هذا الانتقال بين وجود الترتيب بعيد المدى وغيابه هو انتقال طور نيشيموري.
في الوصف أعلاه، بقيت بتات الموقع دون قياس، ويمكن إجراء عملية فك الترميز بتطبيق بوابات كمية. أما في التجربة كما نُفِّذت في GEM suite، فإن بتات الموقع تُقاس فعلًا، وتُطبَّق عملية فك الترميز في خطوة معالجة كلاسيكية لاحقة.
في الوصف أعلاه، يمكن إجراء عملية فك الترميز بتطبيق بوابات كمية على بتات الموقع لاستعادة الحالة الكمومية. غير أنه إذا كان الهدف هو قياس الحالة فورًا (مثلًا لأغراض التوصيف)، يمكنك قياس بتات الموقع مع بتات الرابطة، وتطبيق عملية فك الترميز في خطوة معالجة كلاسيكية لاحقة.
إضافة إلى اعتمادها على زاوية في الخطوة 2 التي تجتاح 21 قيمة بشكل افتراضي، تعتمد دارة بروتوكول GEM أيضًا على نمط الجدولة المستخدم لتنفيذ 3 طبقات من بوابات . كما ناقشنا سابقًا، ثمة 12 نمط جدولة من هذا القبيل. وبالتالي، يبلغ إجمالي عدد الدوائر في التجربة .
يمكن توليد دوائر التجربة باستخدام طريقة circuits من فئة GemExperiment.
circuits = gem_exp.circuits()
print(f"Total number of circuits: {len(circuits)}")
Total number of circuits: 252
لأغراض هذا البرنامج التعليمي، يكفي النظر في نمط جدولة واحد فحسب. تُقيِّد خلية الكود التالية التجربة بنمط الجدولة الأول. ونتيجة لذلك، تحتوي التجربة على 21 دارة فحسب، واحدة لكل زاوية يُجتاح فوقها.
# Restrict experiment to the first scheduling pattern
gem_exp.set_experiment_options(schedule_idx=0)
# There are less circuits now
circuits = gem_exp.circuits()
print(f"Total number of circuits: {len(circuits)}")
# Print the RZZ angles swept over
print(f"RZZ angles:\n{gem_exp.parameters()}")
Total number of circuits: 21
RZZ angles:
[0. 0.07853982 0.15707963 0.23561945 0.31415927 0.39269908
0.4712389 0.54977871 0.62831853 0.70685835 0.78539816 0.86393798
0.9424778 1.02101761 1.09955743 1.17809725 1.25663706 1.33517688
1.41371669 1.49225651 1.57079633]
ترسم خلية الكود التالية مخططًا للدارة ذات الفهرس 5. لتقليل حجم المخطط، تُزال بوابات القياس في نهاية الدارة.
# Get the circuit at index 5
circuit = circuits[5]
# Remove the final measurements to ease visualization
circuit.remove_final_measurements()
# Draw the circuit
circuit.draw("mpl", fold=-1, scale=0.5)
الخطوة 2: تحسين المسألة لتنفيذها على العتاد الكمي
يتضمن تحويل الدوائر الكمية للتنفيذ على العتاد عادةً عدة مراحل. في الغالب، أكثر المراحل تكلفةً من الناحية الحسابية هي اختيار تخطيط البتات الكمومية، وتوجيه بوابات ثنائية البتات لتتوافق مع ترابطية البتات في العتاد، وتحسين الدارة لتقليل عدد البوابات وعمقها. في بروتوكول GEM، مرحلتا التخطيط والتوجيه غير ضروريتين لأن ترابطية العتاد مدمجة بالفعل في تصميم البروتوكول. الدوائر تحتوي مسبقًا على تخطيط للبتات الكمومية، وبوابات ثنائية البتات مُعيَّنة بالفعل على الاتصالات الأصلية. علاوة على ذلك، وللحفاظ على بنية الدارة عند تغيير زاوية ، ينبغي إجراء تحسين أساسي فحسب للدارة.
تُجري فئة GemExperiment تحويل الدوائر بشفافية عند تنفيذ التجربة. مرحلتا التخطيط والتوجيه مُعَوَّضتان بالفعل افتراضيًا لتقوما بلا شيء، ويُجرى تحسين الدارة بمستوى يُحسِّن بوابات البتات الفردية فحسب. غير أنه يمكنك تجاوز هذه الإعدادات أو تمرير خيارات إضافية باستخدام طريقة set_transpile_options. للتوضيح، تُحوِّل خلية الكود التالية الدارة المعروضة سابقًا يدويًا وترسم الدارة المُحوَّلة.
# Demonstrate setting transpile options
gem_exp.set_transpile_options(
optimization_level=1 # This is the default optimization level
)
pass_manager = generate_preset_pass_manager(
backend=aer_backend,
initial_layout=list(gem_exp.physical_qubits),
**dict(gem_exp.transpile_options),
)
transpiled = pass_manager.run(circuit)
transpiled.draw("mpl", idle_wires=False, fold=-1, scale=0.5)
الخطوة 3: التنفيذ باستخدام Qiskit primitives
لتنفيذ دوائر بروتوكول GEM على العتاد، استدعِ طريقة run من كائن GemExperiment. يمكنك تحديد عدد اللقطات التي تريد أخذ عينات منها من كل دارة. تُعيد طريقة run كائنًا من نوع ExperimentData ينبغي حفظه في متغير. لاحظ أن طريقة run تُرسل المهام فحسب دون انتظار اكتمالها، وبالتالي فهي استدعاء غير محجوب.
exp_data = gem_exp.run(shots=10_000)
لانتظار النتائج، استدعِ طريقة block_for_results من كائن ExperimentData. سيتسبب هذا الاستدعاء في تعليق المفسر حتى تنتهي المهام.
# The noiseless AerSimulator produces zero-variance UFloat objects in the
# analysis, which triggers a harmless warning from the `uncertainties`
# library. Suppress it so the output stays clean.
with warnings.catch_warnings():
warnings.filterwarnings(
"ignore", message="Using UFloat objects with std_dev==0"
)
exp_data.block_for_results()
exp_data
ExperimentData(GemExperiment, 90bf2a90-f729-4c4e-a6da-664aecb11039, job_ids=['04a7c405-47fd-46ca-aa4b-aaf7e339cfbe'], metadata=<5 items>, figure_names=['two_point_correlation.svg', 'normalized_variance.svg', 'plaquette_ops.svg', 'bond_ops.svg'])
الخطوة 4: المعالجة اللاحقة وإعادة النتيجة بالتنسيق الكلاسيكي المطلوب
عند زاوية تبلغ ، ستكون الحالة المُفكَّك ترميزها هي حالة GHZ في غياب الضوضاء. يمكن تصور الترتيب بعيد المدى لحالة GHZ برسم مغنطة سلاسل البتات المقيسة. تُعرَّف المغنطة بوصفها مجموع معاملات Pauli أحادية البتة،
حيث هو عدد بتات الموقع. قيمتها لسلسلة بتات تساوي الفرق بين عدد الأصفار وعدد الآحاد. يعطي قياس حالة GHZ حالة الأصفار الكلية أو حالة الآحاد الكلية باحتمال متساوٍ، لذا ستكون المغنطة في نصف الأحيان و في النصف الآخر. في وجود الأخطاء الناجمة عن الضوضاء، ستظهر قيم أخرى أيضًا، لكن إذا لم تكن الضوضاء كبيرة جدًا، سيظل التوزيع مرتكزًا بالقرب من و.
بالنسبة لسلاسل البتات الخام قبل فك الترميز، سيكون توزيع المغنطة مكافئًا لتوزيع سلاسل البتات العشوائية الموزعة توزيعًا منتظمًا في غياب الضوضاء.
ترسم خلية الكود التالية مغنطة سلاسل البتات الخام والمُفكَّك ترميزها عند زاوية تبلغ .
def magnetization_distribution(
counts_dict: dict[str, int],
) -> dict[str, float]:
"""Compute magnetization distribution from counts dictionary."""
# Construct dictionary from magnetization to count
mag_dist = defaultdict(float)
for bitstring, count in counts_dict.items():
mag = bitstring.count("0") - bitstring.count("1")
mag_dist[mag] += count
# Normalize
shots = sum(counts_dict.values())
for mag in mag_dist:
mag_dist[mag] /= shots
return mag_dist
# Get counts dictionaries with and without decoding
data = exp_data.data()
# Get the last data point, which is at the angle for the GHZ state
raw_counts = data[-1]["counts"]
# Without decoding
site_indices = [
i for i, q in enumerate(gem_exp.plaquettes.qubits()) if q.role == "Site"
]
site_raw_counts = defaultdict(int)
for key, val in raw_counts.items():
site_str = "".join(key[-1 - i] for i in site_indices)
site_raw_counts[site_str] += val
# With decoding
_, site_decoded_counts = gem_exp.plaquettes.decode_outcomes(
raw_counts, return_counts=True
)
# Compute magnetization distribution
raw_magnetization = magnetization_distribution(site_raw_counts)
decoded_magnetization = magnetization_distribution(site_decoded_counts)
# Plot
plt.bar(*zip(*raw_magnetization.items()), label="raw")
plt.bar(*zip(*decoded_magnetization.items()), label="decoded", width=0.3)
plt.legend()
plt.xlabel("Magnetization")
plt.ylabel("Frequency")
plt.title("Magnetization distribution with and without decoding")
Text(0.5, 1.0, 'Magnetization distribution with and without decoding')
لتوصيف الترتيب بعيد المدى بصرامة أكبر، يمكنك فحص متوسط الارتباط ثنائي النقاط ، المعرَّف بـ
تدل القيمة الأعلى على درجة أكبر من التشابك. تحسب فئة GemExperiment هذه القيمة تلقائيًا لسلاسل البتات المُفكَّك ترميزها كجزء من معالجة البيانات التجريبية. وتُخزِّن شكلًا بيانيًا يمكن الوصول إليه عبر طريقة figure من فئة بيانات التجربة. في هذه الحالة، اسم الشكل البياني هو two_point_correlation.
exp_data.figure("two_point_correlation")
لتحديد النقطة الحرجة لانتقال طور نيشيموري، يمكنك النظر في التباين المُعيَّر لـ ، المعرَّف بـ
الذي يُقيِّس مقدار التذبذب في تربيع المغنطة. تبلغ هذه القيمة أقصاها عند النقطة الحرجة لانتقال طور نيشيموري. في غياب الضوضاء، تقع النقطة الحرجة عند نحو . في وجود الضوضاء، تنتقل النقطة الحرجة إلى قيمة أعلى، لكن يظل بالإمكان رصد انتقال الطور ما دامت النقطة الحرجة تقع دون .
exp_data.figure("normalized_variance")
مثال على عتاد واسع النطاق
بعد التحقق من صحة البروتوكول على محاكٍ، يمكنك الآن توسيع التجربة وتشغيلها على خلفية العتاد الكمي الحقيقي المحددة في قسم الإعداد. يستخدم هذا المثال حجمين أكبر للمسألة:
- ست لويحات (~49 بتة كمومية): تشغيل متوسط الحجم يُظهر بالفعل الانزياح نحو اليمين في النقطة الحرجة تحت تأثير ضوضاء العتاد.
- شبكة اللويحات الكاملة: كل لويحة تدعمها طوبولوجيا heavy-hex للجهاز (على سبيل المثال، 18 لويحة / 125 بتة كمومية على
ibm_torinoأو 21 لويحة / 144 بتة كمومية علىibm_pittsburgh)، مما يُشبِّك البتات الكمومية عبر الجهاز بأكمله بدوائر ذات عمق ثابت.
خلية الكود الواحدة التالية مكتفية بذاتها: تبني شبكة اللويحات من خريطة اقتران الخلفية وتُشغِّل كلتا التجربتين، لذا يمكن تنفيذ هذا القسم بعد خلايا الإعداد مباشرةً دون الحاجة إلى تشغيل قسم النطاق الصغير أولًا.
# -------------------------Step 1-------------------------
# Initialize the runtime service, pick a real quantum hardware backend,
# and build the plaquette lattice from its coupling map. This is repeated
# from the small-scale example so this cell can run standalone after the
# Setup section. The full plaquette lattice is the "large-scale" target;
# a six-plaquette subset (range(3, 9)) is also used to show an intermediate
# scaling step.
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
plaquette_lattice = PlaquetteLattice.from_coupling_map(backend.coupling_map)
# Build a GemExperiment for the full plaquette lattice and one for the
# six-plaquette subset, each restricted to a single scheduling pattern so
# the experiment has one circuit per RZZ angle (21 circuits total).
gem_exp_full = GemExperiment(plaquette_lattice, backend=backend)
gem_exp_full.set_experiment_options(schedule_idx=0)
gem_exp_6 = GemExperiment(
plaquette_lattice.filter(range(3, 9)), backend=backend
)
gem_exp_6.set_experiment_options(schedule_idx=0)
circuits = gem_exp_full.circuits()
print(f"Total number of circuits (full lattice): {len(circuits)}")
# -------------------------Step 2-------------------------
# GemExperiment transpiles internally for the target backend: the layout
# and routing stages are overridden because the plaquette lattice already
# matches the hardware connectivity, and optimization is restricted so the
# RZZ angle structure is preserved. The code below manually transpiles one
# circuit from the six-plaquette experiment with the same settings this
# experiment will use, and draws it for inspection. (The full-lattice
# transpiled circuit has too many qubits to visualize cleanly, so the
# six-plaquette circuit is used here as a representative example.)
gem_exp_6.set_transpile_options(optimization_level=1)
circuits_6 = gem_exp_6.circuits()
pass_manager = generate_preset_pass_manager(
backend=backend,
initial_layout=list(gem_exp_6.physical_qubits),
**dict(gem_exp_6.transpile_options),
)
transpiled = pass_manager.run(circuits_6[5])
display(transpiled.draw("mpl", idle_wires=False, fold=-1, scale=0.5))
# -------------------------Step 3-------------------------
# Run both problem sizes on real hardware:
# 1. Six plaquettes (~49 qubits) — an intermediate scale-up.
# 2. The full plaquette lattice — every plaquette the device supports.
exp_data_6 = gem_exp_6.run(shots=10_000, job_tags=["TUT_NPT"])
exp_data_full = gem_exp_full.run(shots=10_000, job_tags=["TUT_NPT"])
exp_data_6.block_for_results()
exp_data_full.block_for_results()
# -------------------------Step 4-------------------------
# Plot the normalized variance at each scale. The peak marks the critical
# point of the Nishimori transition; as the system grows, hardware noise
# shifts the peak rightward.
display(exp_data_6.figure("normalized_variance"))
exp_data_full.figure("normalized_variance")
Total number of circuits (full lattice): 21

لاحظ أنه بناءً على مستوى الضوضاء في الخلفية المستخدمة، قد لا تُظهر منحنيات التباين المُعيَّر عند الأحجام الأكبر ذروةً واضحةً ضمن نطاق الزوايا المُجتاح. في التشغيلات أعلاه، دُفعت الذروة حتى ، أي الحافة اليمنى للاجتياح (يُبلِّغ التحليل عن critical_angle = 0.5000 لتشغيلي ست اللويحات والشبكة الكاملة). هذا يعني أن ضوضاء العتاد نقلت النقطة الحرجة إلى حدود النطاق المجدي فيزيائيًا لهذا الاجتياح، أو ما بعده، وبالتالي فإن الانتقال يقع على حافة ما يمكن لهذا الاجتياح رصده.
الخاتمة
في هذا البرنامج التعليمي، حققت انتقال طور نيشيموري على معالج كمي باستخدام بروتوكول GEM. تُعدّ المقاييس التي فحصتها أثناء المعالجة اللاحقة — ولا سيما الارتباط ثنائي النقاط والتباين المُعيَّر — معايير لقياس قدرة الجهاز على توليد حالات متشابكة بعيدة المدى. وتُمتد هذه المعايير نفعَ بروتوكول GEM ليتجاوز استكشاف الفيزياء المثيرة للاهتمام. كجزء من البروتوكول، قمت بتشبيك البتات الكمومية عبر الجهاز بأكمله باستخدام دوائر ذات عمق ثابت فحسب. لا يتحقق هذا الإنجاز إلا بفضل استخدام البروتوكول للقياسات وسط الدارة. في هذه التجربة، جرى قياس الحالة المتشابكة فورًا، لكن فكِّر في الاستكشاف أكثر باستخدام هذه الحالة في معالجة كمية إضافية.
الخطوات التالية
إذا وجدت هذا العمل مثيرًا للاهتمام، فقد يهمك المواد التالية:
المراجع
[1] E. H. Chen, G.-Y. Zhu, R. Verresen, A. Seif, E. Bäumer, D. Layden, N. Tantivasadakarn, G. Zhu, S. Sheldon, A. Vishwanath, S. Trebst, A. Kandala. Realizing the Nishimori transition across the error threshold for constant-depth quantum circuits. arXiv:2309.02863 (2023).
[2] GEM Suite software package.