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

الإعدادات الافتراضية وخيارات الضبط للـ Transpiler

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

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

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

تحتاج الدوائر المجردة إلى transpilation لأن وحدات المعالجة الكمومية (QPUs) تمتلك مجموعة محدودة من البوابات الأساسية ولا تستطيع تنفيذ عمليات اعتباطية. وظيفة الـ Transpiler هي تحويل هذه الدوائر الاعتباطية لتتمكن من العمل على وحدة QPU محددة. يتم ذلك عبر ترجمة الدوائر إلى البوابات الأساسية المدعومة، وإدخال بوابات SWAP عند الحاجة، بحيث تتوافق اتصالية الدائرة مع اتصالية وحدة QPU.

كما هو موضح في الـ Transpile باستخدام pass managers، يمكنك إنشاء pass manager باستخدام دالة generate_preset_pass_manager وتمرير دائرة أو قائمة من الدوائر إلى طريقة run الخاصة بها لإجراء الـ transpilation. يمكنك استدعاء generate_preset_pass_manager بتمرير مستوى التحسين والـ backend فقط، مع الاكتفاء بالقيم الافتراضية لبقية الخيارات، أو يمكنك تمرير وسائط إضافية لضبط عملية الـ transpilation بدقة أكبر.

الاستخدام الأساسي بدون معاملات

في هذا المثال، نمرر دائرة ووحدة QPU المستهدفة إلى الـ Transpiler دون تحديد أي معاملات إضافية.

أنشئ دائرة واعرض النتيجة:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, DiagonalGate
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

# Create circuit to test transpiler on
oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))

# Add measurements to the circuit
qc.measure_all()

# View the circuit
qc.draw(output="mpl")

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

اعمل على transpile للدائرة واعرض النتيجة:

from qiskit.transpiler import generate_preset_pass_manager

# Specify the QPU to target
backend = FakeSherbrooke()

# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled_circ = pass_manager.run(qc)

# View the transpiled circuit
transpiled_circ.draw(output="mpl", idle_wires=False)

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

جميع المعاملات المتاحة

فيما يلي جميع المعاملات المتاحة لدالة generate_preset_pass_manager. هناك فئتان من الوسائط: تلك التي تصف هدف التجميع (compilation target)، وتلك التي تؤثر في طريقة عمل الـ Transpiler.

جميع المعاملات ما عدا optimization_level اختيارية. للاطلاع على التفاصيل الكاملة، راجع توثيق Transpiler API.

  • optimization_level (int) - مقدار التحسين الذي يُجرى على الدوائر. عدد صحيح في النطاق (0 - 3). المستويات الأعلى تُنتج دوائر أكثر تحسينًا، لكن على حساب وقت أطول للـ transpilation. راجع ضبط مستوى التحسين للـ Transpiler لمزيد من التفاصيل.

المعاملات المستخدمة لوصف هدف التجميع:

تصف هذه الوسائط وحدة QPU المستهدفة لتنفيذ الدائرة، وتشمل معلومات مثل خريطة الاقتران (coupling map) لوحدة QPU (التي تصف اتصالية الـ Qubits)، والبوابات الأساسية التي تدعمها وحدة QPU، ومعدلات خطأ البوابات.

كثير من هذه المعاملات مشروحة بالتفصيل في المعاملات الشائعة الاستخدام للـ transpilation.

معاملات وحدة QPU (Backend)

