ضبط مستوى تحسين المحوّل
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
الأجهزة الكمومية الحقيقية عرضة للضوضاء وأخطاء البوابات، لذا فإن تحسين الدوائر لتقليل عمقها وعدد بواباتها يمكن أن يُحسّن بشكل ملحوظ النتائج التي نحصل عليها عند تنفيذ تلك الدوائر.
تمتلك دالة generate_preset_pass_manager وسيطة موضعية مطلوبة واحدة هي optimization_level، وهي تتحكم في مقدار الجهد الذي يبذله المحوّل في تحسين الدوائر. يمكن أن تكون هذه الوسيطة عددًا صحيحًا يأخذ إحدى القيم 0 أو 1 أو 2 أو 3.
مستويات التحسين الأعلى تُنتج دوائر أكثر تحسينًا على حساب أوقات تصريف أطول.
يوضح الجدول التالي عمليات التحسين التي تُجرى مع كل إعداد.
| مستوى التحسين | الوصف |
|---|---|
| 0 | لا يوجد تحسين: يُستخدم عادةً لتوصيف الأجهزة
|
| 1 | تحسين خفيف:
|
| 2 | تحسين متوسط:
|
| 3 | تحسين عالٍ:
|
مستوى التحسين عملياً
بما أن بوابات الـ qubit الثنائية هي عادةً المصدر الأكثر أهمية للأخطاء، يمكننا قياس "كفاءة الجهاز" للعملية التحويلية بشكل تقريبي عن طريق حساب عدد بوابات الـ qubit الثنائية في الدائرة الناتجة. هنا، سنجرب مستويات التحسين المختلفة على دائرة مدخلة تتكون من مؤثر وحدوي عشوائي يعقبه بوابة SWAP.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import Operator, random_unitary
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qc = QuantumCircuit(2)
qc.append(rand_U, range(2))
qc.swap(0, 1)
qc.draw("mpl", style="iqp")
يُستخدم في هذه الأمثلة backend المحاكى FakeSherbrooke من qiskit_ibm_runtime، لكن يمكنك تجربته على أي backend حقيقي أو محاكى متوافق مع Qiskit. قد تختلف نتائجك.
أولاً، لنُجرِّب التحويل باستخدام مستوى التحسين 0.
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
optimization_level=0, backend=backend, seed_transpiler=12345
)
qc_t1_exact = pass_manager.run(qc)
qc_t1_exact.draw("mpl", idle_wires=False)
تحتوي الدائرة المحوَّلة على ست بوابات ECR ثنائية الـ qubit.
كرر للحصول على مستوى التحسين 1:
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, seed_transpiler=12345
)
qc_t1_exact = pass_manager.run(qc)
qc_t1_exact.draw("mpl", idle_wires=False)
لا تزال الدائرة المحوَّلة تحتوي على ست بوابات ECR، لكن عدد بوابات الـ qubit الأحادية قد تقلّص.
كرر للحصول على مستوى التحسين 2:
pass_manager = generate_preset_pass_manager(
optimization_level=2, backend=backend, seed_transpiler=12345
)
qc_t2_exact = pass_manager.run(qc)
qc_t2_exact.draw("mpl", idle_wires=False)
يُعطي هذا نفس النتائج كمستوى التحسين 1. لاحظ أن رفع مستوى التحسين لا يُحدث فرقاً في كل الأحوال.
كرر مجدداً، مع مستوى التحسين 3:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, seed_transpiler=12345
)
qc_t3_exact = pass_manager.run(qc)
qc_t3_exact.draw("mpl", idle_wires=False)
الآن، لا يوجد سوى ثلاث بوابات ECR فقط. نحصل على هذه النتيجة لأنه في مستوى التحسين 3، يحاول Qiskit إعادة تركيب كتل البوابات ثنائية الـ qubit، وأي بوابة ثنائية الـ qubit يمكن تنفيذها باستخدام ثلاث بوابات ECR كحد أقصى. يمكننا الحصول على عدد أقل من بوابات ECR إذا ضبطنا approximation_degree على قيمة أقل من 1، مما يسمح للمحوّل بإجراء تقريبات قد تُدخل بعض الأخطاء في تحليل البوابات (انظر المعاملات الشائعة الاستخدام للتحويل):
pass_manager = generate_preset_pass_manager(
optimization_level=3,
approximation_degree=0.99,
backend=backend,
seed_transpiler=12345,
)
qc_t3_approx = pass_manager.run(qc)
qc_t3_approx.draw("mpl", idle_wires=False)
تحتوي هذه الدائرة على بوابتي ECR فقط، لكنها دائرة تقريبية. لفهم كيف يختلف تأثيرها عن الدائرة الدقيقة، يمكننا حساب الإخلاص (fidelity) بين المؤثر الوحدوي الذي تُنفّذه هذه الدائرة والمؤثر الوحدوي الدقيق. قبل إجراء الحساب، نُقلّص أولاً الدائرة المحوَّلة التي تحتوي على 127 qubit إلى دائرة تحتوي فقط على الـ qubits النشطة، وعددها اثنان.
import numpy as np
def trace_to_fidelity_2q(trace: float) -> float:
return (4.0 + trace * trace.conjugate()) / 20.0
# Reduce circuits down to 2 qubits so they are easy to simulate
qc_t3_exact_small = QuantumCircuit.from_instructions(qc_t3_exact)
qc_t3_approx_small = QuantumCircuit.from_instructions(qc_t3_approx)
# Compute the fidelity
exact_fid = trace_to_fidelity_2q(
np.trace(np.dot(Operator(qc_t3_exact_small).adjoint().data, UU))
)
approx_fid = trace_to_fidelity_2q(
np.trace(np.dot(Operator(qc_t3_approx_small).adjoint().data, UU))
)
print(
f"Synthesis fidelity\nExact: {exact_fid:.3f}\nApproximate: {approx_fid:.3f}"
)
Synthesis fidelity
Exact: 1.000+0.000j
Approximate: 0.992+0.000j
ضبط مستوى التحسين يمكن أن يُغيّر جوانب أخرى من الدائرة أيضاً، ليس فقط عدد بوابات ECR. للاطلاع على أمثلة حول كيفية تأثير مستوى التحسين على التخطيط، راجع تمثيل الحواسيب الكمومية.
الخطوات التالية
- لمعرفة المزيد عن دالة
generate_preset_passmanager، ابدأ بموضوع الإعدادات الافتراضية وخيارات تهيئة التحويل. - واصل التعلم عن التحويل مع موضوع مراحل المحوّل.
- جرّب دليل مقارنة إعدادات المحوّل.
- جرّب درس بناء رموز التكرار.
- اطلع على توثيق Transpile API.