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

ضبط مستوى تحسين المحوّل

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

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

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

الأجهزة الكمومية الحقيقية عرضة للضوضاء وأخطاء البوابات، لذا فإن تحسين الدوائر لتقليل عمقها وعدد بواباتها يمكن أن يُحسّن بشكل ملحوظ النتائج التي نحصل عليها عند تنفيذ تلك الدوائر. تمتلك دالة generate_preset_pass_manager وسيطة موضعية مطلوبة واحدة هي optimization_level، وهي تتحكم في مقدار الجهد الذي يبذله المحوّل في تحسين الدوائر. يمكن أن تكون هذه الوسيطة عددًا صحيحًا يأخذ إحدى القيم 0 أو 1 أو 2 أو 3. مستويات التحسين الأعلى تُنتج دوائر أكثر تحسينًا على حساب أوقات تصريف أطول. يوضح الجدول التالي عمليات التحسين التي تُجرى مع كل إعداد.

مستوى التحسينالوصف
0

لا يوجد تحسين: يُستخدم عادةً لتوصيف الأجهزة

  • ترجمة أساسية
  • التخطيط/التوجيه: TrivialLayout، حيث يختار نفس أرقام Qubit المادية كأرقام افتراضية ويُدرج عمليات SWAP لجعلها تعمل (باستخدام SabreSwap)
1

تحسين خفيف:

  • التخطيط/التوجيه: يُحاوَل التخطيط أولاً باستخدام TrivialLayout. إذا كانت هناك حاجة إلى عمليات SWAP إضافية، يُعثر على تخطيط بأقل عدد من عمليات SWAP باستخدام SabreSwap، ثم يستخدم VF2LayoutPostLayout لمحاولة اختيار أفضل Qubits في الرسم البياني.
  • InverseCancellation
  • تحسين بوابات أحادية الـ Qubit
2

تحسين متوسط:

  • التخطيط/التوجيه: مستوى التحسين 1 (بدون trivial) + تحسين إرشادي بعمق بحث وتجارب أكبر لدالة التحسين. نظرًا لعدم استخدام TrivialLayout، لا تتم محاولة استخدام نفس أرقام Qubit المادية والافتراضية.
  • CommutativeCancellation
3

تحسين عالٍ:

  • مستوى التحسين 2 + تحسين إرشادي على التخطيط/التوجيه بجهد وتجارب أكبر
  • إعادة تركيب كتل البوابات ثنائية الـ Qubit باستخدام تحليل KAK لكارتان.
  • مسارات كسر الوحدوية:
    • OptimizeSwapBeforeMeasure: يُعيد ترتيب القياسات لتجنب عمليات SWAP
    • RemoveDiagonalGatesBeforeMeasure: يُزيل البوابات قبل القياسات التي لن تؤثر على القياسات

مستوى التحسين عملياً

بما أن بوابات الـ 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")

Output of the previous code cell

سنستخدم backend المحاكى FakeSherbrooke في أمثلتنا. أولاً، لنُجرِّب التحويل باستخدام مستوى التحسين 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)

Output of the previous code cell

تحتوي الدائرة المحوَّلة على ست بوابات 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)

Output of the previous code cell

لا تزال الدائرة المحوَّلة تحتوي على ست بوابات 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)

Output of the previous code cell

يُعطي هذا نفس النتائج كمستوى التحسين 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)

Output of the previous code cell

الآن، لا يوجد سوى ثلاث بوابات 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)

Output of the previous code cell

تحتوي هذه الدائرة على بوابتي 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. للاطلاع على أمثلة حول كيفية تأثير مستوى التحسين على التخطيط، راجع تمثيل الحواسيب الكمومية.

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

توصيات