انتقل إلى المحتوى الرئيسي

البوابات الكسرية

إصدارات الحزم

تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو ما هو أحدث منها.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

تُعرّف هذه الصفحة نوعين من البوابات المدعومة حديثًا على أسطول IBM Quantum® من وحدات معالجة الكم (QPUs). تُدعم هذه البوابات الكسرية على وحدات Heron QPUs بالأشكال التالية:

  • RZZ(θ)R_{ZZ}(\theta) لـ 0<θπ/20 \lt \theta \leq \pi/2
  • RX(θ)R_X(\theta) لأي قيمة θ\theta

تناقش هذه الصفحة حالات الاستخدام التي يمكن فيها لتطبيق البوابات الكسرية أن يحسّن كفاءة سير عملك، إلى جانب كيفية استخدام هذه البوابات على وحدات IBM Quantum QPUs.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime

كيفية استخدام البوابات الكسرية

تعمل هذه البوابات الكسرية داخليًا بتنفيذ دوران RZZ(θ)R_{ZZ}(\theta) و RX(θ)R_X(\theta) مباشرةً بزاوية اعتباطية. يمكن لاستخدام بوابة RX(θ)R_X(\theta) أن يُقلّص مدة الدائرة والخطأ في دورات أحادية الكيوبت بزوايا اعتباطية بمقدار يصل إلى ضعفين. كذلك يتيح التنفيذ المباشر لدوران بوابة RZZ(θ)R_{ZZ}(\theta) تجنّب التحليل إلى كائنات 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")

Output of the previous code cell

حدّد كائنَي 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(),
)

Output of the previous code cell

# 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(),
)

Output of the previous code cell

قيود الزوايا

بالنسبة لبوابة RZZ(θ)R_{ZZ}(\theta) ثنائية الكيوبت، لا يمكن تنفيذ إلا الزوايا الواقعة بين 00 و π/2\pi/2 على عتاد IBM Quantum. إذا احتوت الدائرة على أي بوابات RZZ(θ)R_{ZZ}(\theta) بزاوية خارج هذا النطاق، فإن خط أنابيب الترجمة القياسي عمومًا سيُصحّح ذلك بتحويل مناسب للدائرة (عبر تمريرة FoldRzzAngle). أما أي بوابة RZZ(θ)R_{ZZ}(\theta) تحتوي على Parameter واحد أو أكثر، فإن الـ Transpiler سيفترض أن هذه المعاملات ستُسنَد إليها زوايا ضمن هذا النطاق عند وقت التشغيل. ستفشل المهمة إذا كانت أي من قيم المعاملات المحددة في PUB المُرسَل إلى Qiskit Runtime خارج هذا النطاق.

أين تستخدم البوابات الكسرية

تاريخيًا، كانت البوابات الأساسية المتاحة على وحدات IBM Quantum QPUs هي CZ و**X** و**RZ** و**SX** و**ID**، والتي لا تستطيع تمثيل الدوائر ذات الدورات أحادية وثنائية الكيوبت التي ليست من مضاعفات π/2\pi / 2 بكفاءة. فعلى سبيل المثال، بوابة RX(θ)R_X(\theta) عند ترجمتها تنحلّ إلى سلسلة من بوابات RZRZ و X\sqrt{X}، مما ينتج عنه دائرة بها بوابتان ذواتا مدة محدودة بدلًا من واحدة.

وبالمثل، حين تُترجَم الدورات ثنائية الكيوبت مثل بوابة RZZ(θ)R_{ZZ}(\theta)، يتطلب التحليل بوابتَي CZ وعدة بوابات أحادية الكيوبت، مما يزيد عمق الدائرة. تُبيَّن هذه التحليلات في الكود التالي.

qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")

Output of the previous code cell

# 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)

Output of the previous code cell

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")

Output of the previous code cell

# 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)

Output of the previous code cell

في سير العمل الذي يتطلب دورات RX(θ)R_X(\theta) أحادية الكيوبت أو ثنائية الكيوبت كثيرة (كما في دالة أنساتز تغيّرية أو عند محاكاة التطور الزمني للأنظمة الكمومية)، يتسبب هذا القيد في تنامي عمق الدائرة بسرعة. غير أن البوابات الكسرية تُزيل هذا القيد، إذ تُنفَّذ الدورات أحادية وثنائية الكيوبت مباشرةً، مما ينتج عنه دائرة كمومية أكثر كفاءة (وبالتالي أقل خطأً).

متى لا تستخدم البوابات الكسرية

من المهم الإشارة إلى أن البوابات الكسرية ميزة تجريبية، وقد يتغير سلوك العلَم use_fractional_gates في المستقبل. راجع ملاحظات الإصدار للإصدارات الجديدة من Qiskit Runtime للاطلاع على مزيد من المعلومات. راجع أيضًا وثائق مرجع API لـ QiskitRuntimeService.backend، التي تصف use_fractional_gates.

بالإضافة إلى ذلك، قدرة الـ Transpiler في Qiskit على استخدام RZZ(θ)R_{ZZ}(\theta) في تمريرات التحسين محدودة. يستوجب هذا منك بذل عناية أكبر في صياغة الدوائر التي تحتوي على هذه التعليمات وتحسينها.

أخيرًا، استخدام البوابات الكسرية غير مدعوم في:

اقرأ الدليل الخاص بـ خيارات البدائيات لمعرفة المزيد حول تخصيص تقنيات تخفيف الأخطاء وقمعها لحمل العمل الكمومي المطلوب.

الخطوات التالية

توصيات