معاملات الـ Backend - إذا حددت backend، فلن تحتاج إلى تحديد target أو أي خيارات backend أخرى. وبالمثل، إذا حددت target، فلن تحتاج إلى تحديد backend أو أي خيارات backend أخرى.

  • backend (Backend) - إذا تم ضبط هذا، يقوم الـ Transpiler بتجميع دائرة الإدخال لهذا الجهاز. إذا تم ضبط أي خيار آخر يؤثر في هذه الإعدادات، مثل coupling_map، فإنه يتجاوز الإعدادات الواردة من backend.
  • target (Target) - هدف الـ Transpiler للـ backend. عادةً ما يُحدد هذا كجزء من وسيطة الـ backend، لكن إذا قمت بإنشاء كائن Target يدويًا، يمكنك تحديده هنا. يتجاوز هذا الهدف المُحدد من backend.
  • backend_properties (BackendProperties) - الخصائص التي تُعيدها وحدة QPU، بما فيها معلومات عن أخطاء البوابات وأخطاء القراءة وأوقات التماسك للـ Qubits وغيرها. اعثر على وحدة QPU تُوفر هذه المعلومات عبر تشغيل backend.properties().
  • timing_constraints (Dict[str, int] | None) - قيد اختياري على الأجهزة يتعلق بدقة توقيت التعليمات. تُوفر هذه المعلومات من إعداد وحدة QPU. إذا لم تكن لوحدة QPU أي قيود على توزيع وقت التعليمات، فإن timing_constraints تكون None ولا يُجرى أي تعديل. قد تُبلغ وحدة QPU عن مجموعة من القيود، وهي:
    • granularity: قيمة صحيحة تمثل الحد الأدنى لدقة بوابة النبضة (pulse gate) بوحدات dt. يجب أن تكون مدة بوابة النبضة المعرَّفة من قبل المستخدم من مضاعفات هذه القيمة.
    • min_length: قيمة صحيحة تمثل الحد الأدنى لطول بوابة النبضة بوحدات dt. يجب أن تكون بوابة النبضة المعرَّفة من قبل المستخدم أطول من هذا الحد.
    • pulse_alignment: قيمة صحيحة تمثل دقة توقيت وقت بدء تعليمات البوابة. يجب أن تبدأ تعليمات البوابة في وقت يمثل مضاعفًا لهذه القيمة.
    • acquire_alignment: قيمة صحيحة تمثل دقة توقيت وقت بدء تعليمات القياس. يجب أن تبدأ تعليمات القياس في وقت يمثل مضاعفًا لهذه القيمة.

