הגדרות ברירת מחדל ואפשרויות תצורה של ה-Transpiler
גרסאות חבילות
הקוד בדף זה פותח בשימוש בדרישות הבאות. אנו ממליצים להשתמש בגרסאות אלה או חדשות יותר.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
מעגלים אבסטרקטיים חייבים לעבור טרנספילציה מפני ש-QPU-ים כוללים קבוצה מוגבלת של שערי בסיס ואינם יכולים לבצע פעולות שרירותיות. תפקיד ה-Transpiler הוא לשנות מעגלים שרירותיים כך שיוכלו לרוץ על QPU מסוים. הדבר נעשה על ידי תרגום המעגלים לשערי הבסיס הנתמכים, ועל ידי הוספת שערי SWAP לפי הצורך, כך שהקישוריות של המעגל תתאים לזו של ה-QPU.
כפי שמוסבר בטרנספילציה עם pass managers, ניתן ליצור pass manager באמצעות הפונקציה generate_preset_pass_manager ולהעביר מעגל או רשימת מעגלים למתודת run שלו כדי לבצע טרנספילציה עליהם. ניתן לקרוא ל-generate_preset_pass_manager עם רמת האופטימיזציה וה-Backend בלבד ולהשתמש בברירות המחדל לשאר האפשרויות, או להעביר ארגומנטים נוספים לפונקציה לכיוונון עדין של הטרנספילציה.
שימוש בסיסי ללא פרמטרים
בדוגמה זו, אנו מעבירים מעגל ו-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")
בצע טרנספילציה על המעגל וצפה בתוצאה:
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. ישנן שתי קבוצות של ארגומנטים: אלה המתארים את יעד הקומפילציה, ואלה המשפיעים על אופן פעולת ה-Transpiler.
כל הפרמטרים פרט ל-optimization_level הם אופציונליים. לפרטים מלאים, ראה את תיעוד ה-API של ה-Transpiler.
optimization_level(int) - כמה אופטימיזציה לבצע ע ל המעגלים. מספר שלם בטווח (0-3). רמות גבוהות יותר מייצרות מעגלים מאופטמים יותר, על חשבון זמן טרנספילציה ארוך יותר. ראה הגדרת רמת אופטימיזציה של ה-Transpiler לפרטים נוספים.
פרמטרים המשמשים לתיאור יעד הקומפילציה:
ארגומנטים אלה מתארים את ה-QPU היעד להרצת המעגל, כולל מידע כגון מפת הצימוד של ה-QPU (המתארת את הקישוריות של ה-Qubit-ים), שערי הבסיס הנתמכים על ידי ה-QPU, ושיעורי השגיאה של השערים.
פרמטרים רבים מאלה מתוארים בפירוט בפרמטרים נפוצים לטרנספילציה.
פרמטרי QPU (Backend)
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, כולל מידע על שגיאות שערים, שגיאות קריאה, זמני קוהרנטיות של Qubit-ים, וכן הלאה. מצא QPU שמספק מידע זה על ידי הרצתbackend.properties().timing_constraints(Dict[str, int] | None) - הגבלה אופציונלית של חומרת הבקרה על רזולוציית זמן ההוראות. מידע זה מסופק על ידי תצורת ה-QPU. אם ל-QPU אין הגבלה על הקצאת זמן ההוראות,timing_constraintsהואNoneולא בוצעת שום התאמה. QPU עשוי לדווח על קבוצת הגבלות, כלומר:granularity: ערך שלם המייצג את רזולוציית שער הפולס המינימלית ביחידות של 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 - חייב להינתן כמטריצת שכנות, כאשר כל רשומה מציינת את כל האינטראקציות הדו-Qubit המכוונות הנתמכות על ידי ה-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.