انتقال طور نيشيموري
تقدير الاستخدام: 3 دقائق على معالج Heron r2 (ملاحظة: هذا تقدير فحسب. قد يختلف وقت التشغيل الفعلي لديك.)
الخلفية
يوضح هذا البرنامج التعليمي كيفية تحقيق انتقال طور نيشيموري على معالج كم 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) - GEM Suite (
pip install gem-suite)
الإعداد
# Added by doQumentation — installs packages not in the Binder environment
%pip install -q gem-suite
import matplotlib.pyplot as plt
from collections import defaultdict
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager
from gem_suite import PlaquetteLattice
from gem_suite.experiments import GemExperiment
الخطوة 1: ربط المدخلات الكلاسيكية بمسألة كمية
يعمل بروتوكول GEM على معالج كمي تُوصف فيه ترابطية البتات الكمومية بشبكة. تستخدم معالجات IBM الكمية الحالية شبكة heavy hex. تُجمَّع البتات الكمومية للمعالج في لويحات (plaquettes) بناءً على خلية الوحدة التي تشغلها في الشبكة. ونظرًا لإمكانية ظهور بتة كمومية واحدة في أكثر من خلية وحدة، فإن اللويحات ليست متقاطعة. في شبكة heavy hex، تحتوي اللويحة على 12 بتة كمومية. كما تُشكّل اللويحات بحد ذاتها شبكة، حيث تكون لويحتان متصلتين إذا كانتا تتشاركان أي بتات كمومية. في شبكة heavy hex، تتشارك اللويحات المتجاورة 3 بتات كمومية.
في حزمة برامج GEM Suite، الفئة الأساسية لتنفيذ بروتوكول GEM هي PlaquetteLattice، التي تمثل شبكة اللويحات (وهي مختلفة عن شبكة heavy hex). يمكن تهيئة PlaquetteLattice من خريطة اقتران البتات الكمومية. حاليًا، لا تُدعم إلا خرائط اقتران heavy hex.
تُهيئ خلية الكود التالية شبكة لويحات من خريطة اقتران معالج IBM كمي. لا تشمل شبكة اللويحات دائمًا الجهاز بأكمله. على سبيل المثال، يحتوي ibm_torino على 133 بتة كمومية إجمالًا، لكن أكبر شبكة لويحات تناسب الجهاز تستخدم 125 منها فحسب، وتضم 18 لويحة إجمالًا. يمكن ملاحظة ما يشبه ذلك في أجهزة IBM Quantum® ذات أعداد مختلفة من البتات الكمومية أيضًا.
# QiskitRuntimeService.save_account(channel="ibm_quantum", token="<YOUR_API_KEYN>", overwrite=True, set_as_default=True)
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
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()))}")
Number of qubits in backend: 133
Number of qubits in plaquette lattice: 125
Number of plaquettes: 18
يمكنك تصور شبكة اللويحات بإنشاء مخطط لتمثيلها البياني. في المخطط، تُمثَّل اللويحات بسداسيات مُعلَّمة، وتُربط لويحتان بحافة إذا كانتا تتشاركان بتات كمومية.
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=[0, 1, 2, 3, 4, 15, 16, 19, 20, 21, 22, 23], neighbors=[3, 1])
يمكنك أيضًا إنتاج مخطط للبتات الكمومية الأساسية المكوِّنة لشبكة اللويحات.
plaquette_lattice.draw_qubits()