معاملات التخطيط والطوبولوجيا

  • basis_gates (List[str] | None) - قائمة بأسماء البوابات الأساسية للتوسع إليها. مثلاً ['u1', 'u2', 'u3', 'cx']. إذا كانت None، لا يتم التوسع.
  • coupling_map (CouplingMap | List[List[int]]) - خريطة اقتران موجَّهة (ربما مخصصة) تُستهدف في عملية التعيين. إذا كانت خريطة الاقتران متماثلة، يجب تحديد الاتجاهين. الصيغ المدعومة هي:
    • نسخة CouplingMap
    • قائمة (List) - يجب إعطاؤها كمصفوفة تجاور، حيث تُحدد كل إدخال جميع التفاعلات الثنائية الموجَّهة بين الـ Qubits التي تدعمها وحدة QPU. مثلاً: [[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]
  • inst_map (List[InstructionScheduleMap] | None) - تعيين عمليات الدائرة إلى جداول النبضات. إذا كانت None، يُستخدم instruction_schedule_map الخاص بوحدة QPU.

المعاملات المستخدمة للتأثير في طريقة عمل الـ Transpiler

تؤثر هذه المعاملات في مراحل transpilation محددة. بعضها قد يؤثر في مراحل متعددة، لكنه مدرج تحت مرحلة واحدة فقط للتبسيط. إذا حددت وسيطةً ما، مثل initial_layout للـ Qubits التي تريد استخدامها، فإن هذه القيمة تتجاوز جميع المسارات (passes) التي يمكنها تغييرها. بمعنى آخر، لن يغيّر الـ Transpiler أي شيء قمت بتحديده يدويًا. للاطلاع على تفاصيل المراحل المحددة، راجع مراحل الـ Transpiler.

مرحلة التهيئة

  • hls_config (HLSConfig) - فئة إعداد اختيارية HLSConfig تُمرر مباشرةً إلى مسار التحويل HighLevelSynthesis. تتيح لك هذه الفئة تحديد قوائم خوارزميات التوليف ومعاملاتها لمختلف الكائنات عالية المستوى.
  • init_method (str) - اسم الإضافة (plugin) المستخدمة لمرحلة التهيئة. بشكل افتراضي، لا تُستخدم أي إضافة خارجية. يمكنك رؤية قائمة الإضافات المثبتة عبر تشغيل list_stage_plugins() مع init كوسيطة لاسم المرحلة.
  • unitary_synthesis_method (str) - اسم طريقة توليف الـ unitary المستخدمة. بشكل افتراضي، تُستخدم default. يمكنك رؤية قائمة الإضافات المثبتة عبر تشغيل unitary_synthesis_plugin_names().
  • unitary_synthesis_plugin_config (dict) - قاموس إعداد اختياري يُمرر مباشرةً إلى إضافة توليف الـ unitary. بشكل افتراضي، لا يكون لهذا الإعداد أي تأثير لأن طريقة توليف الـ unitary الافتراضية لا تقبل إعدادات مخصصة. يكون تطبيق إعداد مخصص ضروريًا فقط عند تحديد إضافة توليف unitary مع وسيطة unitary_synthesis. بما أن هذا خاص بكل إضافة، راجع توثيق الإضافة لمعرفة كيفية استخدام هذا الخيار.

مرحلة التخطيط (Layout)

  • initial_layout (Layout | Dict | List) - الموضع الأولي للـ Qubits الافتراضية على الـ Qubits الفيزيائية. إذا جعل هذا التخطيط الدائرة متوافقة مع قيود coupling_map، فسيُستخدم. لا يُضمن أن يكون التخطيط النهائي هو نفسه، إذ قد يُعيد الـ Transpiler ترتيب الـ Qubits عبر SWAP أو وسائل أخرى. للاطلاع على التفاصيل الكاملة، راجع قسم التخطيط الأولي.
  • layout_method (str) - اسم مسار اختيار التخطيط (default، dense، sabre، وtrivial). يمكن أن يكون هذا أيضًا اسم الإضافة الخارجية المستخدمة لمرحلة التخطيط. يمكنك رؤية قائمة الإضافات المثبتة عبر تشغيل list_stage_plugins() مع layout كوسيطة لـ stage_name. القيمة الافتراضية هي sabre.

مرحلة التوجيه (Routing)

  • routing_method (str) - اسم مسار التوجيه (basic، lookahead، default، sabre، أو none). يمكن أن يكون هذا أيضًا اسم الإضافة الخارجية المستخدمة لمرحلة التوجيه. يمكنك رؤية قائمة الإضافات المثبتة عبر تشغيل list_stage_plugins() مع routing كوسيطة لـ stage_name. القيمة الافتراضية هي sabre.

مرحلة الترجمة (Translation)

  • translation_method (str) - اسم مسار الترجمة (default، synthesis، translator، ibm_backend، ibm_dynamic_circuits، ibm_fractional). يمكن أن يكون هذا أيضًا اسم الإضافة الخارجية المستخدمة لمرحلة الترجمة. يمكنك رؤية قائمة الإضافات المثبتة عبر تشغيل list_stage_plugins() مع translation كوسيطة لـ stage_name. القيمة الافتراضية هي translator.

مرحلة التحسين (Optimization)

  • approximation_degree (float، في النطاق 0-1 | None) - مقياس هيوريستي يُستخدم لتقريب الدائرة (1.0 = بدون تقريب، 0.0 = تقريب أقصى). القيمة الافتراضية هي 1.0. تحديد None يضبط درجة التقريب على معدل الخطأ المُبلَّغ عنه. راجع قسم درجة التقريب لمزيد من التفاصيل.
  • optimization_method (str) - اسم الإضافة المستخدمة لمرحلة التحسين. بشكل افتراضي، لا تُستخدم أي إضافة خارجية. يمكنك رؤية قائمة الإضافات المثبتة عبر تشغيل list_stage_plugins() مع optimization كوسيطة لـ stage_name.

الجدولة (Scheduling)

  • scheduling_method (str) - اسم مسار الجدولة. يمكن أن يكون هذا أيضًا اسم الإضافة الخارجية المستخدمة لمرحلة الجدولة. يمكنك رؤية قائمة الإضافات المثبتة عبر تشغيل list_stage_plugins() مع scheduling كوسيطة لـ stage_name.
    • 'as_soon_as_possible': جدولة التعليمات بشكل جشع (greedy)، في أبكر وقت ممكن على مورد Qubit (الاختصار: asap).
    • 'as_late_as_possible': جدولة التعليمات متأخرًا، أي الإبقاء على الـ Qubits في الحالة الأساسية (ground state) قدر الإمكان (الاختصار: alap). هذا هو الإعداد الافتراضي.

تنفيذ الـ Transpiler

  • seed_transpiler (int) - يضبط البذور العشوائية (random seeds) للأجزاء العشوائية في الـ Transpiler.

تُستخدم القيم الافتراضية التالية إذا لم تُحدد أيًا من المعاملات السابقة. راجع صفحة مرجع API للطريقة لمزيد من المعلومات:

generate_preset_pass_manager(
optimization_level=1,
backend=None,
target=None,
basis_gates=None,
coupling_map=None,
initial_layout=None,
layout_method=None,
routing_method=None,
translation_method=None,
scheduling_method=None,
approximation_degree=1.0,
seed_transpiler=None,
unitary_synthesis_method="default",
unitary_synthesis_plugin_config=None,
hls_config=None,
init_method=None,
optimization_method=None,
)
<qiskit.transpiler.passmanager.StagedPassManager at 0x7fa3e6dab110>

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

توصيات