التحويل باستخدام مديري التمريرات
إصدارات الحزم
الكود في هذه الصفحة طُوِّر باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
الطريقة الموصى بها لتحويل دائرة ما هي إنشاء مدير تمريرات متدرّج ثم تنفيذ طريقة run الخاصة به مع الدائرة كمدخل. تشرح هذه الصفحة كيفية تحويل دوائر الكم بهذه الطريقة.
ما هو مدير التمريرات (المتدرّج)؟
في سياق Qiskit SDK، يشير التحويل (Transpilation) إلى عملية تحويل دائرة مدخلة إلى شكل مناسب للتنفيذ على جهاز كمي. يحدث التحويل عادةً في سلسلة من الخطوات تُسمّى تمريرات المُحوِّل (transpiler passes). تُعالَج الدائرة بواسطة كل تمريرة بالتسلسل، إذ يصبح مخرج تمريرة ما مدخلًا للتمريرة التالية. على سبيل المثال، قد تمر إحدى التمريرات عبر الدائرة وتدمج كل التسلسلات المتتالية من بوابات Qubit الفردية، ثم تقوم التمريرة التالية بتوليف هذه البوابات إلى مجموعة الأساس للجهاز المستهدف. تمريرات المُحوِّل المضمّنة في Qiskit موجودة في وحدة qiskit.transpiler.passes.
مدير التمريرات هو كائن يخزّن قائمة من تمريرات المُحوِّل ويمكنه تنفيذها على دائرة. أنشئ مدير تمريرات عن طريق تهيئة PassManager بقائمة من تمريرات المُحوِّل. لتشغيل التحويل على دائرة، استدعِ طريقة run مع الدائرة كمدخل.
مدير التمريرات المتدرّج هو نوع خاص من مديري التمريرات يمثّل مستوى تجريد أعلى من مدير التمريرات العادي. بينما يتكوّن مدير التمريرات العادي من عدة تمريرات مُحوِّل، يتكوّن مدير التمريرات المتدرّج من عدة مديري تمريرات. هذا تجريد مفيد لأن التحويل يحدث عادةً في مراحل منفصلة، كما هو موضّح في مراحل المُحوِّل، حيث تُمثَّل كل مرحلة بمدير تمريرات. يُمثَّل مديرو التمريرات المتدرّجة بالفئة StagedPassManager. يصف باقي هذه الصفحة كيفية إنشاء وتخصيص مديري التمريرات (المتدرّجة).
توليد مدير تمريرات متدرّج مُعدَّ مسبقًا
لإنشاء مدير تمريرات متدرّج مُعدَّ مسبقًا بإعدادات افتراضية معقولة، استخدم دالة generate_preset_pass_manager:
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
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
)
لتحويل دائرة أو قائمة من الدوائر باستخدام مدير التمريرات، مرّر الدائرة أو قائمة الدوائر إلى طريقة run. لنجرّب ذلك على دائرة ثنائية Qubit تتكوّن من بوابة Hadamard يتبعها بوابتا CX متجاورتان:
from qiskit import QuantumRegister, QuantumCircuit
# Create a circuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)
# Transpile it by calling the run method of the pass manager
transpiled = pass_manager.run(circuit)
# Draw it, excluding idle qubits from the diagram
transpiled.draw("mpl", idle_wires=False)
اطّلع على الإعدادات الافتراضية للتحويل وخيارات الضبط للاطلاع على وصف المعاملات الممكنة لدالة generate_preset_pass_manager. معاملات generate_preset_pass_manager تطابق معاملات دالة transpile.
إذا لم تُلبِّ مديرو التمريرات المُعدَّة مسبقًا احتياجاتك، فيمكنك تخصيص التحويل عن طريق إنشاء مديري تمريرات (متدرّجة) أو حتى تمريرات تحويل. يصف باقي هذه الصفحة كيفية إنشاء مديري التمريرات. للاطلاع على تعليمات إنشاء تمريرات التحويل، راجع اكتب تمريرة مُحوِّل خاصة بك.
إنشاء مدير تمريراتك الخاص
تحتوي وحدة qiskit.transpiler.passes على العديد من تمريرات المُحوِّل التي يمكن استخدامها لإنشاء مديري التمريرات. لإنشاء مدير تمريرات، هيّئ PassManager بقائمة من التمريرات. على سبيل المثال، ينشئ الكود التالي تمريرة مُحوِّل تدمج بوابات Qubit الثنائية المتجاورة ثم تولّفها إلى أساس من بوابات و و.
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import (
Collect2qBlocks,
ConsolidateBlocks,
UnitarySynthesis,
)
basis_gates = ["rx", "ry", "rxx"]
translate = PassManager(
[
Collect2qBlocks(),
ConsolidateBlocks(basis_gates=basis_gates),
UnitarySynthesis(basis_gates),
]
)
لإثبات عمل مدير التمريرات هذا، اختبره على دائرة ثنائية Qubit تتكوّن من بوابة Hadamard يتبعها بوابتا CX متجاورتان:
from qiskit import QuantumRegister, QuantumCircuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)
circuit.draw("mpl")
لتشغيل مدير التمريرات على الدائرة، استدعِ طريقة run.
translated = translate.run(circuit)
translated.draw("mpl")
للاطلاع على مثال أكثر تقدّمًا يوضّح كيفية إنشاء مدير تمريرات لتطبيق تقنية قمع الأخطاء المعروفة بالفصل الديناميكي، راجع إنشاء مدير تمريرات للفصل الديناميكي.
إنشاء مدير تمريرات متدرّج
StagedPassManager هو مدير تمريرات مؤلَّف من مراحل فردية، حيث تُعرَّف كل مرحلة بنسخة PassManager. يمكنك إنشاء StagedPassManager عن طريق تحديد المراحل المطلوبة. على سبيل المثال، ينشئ الكود التالي مدير تمريرات متدرّجًا بمرحلتين: init وtranslation. تُعرَّف مرحلة translation بمدير التمريرات الذي أُنشئ سابقًا.
from qiskit.transpiler import PassManager, StagedPassManager
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore
basis_gates = ["rx", "ry", "rxx"]
init = PassManager(
[UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]
)
staged_pm = StagedPassManager(
stages=["init", "translation"], init=init, translation=translate
)
لا يوجد حدٌّ لعدد المراحل التي يمكنك إضافتها في مدير التمريرات المتدرّج.
طريقة أخرى مفيدة لإنشاء مدير تمريرات متدرّج هي البدء بمدير تمريرات متدرّج مُعدَّ مسبقًا ثم استبدال بعض المراحل. على سبيل المثال، ينشئ الكود التالي مدير تمريرات مُعدَّ مسبقًا بمستوى تحسين 3، ثم يحدد مرحلة pre_layout مخصصة.
import numpy as np
from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate
from qiskit.transpiler.passes import InverseCancellation
pass_manager = generate_preset_pass_manager(3, backend)
inverse_gate_list = [
HGate(),
(RXGate(np.pi / 4), RXGate(-np.pi / 4)),
(PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),
(TGate(), TdgGate()),
]
logical_opt = PassManager(
[
InverseCancellation(inverse_gate_list),
]
)
# Add pre-layout stage to run extra logical optimization
pass_manager.pre_layout = logical_opt
قد تكون دوال مولّد المراحل مفيدة لبناء مديري التمريرات المخصصة.
تولّد هذه الدوال مراحل توفر وظائف شائعة تُستخدم في كثير من مديري التمريرات.
على سبيل المثال، يمكن استخدام generate_embed_passmanager لتوليد مرحلة
"تضمين" Layout أولي مختار من تمريرة تخطيط إلى الجهاز المستهدف المحدد.
الخطوات التالية
- اكتب تمريرة مُحوِّل مخصصة.
- إنشاء مدير تمريرات للفصل الديناميكي.
- لمعرفة المزيد عن دالة
generate_preset_passmanager، راجع موضوع الإعدادات الافتراضية للتحويل وخيارات الضبط. - جرّب دليل مقارنة إعدادات المُحوِّل.
- راجع توثيق واجهة برمجة المُحوِّل.