יצירת pass manager עבור Dynamical Decoupling
גרסאות חבילות
הקוד בדף זה פותח עם הדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות האלה או בגרסאות חדשות יותר.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
דף זה מדגים כיצד להשתמש ב-PadDynamicalDecoupling pass כדי להוסיף למעגל טכניקת דיכוי שגיאות הנקראת dynamical decoupling.
Dynamical decoupling עובד על ידי הוספת רצפי פולסים (המכונים רצפי dynamical decoupling) ל-qubits פנויים כדי לסובב אותם סביב ספירת בלוך, מה שמבטל את השפעת ערוצי הרעש ובכך מדכא דה-קוהרנטיות. רצפי הפולסים האלה דומים לפולסי ריפוקוס המשמשים בתהודה מגנטית גרעינית. לתיאור מלא, ראו את A Quantum Engineer's Guide to Superconducting Qubits.
מכיוון ש-PadDynamicalDecoupling pass פועל רק על מעגלים מתוזמנים וכולל gates שאינם בהכרח basis gates של היעד שלנו, תצטרכו גם את ה-passes ALAPScheduleAnalysis ו-BasisTranslator.
דוגמה זו משתמשת ב-ibm_fez, שאותחל מראש. קבלו את מידע ה-target מה-backend ושמרו את שמות הפעולות בתור basis_gates, כיוון שיהיה צורך לשנות את ה-target כדי להוסיף מידע תזמון עבור ה-gates המשמשים ב-dynamical decoupling.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
target = backend.target
basis_gates = list(target.operation_names)
צרו מעגל efficient_su2 כדוגמה. ראשית, בצעו transpile למעגל לפי ה-backend כיוון שפולסי dynamical decoupling צריכים להתווסף לאחר שהמעגל עבר transpilation ותזמון. Dynamical decoupling עובד לרוב הכי טוב כשיש הרבה זמן סרק במעגלים הקוונטיים — כלומר, יש qubits שאינם בשימוש בזמן שאחרים פעילים. זה המצב במעגל הזה כי ה-gates הדו-קוביטיים מסוג ecr מוחלים ברצף ב-ansatz זה.
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
pm = generate_preset_pass_manager(1, target=target, seed_transpiler=12345)
qc_t = pm.run(qc)
qc_t.draw("mpl", fold=-1, idle_wires=False)
רצף dynamical decoupling הוא סדרה של gates שמרכיבים יחד את הזהות ומרווחים באופן קבוע בזמן. לדוגמה, התחילו בייצור רצף פשוט הנקרא XY4 המורכב מארבעה gates.
from qiskit.circuit.library import XGate, YGate
X = XGate()
Y = YGate()
dd_sequence = [X, Y, X, Y]
בשל התזמון הקבוע של רצפי dynamical decoupling, יש להוסיף מידע על YGate ל-target כיוון שהוא אינו basis gate, בשונה מ-XGate. אנחנו יודעים מראש ש-YGate בעל אותה משך וטעות כמו XGate, כך שניתן פשוט לאחזר את אותן תכונות מה-target ולהוסיף אותן עבור אובייקטי YGate. זו גם הסיבה ש-basis_gates נשמרו בנפרד, מכיוון שאנחנו מוסיפים את הוראת YGate ל-target למרות שהיא אינה basis gate בפועל של ibm_fez.
from qiskit.transpiler import InstructionProperties
y_gate_properties = {}
for qubit in range(target.num_qubits):
y_gate_properties.update(
{
(qubit,): InstructionProperties(
duration=target["x"][(qubit,)].duration,
error=target["x"][(qubit,)].error,
)
}
)
target.add_instruction(YGate(), y_gate_properties)
מעגלי ansatz כגון efficient_su2 הם פרמטריים, לכן יש לקשור להם ערכים לפני שליחתם ל-backend. כאן נשייך פרמטרים אקראיים.
import numpy as np
rng = np.random.default_rng(1234)
qc_t.assign_parameters(
rng.uniform(-np.pi, np.pi, qc_t.num_parameters), inplace=True
)
בשלב הבא, הפעילו את ה-passes המותאמים אישית. אתחלו את PassManager עם ALAPScheduleAnalysis ו-PadDynamicalDecoupling. הריצו קודם את ALAPScheduleAnalysis כדי להוסיף מידע תזמון על המעגל הקוונטי, לפני שניתן להוסיף את רצפי dynamical decoupling המרווחים באופן קבוע. ה-passes האלה מורצים על המעגל עם .run().
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes.scheduling import (
ALAPScheduleAnalysis,
PadDynamicalDecoupling,
)
dd_pm = PassManager(
[
ALAPScheduleAnalysis(target=target),
PadDynamicalDecoupling(target=target, dd_sequence=dd_sequence),
]
)
qc_dd = dd_pm.run(qc_t)
השתמשו בכלי הוויזואליזציה timeline_drawer כדי לראות את תזמון המעגל ולאשר שרצף מרווח באופן קבוע של אובייקטי XGate ו-YGate מופיע במעגל.
from qiskit.visualization import timeline_drawer
timeline_drawer(qc_dd, idle_wires=False, target=target)
לבסוף, מכיוון ש-YGate אינו basis gate בפועל של ה-backend שלנו, יש להחיל ידנית את ה-BasisTranslator pass (זהו pass ברירת מחדל, אך הוא מורץ לפני התזמון, לכן צריך להחילו שוב). ספריית השוויוניות של הסשן היא ספרייה של שוויוניות מעגלים המאפשרת ל-Transpiler לפרק מעגלים ל-basis gates, כפי שמצוין גם כארגומנט.
from qiskit.circuit.equivalence_library import (
SessionEquivalenceLibrary as sel,
)
from qiskit.transpiler.passes import BasisTranslator
qc_dd = BasisTranslator(sel, basis_gates)(qc_dd)
qc_dd.draw("mpl", fold=-1, idle_wires=False)
כעת, אובייקטי YGate אינם נמצאים במעגל שלנו, ויש מידע תזמון מפורש בצורת gates מסוג Delay. המעגל המתורגם עם dynamical decoupling מוכן כעת לשליחה ל-backend.
צעדים הבאים
- כדי ללמוד כיצד להשתמש בפונקציה
generate_preset_passmanagerבמקום לכתוב passes משלכם, התחילו עם הנושא הגדרות ברירת מחדל ואפשרויות תצורה לTranspilation. - נסו את המדריך השוואת הגדרות Transpiler.
- ראו את תיעוד ה-API של Transpile.