דלג לתוכן הראשי

טרנספילציה עם מנהלי מעברים

גרסאות חבילות

הקוד בדף זה פותח תוך שימוש בדרישות הבאות. אנו ממליצים להשתמש בגרסאות אלה או חדשות יותר.

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

הדרך המומלצת לבצע טרנספילציה של מעגל היא ליצור staged pass manager ולאחר מכן להפעיל את מתודת ה-run שלו עם המעגל כקלט. דף זה מסביר כיצד לבצע טרנספילציה של מעגלים קוונטיים בדרך זו.

מהו (staged) pass manager?

בהקשר של Qiskit SDK, טרנספילציה מתייחסת לתהליך של המרת מעגל קלט לצורה המתאימה להרצה על מכשיר קוונטי. הטרנספילציה מתרחשת בדרך כלל ברצף של שלבים הנקראים transpiler passes. המעגל עובר עיבוד בכל transpiler pass ברצף, כאשר הפלט של pass אחד הופך לקלט של הבא. לדוגמה, pass אחד יכול לעבור על המעגל ולמזג את כל הרצפות הרצופות של שערים חד-Qubit, ואז ה-pass הבא יכול לסנתז שערים אלה לתוך ערכת הבסיס של המכשיר המטרה. transpiler passes הכלולים ב-Qiskit נמצאים במודול qiskit.transpiler.passes.

pass manager הוא אובייקט שמאחסן רשימה של transpiler passes ויכול להפעיל אותם על מעגל. צור pass manager על ידי אתחול PassManager עם רשימה של transpiler passes. כדי להפעיל את הטרנספילציה על מעגל, קרא למתודת run עם מעגל כקלט.

staged pass manager הוא סוג מיוחד של pass manager שמייצג רמת הפשטה גבוהה יותר מזו של pass manager רגיל. בעוד שpass manager רגיל מורכב ממספר transpiler passes, staged pass manager מורכב ממספר pass managers. זוהי הפשטה שימושית מפני שהטרנספילציה מתרחשת בדרך כלל בשלבים נפרדים, כמתואר ב-Transpiler stages, כאשר כל שלב מיוצג על ידי pass manager. staged pass managers מיוצגים על ידי המחלקה StagedPassManager. שאר הדף הזה מתאר כיצד ליצור ולהתאים אישית (staged) pass managers.

יצירת staged pass manager מוגדר מראש

כדי ליצור staged pass manager מוגדר מראש עם ברירות מחדל סבירות, השתמש בפונקציה 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
)

כדי לבצע טרנספילציה של מעגל או רשימת מעגלים עם pass manager, העבר את המעגל או רשימת המעגלים למתודת run. בואו נעשה זאת על מעגל דו-Qubit המורכב מהדמארד ואחריו שני שערי 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)

Output of the previous code cell

ראה Transpilation defaults and configuration options לתיאור הארגומנטים האפשריים לפונקציה generate_preset_pass_manager. הארגומנטים של generate_preset_pass_manager תואמים לארגומנטים של פונקציית transpile.

Having trouble remembering pass manager details? Try asking Qiskit Code Assistant.

אם pass managers המוגדרים מראש אינם עונים על צרכיך, התאם אישית את הטרנספילציה על ידי יצירת (staged) pass managers או אפילו transpilation passes. שאר הדף הזה מתאר כיצד ליצור pass managers. להוראות כיצד ליצור transpilation passes, ראה Write your own transpiler pass.

יצירת pass manager משלך

המודול qiskit.transpiler.passes כולל transpiler passes רבים שניתן להשתמש בהם ליצירת pass managers. כדי ליצור pass manager, אתחל PassManager עם רשימה של passes. לדוגמה, הקוד הבא יוצר transpiler pass שממזג שערים דו-Qubit סמוכים ולאחר מכן מסנתז אותם לבסיס של שערי RyR_y, RzR_z ו-RxxR_{xx}.

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),
]
)

כדי להדגים את ה-pass manager הזה בפעולה, בדוק אותו על מעגל דו-Qubit המורכב מהדמארד ואחריו שני שערי 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")

Output of the previous code cell

כדי להפעיל את ה-pass manager על המעגל, קרא למתודת run.

translated = translate.run(circuit)
translated.draw("mpl")

Output of the previous code cell

לדוגמה מתקדמת יותר שמראה כיצד ליצור pass manager לממש את טכניקת דיכוי השגיאות הידועה בשם dynamical decoupling, ראה Create a pass manager for dynamical decoupling.

יצירת staged pass manager

StagedPassManager הוא pass manager המורכב משלבים נפרדים, כאשר כל שלב מוגדר על ידי מופע PassManager. אפשר ליצור StagedPassManager על ידי ציון השלבים הרצויים. לדוגמה, הקוד הבא יוצר staged pass manager עם שני שלבים, init ו-translation. שלב ה-translation מוגדר על ידי ה-pass manager שנוצר קודם.

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
)

אין הגבלה על מספר השלבים שאפשר לשים ב-staged pass manager.

דרך שימושית נוספת ליצירת staged pass manager היא להתחיל עם staged pass manager מוגדר מראש ואז להחליף חלק מהשלבים. לדוגמה, הקוד הבא יוצר pass manager מוגדר מראש עם רמת אופטימיזציה 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

פונקציות יוצרות שלבים עשויות להיות שימושיות לבניית pass managers מותאמים אישית. הן מייצרות שלבים שמספקים פונקציונליות נפוצה שנמצאת בשימוש במנהלי מעברים רבים. לדוגמה, ניתן להשתמש ב-generate_embed_passmanager ליצירת שלב ל-"הטמעת" Layout ראשוני שנבחר מ-layout pass למכשיר המטרה הנקוב.

השלבים הבאים

המלצה