البوابات الكسرية
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو ما هو أحدث منها.
qiskit[all]~=2.3.1
qiskit-ibm-runtime~=0.45.1
تُعرّف هذه الصفحة نوعين من البوابات المدعومة حديثًا على أسطول IBM Quantum® من وحدات معالجة الكم (QPUs). تُدعم هذه البوابات الكسرية على وحدات Heron QPUs بالأشكال التالية:
- لـ
- لأي قيمة
تناقش هذه الصفحة حالات الاستخدام التي يمكن فيها لتطبيق البوابات الكسرية أن يحسّن كفاءة سير عملك، إلى جانب كيفية استخدام هذه البوابات على وحدات IBM Quantum QPUs.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
كيفية استخدام البوابات الكسرية
تعمل هذه البوابات الكسرية داخليًا بتنفيذ دوران و مباشرةً بزاوية اعتباطية. يمكن لاستخدام بوابة أن يُقلّص مدة الدائرة والخطأ في دورات أحادية الكيوبت بزوايا اعتباطية بمقدار يصل إلى ضعفين. كذلك يتيح التنفيذ المباشر لدوران بوابة تجنّب التحليل إلى كائنات CZGate متعددة، مما يُقلّص عمق الدائرة ونسبة الخطأ بالمثل. يُعدّ هذا مفيدًا بشكل خاص للدوائر التي تحتوي على عدد كبير من الدورات أحادية وثنائية الكيوبت، كما هو الحال عند محاكاة ديناميكيات نظام كمومي أو عند استخدام دالة أنساتز تغيّرية ذات معاملات كثيرة.
على الرغم من أن هذه الأنواع من البوابات موجودة في مكتبة البوابات القياسية التي يمكن لـ QuantumCircuit امتلاكها، إلا أنه لا يمكن استخدامها إلا على وحدات IBM Quantum QPUs المحددة، ويجب تحميلها مع ضبط العلَم use_fractional_gates على True (كما هو موضح أدناه). سيضمن هذا العلَم تضمين البوابات الكسرية في Target الخاص بالـ Backend للـ Transpiler.
service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)
يوضّح مثال الكود هذا كيفية استخدام البوابات الكسرية في سياق سير عمل يحاكي ديناميكيات سلسلة إيزينج باستخدام البوابات الكسرية. ثم تُقارَن مدة الدائرة مع Backend لا يستخدم البوابات الكسرية.
قيمة الخطأ المُبلَّغ عنها في Target الخاص بـ Backend مع تفعيل البوابات الكسرية هي مجرد نسخة من نظيرتها في البوابة غير الكسرية (والتي قد لا تكون متطابقة). والسبب في ذلك أن الإبلاغ عن معدلات الخطأ للبوابات الكسرية غير مدعوم بعد.
ومع ذلك، نظرًا لأن وقت البوابة الكسرية وغير الكسرية متماثل، فمن المنطقي افتراض أن معدلات خطئهما متقاربة — خاصةً حين يكون المصدر الرئيسي للخطأ في الدائرة ناتجًا عن الاسترخاء.
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple
from qiskit_ibm_runtime import QiskitRuntimeService
num_qubits = 5
num_time_steps = 3
rx_angle = 0.1
rzz_angle = 0.1
ising_circuit = QuantumCircuit(num_qubits)
for i in range(num_time_steps):
# rx layer
for q in range(num_qubits):
ising_circuit.rx(rx_angle, q)
for q in range(1, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
# 2nd rzz layer
for q in range(0, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
ising_circuit.barrier()
ising_circuit.draw("mpl")
حدّد كائنَي Backend: أحدهما مع تفعيل البوابات الكسرية والآخر مع تعطيلها، ثم قم بترجمتهما معًا.
service = QiskitRuntimeService()
backend_fractional = service.backend("ibm_torino", use_fractional_gates=True)
backend_conventional = service.backend(
"ibm_torino", use_fractional_gates=False
)
pm_fractional = generate_preset_pass_manager(
optimization_level=3, backend=backend_fractional, scheduling_method="alap"
)
pm_conventional = generate_preset_pass_manager(
optimization_level=3,
backend=backend_conventional,
scheduling_method="alap",
)
ising_circuit_fractional = pm_fractional.run(ising_circuit)
ising_circuit_conventional = pm_conventional.run(ising_circuit)
اعرض الجدول الزمني للدائرة باستخدام النوعين من البوابات.
# Draw timeline of circuit with conventional gates
draw_timeline(
ising_circuit_conventional,
idle_wires=False,
target=backend_conventional.target,
time_range=(0, 500),
style=IQXSimple(),
)
# Draw timeline of circuit with fractional gates
draw_timeline(
ising_circuit_fractional,
idle_wires=False,
target=backend_fractional.target,
time_range=(0, 500),
style=IQXSimple(),
)
قيود الزوايا
بالنسبة لبوابة ثنائية الكيوبت، لا يمكن تنفيذ إلا الزوايا الواقعة بين و على عتاد IBM Quantum. إذا احتوت الدائرة على أي بوابات بزاوية خارج هذا النطاق، فإن خط أنابيب الترجمة القياسي عمومًا سيُصحّح ذلك بتحويل مناسب للدائرة (عبر تمريرة FoldRzzAngle). أما أي بوابة تحتوي على Parameter واحد أو أكثر، فإن الـ Transpiler سيفترض أن هذه المعاملات ستُسنَد إليها زوايا ضمن هذا النطاق عند وقت التشغيل. ستفشل المهمة إذا كانت أي من قيم المعاملات المحددة في PUB المُرسَل إلى Qiskit Runtime خارج هذا النطاق.
أين تستخدم البوابات الكسرية
تاريخيًا، كانت البوابات الأساسية المتاحة على وحدات IBM Quantum QPUs هي CZ و**X** و**RZ** و**SX** و**ID**، والتي لا تستطيع تمثيل الدوائر ذات الدورات أحادية وثنائية الكيوبت التي ليست من مضاعفات بكفاءة. فعلى سبيل المثال، بوابة عند ترجمتها تنحلّ إلى سلسلة من بوابات و ، مما ينتج عنه دائرة بها بوابتان ذواتا مدة محدودة بدلًا من واحدة.
وبالمثل، حين تُترجَم الدورات ثنائية الكيوبت مثل بوابة ، يتطلب التحليل بوابتَي CZ وعدة بوابات أحادية الكيوبت، مما يزيد عمق الدائرة. تُبيَّن هذه التحليلات في الكود التالي.
qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")
# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
qc = QuantumCircuit(2)
param = Parameter("θ")
qc.rzz(param, 0, 1)
qc.draw("mpl")
# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
في سير العمل الذي يتطلب دورات أحادية الكيوبت أو ثنائية الكيوبت كثيرة (كما في دالة أنساتز تغيّرية أو عند محاكاة التطور الزمني للأنظمة الكمومية)، يتسبب هذا القيد في تنامي عمق الدائرة بسرعة. غير أن البوابات الكسرية تُزيل هذا القيد، إذ تُنفَّذ الدورات أحادية وثنائية الكيوبت مباشرةً، مما ينتج عنه دائرة كمومية أكثر كفاءة (وبالتالي أقل خطأً).
متى لا تستخدم البوابات الكسرية
من المهم الإشارة إلى أن البوابات الكسرية ميزة تجريبية، وقد يتغير سلوك العلَم use_fractional_gates في المستقبل. راجع ملاحظات الإصدار للإصدارات الجديدة من Qiskit Runtime للاطلاع على مزيد من المعلومات. راجع أيضًا وثائق مرجع API لـ QiskitRuntimeService.backend، التي تصف use_fractional_gates.
بالإضافة إلى ذلك، قدرة الـ Transpiler في Qiskit على استخدام في تمريرات التحسين محدودة. يستوجب هذا منك بذل عناية أكبر في صياغة الدوائر التي تحتوي على هذه التعليمات وتحسينها.
أخيرًا، استخدام البوابات الكسرية غير مدعوم في:
- الدوائر الديناميكية
- التفتيل البولي - ومع ذلك، تفتيل القياس مع TREX مدعوم.
- إلغاء الخطأ الاحتمالي
- الاستقراء عند انعدام الضوضاء (باستخدام تضخيم الخطأ الاحتمالي)
اقرأ الدليل الخاص بـ خيارات البدائيات لمعرفة المزيد حول تخصيص تقنيات تخفيف الأخطاء وقمعها لحمل العمل الكمومي المطلوب.
الخطوات التالية
- لمعرفة المزيد عن الترجمة، راجع صفحة مقدمة إلى الترجمة.
- اقرأ عن كتابة تمريرة Transpiler مخصصة.
- تعرّف على كيفية ضبط تخفيف الأخطاء لـ Qiskit Runtime.