إضافة إلى تسميات البتات الكمومية والحواف الدالة على اتصالها، يتضمن المخطط ثلاث معلومات إضافية ذات صلة ببروتوكول GEM:
- كل بتة كمومية إما مظللة (باللون الرمادي) أو غير مظللة. البتات المظللة هي بتات "الموقع" التي تمثل مواقع نموذج Ising، أما البتات غير المظللة فهي بتات "الرابطة" المستخدمة للوساطة في التفاعلات بين بتات الموقع.
- كل بتة موقع مُعلَّمة بـ (A) أو (B)، مما يشير إلى أحد دورين يمكن أن تضطلع بهما بتة الموقع في بروتوكول GEM (يُشرح الدوران لاحقًا).
- كل حافة مُلوَّنة بإحدى ست ألوان، مما يقسم الحواف إلى ست مجموعات. يحدد هذا التقسيم كيفية توازي بوابات ثنائية البتات الكمومية، فضلًا عن أنماط جدولة مختلفة يُرجَّح أن تُسبب قدرًا مختلفًا من الأخطاء على معالج كمي مُشوَّش. ونظرًا لأن الحواف في كل مجموعة متفرقة، يمكن تطبيق طبقة من بوابات ثنائية البتات على تلك الحواف في آنٍ واحد. في الواقع، من الممكن تقسيم الألوان الست إلى ثلاث مجموعات من لونين بحيث يظل اتحاد كل مجموعة من اللونين متفرقًا. وبالتالي، لا تلزم سوى ث لاث طبقات من بوابات ثنائية البتات لتنشيط كل حافة. ثمة 12 طريقة لتقسيم الألوان الست على هذا النحو، وينتج عن كل تقسيم جدول بوابات مختلف من 3 طبقات.
الآن بعد أن أنشأت شبكة لويحات، تتمثل الخطوة التالية في تهيئة كائن GemExperiment، مع تمرير شبكة اللويحات والخلفية التي تعتزم تشغيل التجربة عليها. تدير فئة GemExperiment التنفيذ الفعلي لبروتوكول GEM، بما في ذلك توليد الدوائر وإرسال المهام وتحليل البيانات. تُهيئ خلية الكود التالية فئة التجربة مع تقييد شبكة اللويحات بلويحتين فحسب (21 بتة كمومية)، مما يُقلص حجم التجربة لضمان عدم طغيان الضوضاء في الجهاز على الإشارة.
gem_exp = GemExperiment(plaquette_lattice.filter([9, 12]), backend=backend)
# visualize the plaquette lattice after filtering
plaquette_lattice.filter([9, 12]).draw_qubits()

تُبنى دارة بروتوكول GEM وفق الخطوات التالية:
- تحضير حالة الكلية بتطبيق بوابة Hadamard على كل بتة كمومية.
- تطبيق بوابة بين كل زوج من البتات الكمومية المتصلة. يمكن تحقيق ذلك باستخدام 3 طبقات من البوابات. تعمل كل بوابة على بتة موقع وبتة رابطة. إذا كانت بتة الموقع مُعلَّمة بـ (B)، فإن الزاوية تكون ثابتة عند . أما إذا كانت بتة الموقع مُعلَّمة بـ (A)، فإن الزاوية مسموح لها بالتغيير، مما ينتج دوائر مختلفة. بشكل افتراضي، يُضبط نطاق الزوايا على 21 نقطة متساوية التباعد بين و شاملةً طرفيه.
- قياس كل بتة رابطة في أساس Pauli . نظرًا لأن البتات الكمومية تُقاس في أساس Pauli ، يمكن تحقيق ذلك بتطبيق بوابة Hadamard قبل قياس البتة الكمومية.
لاحظ أن الورقة المشار إليها في مقدمة هذا البرنامج التعليمي تستخدم اصطلاحًا مختلفًا لزاوية ، يختلف عن الاصطلاح المستخدم هنا بعامل مقداره 2.
في الخطوة 3، تُقاس بتات الرابطة فحسب. لفهم الحالة التي تبقى عليها بتات الموقع، من المفيد النظر في الحالة التي تكون فيها زاوية المُطبَّقة على بتات الموقع (A) في الخطوة 2 مساوية لـ . في هذه الحالة، تبقى بتات الموقع في حالة شديدة التشابك تشبه حالة GHZ،
نظرًا لعشوائية نتائج القياس، قد تكون الحالة الفعلية لبتات الموقع حالة مختلفة ذات ترتيب بعيد المدى، مثل . غير أن حالة GHZ يمكن استعادتها بتطبيق عملية فك ترميز مبنية على نتائج القياس. عند خفض زاوية من ، لا يزال بالإمكان استعادة الترتيب بعيد المدى حتى زاوية حرجة تبلغ في غياب الضوضاء نحو . دون هذه الزاوية، لا تُظهر الحالة الناتجة تشابكًا بعيد المدى بعد الآن. هذا الانتقال بين وجود الترتيب بعيد المدى وغيابه هو انتقال طور نيشيموري.
في الوصف أعلاه، بقيت بتات الموقع دون قياس، ويمكن إجراء عملية فك الترميز بتطبيق بوابات كمية. أما في التجربة كما نُفِّذت في GEM suite، والتي يتبعها هذا البرنامج التعليمي، فإن بتات الموقع تُقاس فعلًا، وتُطبَّق عملية فك الترميز في خطوة معالجة كلاسيكية لاحقة.
في الوصف أعلاه، يمكن إجراء عملية فك الترميز بتطبيق بوابات كمية على بتات الموقع لاستعادة الحالة الكمومية. أما إذا كان الهدف هو قياس الحالة فورًا، مثلًا لأغراض التوصيف، فإن بتات الموقع تُقاس مع بتات الرابطة، ويمكن تطبيق عملية فك الترميز في خطوة معالجة كلاسيكية لاحقة. وهكذا تُنفَّذ التجربة في 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=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)
