تثبيت إضافات المُحوِّل واستخدامها
إصدارات الحزم
الكود في هذه الصفحة جرى تطويره باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو ما هو أحدث منها.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
لتسهيل تطوير كود التحويل (transpilation) المخصص وإعادة استخدامه من قِبَل مجتمع مستخدمي Qiskit الأوسع، يدعم Qiskit SDK واجهة إضافات (plugin interface) تتيح لحزم Python الخارجية الإعلان عن تقديمها وظائف تحويل موسّعة يمكن الوصول إليها عبر Qiskit.
حاليًا، يمكن للإضافات الخارجية توفير وظائف التحويل الموسّعة بثلاث طرق:
- إضافة مرحلة Transpiler توفّر مدير تمريرات (pass manager) يمكن استخدامه بدلًا من إحدى المراحل الست في مدير التمريرات المرحلي المُعدّ مسبقًا:
initوlayoutوroutingوtranslationوoptimizationوscheduling. - إضافة تركيب أحادي الوحدة (unitary synthesis) توفّر وظائف موسّعة لتركيب البوابات الأحادية.
- إضافة التركيب عالي المستوى (high-level synthesis) توفّر وظائف موسّعة لتركيب "الكائنات عالية المستوى" كالدوال الخطية أو معاملات Clifford. تُمثَّل الكائنات عالية المستوى بالفئات الفرعية من فئة Operation.
يصف الجزء التالي من الصفحة كيفية عرض الإضافات المتاحة وتثبيت إضافات جديدة واستخدامها.
عرض الإضافات المتاحة وتثبيت إضافات جديدة
يتضمّن Qiskit بالفعل بعض الإضافات المدمجة للتحويل. لتثبيت المزيد، يمكنك استخدام مدير حزم Python الخاص بك. مثلًا، يمكنك تشغيل pip install qiskit-toqm لتثبيت إضافة مرحلة التوجيه Qiskit TOQM. عدد من الإضافات الخارجية هي جزء من نظام Qiskit البيئي.
عرض إضافات مرحلة Transpiler المتاحة
استخدم دالة list_stage_plugins، مع تمرير اسم المرحلة التي تريد عرض إضافاتها.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins
list_stage_plugins("layout")
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")
['basic', 'default', 'lookahead', 'none', 'sabre']
لو كان qiskit-toqm مثبَّتًا، لظهر toqm في قائمة إضافات routing.
عرض إضافات التركيب الأحادي (unitary synthesis) المتاحة
استخدم دالة unitary_synthesis_plugin_names.
from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names
unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
عرض إضافات التركيب عالي المستوى (high-level synthesis) المتاحة
استخدم دالة high_level_synthesis_plugin_names، مع تمرير اسم نوع "الكائن عالي المستوى" المراد تركيبه. يتوافق الاسم مع الخاصية name في فئة Operation التي تُمثّل نوع الكائن الجاري تركيبه.
from qiskit.transpiler.passes.synthesis import (
high_level_synthesis_plugin_names,
)
high_level_synthesis_plugin_names("clifford")
['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']
يمكنك استخدام فئة HighLevelSynthesisPluginManager لعرض أسماء جميع إضافات التركيب عالي المستوى:
from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)
HighLevelSynthesisPluginManager().plugins.names()
['FullAdder.default',
'FullAdder.ripple_c04',
'FullAdder.ripple_v95',
'HalfAdder.default',
'HalfAdder.qft_d00',
'HalfAdder.ripple_c04',
'HalfAdder.ripple_r25',
'HalfAdder.ripple_v95',
'IntComp.default',
'IntComp.noaux',
'IntComp.twos',
'ModularAdder.default',
'ModularAdder.modular_v17',
'ModularAdder.qft_d00',
'ModularAdder.ripple_c04',
'ModularAdder.ripple_v95',
'Multiplier.cumulative_h18',
'Multiplier.default',
'Multiplier.qft_r17',
'PauliEvolution.default',
'PauliEvolution.rustiq',
'WeightedSum.default',
'annotated.default',
'clifford.ag',
'clifford.bm',
'clifford.default',
'clifford.greedy',
'clifford.layers',
'clifford.lnn',
'linear_function.default',
'linear_function.kms',
'linear_function.pmh',
'mcmt.default',
'mcmt.noaux',
'mcmt.vchain',
'mcmt.xgate',
'mcx.1_clean_b95',
'mcx.1_clean_kg24',
'mcx.1_dirty_kg24',
'mcx.2_clean_kg24',
'mcx.2_dirty_kg24',
'mcx.default',
'mcx.gray_code',
'mcx.n_clean_m15',
'mcx.n_dirty_i15',
'mcx.noaux_hp24',
'mcx.noaux_v24',
'permutation.acg',
'permutation.basic',
'permutation.default',
'permutation.kms',
'permutation.token_swapper',
'qft.default',
'qft.full',
'qft.line',
'clifford.rb_default']
استخدام إضافة
في هذا القسم، نوضح كيفية استخدام إضافات Transpiler. في أمثلة الكود، نستخدم إضافات مُدمجة مع Qiskit، غير أن الإضافات المثبَّتة من حزم خارجية تُستخدم بالطريقة ذاتها.
استخدام إضافة مرحلة Transpiler
لاستخدام إضافة مرحلة Transpiler، حدِّد اسمها في الوسيط المناسب لـ generate_preset_pass_manager أو transpile. يتشك ّل الوسيط بإلحاق _method باسم مرحلة التحويل. مثلًا، لاستخدام إضافة التوجيه lookahead، نُحدِّد lookahead في وسيط routing_method:
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, routing_method="lookahead"
)
استخدام إضافة التركيب الأحادي (unitary synthesis)
لاستخدام إضافة التركيب الأحادي، حدِّد اسمها كوسيط unitary_synthesis_method في generate_preset_pass_manager أو transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
unitary_synthesis_method="sk",
unitary_synthesis_plugin_config=dict(
basis_gates=["cz", "id", "rz", "sx", "x"]
),
)
يُستخدم التركيب الأحادي في مراحل init وtranslation وoptimization من مدير التمريرات المرحلي الذي يُعيده generate_preset_pass_manager أو الذي يستخدمه transpile. راجع مراحل Transpiler للاطلاع على وصف هذه المراحل.
استخدم وسيط unitary_synthesis_plugin_config، وهو قاموس حر الشكل، لتمرير خيارات طريقة التركيب الأحادي. توثيق طريقة التركيب يشرح الخيارات التي تدعمها. راجع هذه القائمة للاطلاع على روابط توثيق إضافات التركيب الأحادي المدمجة.
استخدام إضافة التركيب عالي المستوى (high-level synthesis)
أولًا، أنشئ كائن HLSConfig لتخزين أسماء الإضافات التي ستُستخدم لمختلف الكائنات عالية المستوى. مثلًا:
from qiskit.transpiler.passes import HLSConfig
hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])
يُنشئ هذا الكود إعداد تركيب عالي المستوى الذي يستخدم إضافة layers لتركيب كائنات Clifford وإضافة pmh لتركيب كائنات LinearFunction. تتوافق أسماء الوسيطات الكلمية مع الخاصية name في فئة Operation التي تُمثّل نوع الكائن الجاري تركيبه. لكل كائن عالي المستوى، تُجرَّب قائمة الإضافات المحددة بالتسلسل حتى تنجح إحداها (في المثال أعلاه، تحتوي كل قائمة على إضافة واحدة فقط).
بدلًا من تحديد إضافة باسمها، يمكنك تمرير زوج (name, options)، حيث العنصر الثاني من الزوج هو قاموس يحتوي على خيارات الإضافة. توثيق طريقة التركيب يشرح الخيارات التي تدعمها. راجع هذه القائمة للاطلاع على روابط توثيق إضافات التركيب عالي المستوى المدمجة.
بعد إنشاء كائن HLSConfig، مرِّره كوسيط hls_config إلى generate_preset_pass_manager أو transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)
يُستخدم التركيب عالي المستوى في مراحل init وtranslation وoptimization من مدير التمريرات المرحلي الذي يُعيده generate_preset_pass_manager أو الذي يستخدمه transpile. راجع مراحل Transpiler للاطلاع على وصف هذه المراحل.
الخطوات التالية
- إنشاء إضافة Transpiler.
- اطّلع على الدروس التعليمية للاطلاع على أمثلة لتحويل الدوائر الكمية وتشغيلها.