חיתוך מעגלים לתנאי גבול מחזוריים
הערכת שימוש: שתי דקות על מעבד Eagle (הערה: זוהי אומדן בלבד. זמן הריצה שלך עשוי להשתנות.)
רקע
במחברת זו, אנו בוחנים את הסימולציה של שרשרת מחזורית של Qubits שבה קיימת פעולת שני Qubits בין כל שני Qubits סמוכים, כולל הראשון והאחרון. שרשראות מחזוריות נמצאות לעתים קרובות בבעיות פיזיקה וכימיה כגון מודלים של Ising וסימולציה מולקולרית.
התקני IBM Quantum® הנוכחיים הם מישוריים. ניתן להטמיע חלק מהשרשראות המחזוריות על הטופולוגיה ישירות כאשר ה-Qubits הראשון והאחרון הם שכנים. עם זאת, עבור בעיות גדולות מספיק, ה-Qubits הראשון והאחרון יכולים להיות רחוקים זה מזה, ולכן נדרשים שערי SWAP רבים לפעולת 2-Qubit בין שני Qubits אלה. בעיית גבול מחזורי כזאת נחקרה במאמר זה.
במחברת זו אנו מציגים את השימוש בחיתוך מעגלים להתמודדות עם בעיית שרשרת מחזורית בסדר גודל שימושי כזו שבה ה-Qubits הראשון והאחרון אינם שכנים. חיתוך קישוריות ארוכת טווח זו נמנע משערי SWAP נוספים במחיר של ביצוע מופעים מרובים של המעגל, וקצת עיבוד קלאסי לאחר הביצוע. לסיכום, ניתן לשלב חיתוך כדי לחשב באופן לוגי את פעולות 2-Qubit למרחק ארוך. במילים אחרות, גישה זו מובילה לעלייה אפקטיבית בקישוריות של מפת הצימוד, ובכך מובילה למספר קטן יותר של שערי SWAP.
שימו לב שישנם שני סוגים של חיתוכים - חיתוך חוט של מעגל (הנקרא wire cutting), או החלפת שער 2-Qubit במספר פעולות יחיד Qubit (הנקראות gate cutting). במחברת זו, נתמקד בחיתוך שערים. לפרטים נוספים על חיתוך שערים, עיין בחומרי הסבר ב-qiskit-addon-cutting, ובהפניות המתאימות. לפרטים נוספים על חיתוך חוטים, עיין בחיתוך חוטים להערכת ערכי ציפייה, או במדריכים ב-qiskit-addon-cutting.
דרישות
לפני שמתחילים מדריך זה, וודא שיש לך את הדברים הבאים מותקנים:
- Qiskit SDK v1.2 ואילך (
pip install qiskit) - Qiskit Runtime v0.3 ואילך (
pip install qiskit-ibm-runtime) - Circuit cutting Qiskit addon v.9.0 ואילך (
pip install qiskit-addon-cutting)
הגדרה
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-addon-cutting qiskit-ibm-runtime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import (
BasisTranslator,
Optimize1qGatesDecomposition,
)
from qiskit.circuit.equivalence_library import (
SessionEquivalenceLibrary as sel,
)
from qiskit.converters import circuit_to_dag, dag_to_circuit
from qiskit.result import sampled_expectation_value
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.circuit.library import TwoLocal
from qiskit_addon_cutting import (
cut_gates,
generate_cutting_experiments,
reconstruct_expectation_values,
)
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2, SamplerOptions, Batch
שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית
כאן, נייצר מעגל TwoLocal ונגדיר כמה תצפיות.
- קלט: פרמטרים ליצירת מעגל
- פלט: מעגל מופשט ותצפיות
אנו שוקלים entangler map יעילה לחומרה עבור מעגל TwoLocal עם קישוריות מחזורית בין ה-Qubits האחרון והראשון של ה-entangler map. אינטראקציה ארוכת טווח זו יכולה להוביל לשערי SWAP נוספים במהלך הטרנספילציה, ובכך להגדיל את עומק המעגל.
בחירת Backend ו-Layout ראשוני
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
עבור מחברת זו נשקול שרשרת 1D מחזורית של 109 Qubits, שהיא השרשרת 1D הארוכה ביותר בטופולוגיה של התקן IBM Quantum בן 127 Qubits. לא ניתן לסדר שרשרת מחזורית של 109 Qubits על התקן של 127 Qubits כך שה-Qubits הראשון והאחרון יהיו שכנים מבלי לשלב שערי SWAP נוספים.
init_layout = [
13,
12,
11,
10,
9,
8,
7,
6,
5,
4,
3,
2,
1,
0,
14,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
36,
51,
50,
49,
48,
47,
46,
45,
44,
43,
42,
41,
40,
39,
38,
37,
52,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
74,
89,
88,
87,
86,
85,
84,
83,
82,
81,
80,
79,
78,
77,
76,
75,
90,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
112,
126,
125,
124,
123,
122,
121,
120,
119,
118,
117,
116,
115,
114,
113,
]
# the number of qubits in the circuit is governed by the length of the initial layout
num_qubits = len(init_layout)
num_qubits
109
בניית entangler map עבור מעגל TwoLocal
coupling_map = [(i, i + 1) for i in range(0, len(init_layout) - 1)]
coupling_map.append(
(len(init_layout) - 1, 0)
) # adding in the periodic connectivity
מעגל TwoLocal מאפשר את החזרה על ה-rotation_blocks וה-entangler map מספר פעמים. במקרה זה, מספר החזרות קובע את מספר השערים המחזוריים שצריכים להיות חתוכים. מכיוון שהעומס הסטטיסטי לדגימה גדל באופן אקספוננציאלי עם מספר החיתוכים (עיין במדריך חיתוך חוטים להערכת ערכי ציפייה לפרטים נוספים), נקבע את מספר החזרות ל-2 במחברת זו.
num_reps = 2
entangler_map = []
for even_edge in coupling_map[0 : len(coupling_map) : 2]:
entangler_map.append(even_edge)
for odd_edge in coupling_map[1 : len(coupling_map) : 2]:
entangler_map.append(odd_edge)
ansatz = TwoLocal(
num_qubits=num_qubits,
rotation_blocks="rx",
entanglement_blocks="cx",
entanglement=entangler_map,
reps=num_reps,
).decompose()
ansatz.draw("mpl", fold=-1)

כדי לאמת את איכות התוצאה באמצעות חיתוך מעגלים, אנחנו צריכים לדעת את התוצאה האידיאלית. המעגל הנוכחי שנבחר הוא מעבר לסימולציה קלאסית בכוח גס. לכן, אנו קובעים את הפרמטרים למעגל בזהירות כדי להפוך אותו ל-clifford.
נקצה את ערך הפרמטר עבור שתי השכבות הראשונות של שערי Rx, ואת הערך עבור השכבה האחרונה. זה מבטיח שהתוצאה האידיאלית של מעגל זה היא , כאשר הוא מספר ה-Qubits. לכן, ערכי הציפייה של ו-, כאשר הוא האינדקס של ה-Qubit, הם ו- בהתאמה.
params_last_layer = [np.pi] * ansatz.num_qubits
params = [0] * (ansatz.num_parameters - ansatz.num_qubits)
params.extend(params_last_layer)
ansatz.assign_parameters(params, inplace=True)