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

סימולציה מדויקת ורועשת עם Qiskit Aer primitives

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

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

qiskit[all]~=2.3.0
qiskit-aer~=0.17

סימולציה מדויקת עם Qiskit primitives מדגים כיצד להשתמש ב-primitives הייחוסיים הכלולים ב-Qiskit לביצוע סימולציה מדויקת של מעגלים קוונטיים. מעבדי קוונטום קיימים כיום סובלים משגיאות, או רעש, ולכן תוצאות סימולציה מדויקת אינן משקפות בהכרח את התוצאות שהיית מצפה להן בעת הרצת מעגלים על חומרה אמיתית. בעוד ש-primitives הייחוסיים ב-Qiskit אינם תומכים במודל רעש, Qiskit Aer כולל מימושים של ה-primitives שכן תומכים במודל רעש. Qiskit Aer הוא סימולטור מעגלים קוונטיים בעל ביצועים גבוהים שניתן להשתמש בו במקום ה-primitives הייחוסיים לביצועים טובים יותר ותכונות נוספות. הוא חלק מ-Qiskit Ecosystem. במאמר זה, נדגים את השימוש ב-Qiskit Aer primitives לסימולציה מדויקת ורועשת.

הערות
  • נדרש qiskit-aer גרסה 0.14 ומעלה.
  • בעוד ש-Qiskit Aer primitives מממשים את ממשקי ה-primitive, הם אינם מספקים את אותן האפשרויות כמו Qiskit Runtime primitives. רמת חוסן (Resilience level), לדוגמה, אינה זמינה עם Qiskit Aer primitives.
  • ראה את תיעוד AerSimulator לפרטים על אפשרויות שיטת הסימולציה ש-Aer תומך בהן.

כדי לחקור סימולציה מדויקת ורועשת, צור מעגל דוגמה על שמונה Qubit:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer
from qiskit.circuit.library import efficient_su2

n_qubits = 8
circuit = efficient_su2(n_qubits)
circuit.draw("mpl")

Output of the previous code cell

מעגל זה מכיל פרמטרים לייצוג זוויות הסיבוב עבור Gate RyR_y ו-RzR_z. בעת סימולציה של מעגל זה, עלינו לציין ערכים מפורשים לפרמטרים אלו. בתא הבא, נציין כמה ערכים לפרמטרים אלו ונשתמש ב-Estimator primitive מ-Qiskit Aer לחישוב ערך הציפייה המדויק של האובייקטבל ZZZZZ \cdots Z.

from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator
from qiskit_aer.primitives import EstimatorV2 as Estimator

observable = SparsePauliOp("Z" * n_qubits)
params = [0.1] * circuit.num_parameters

exact_estimator = Estimator()
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(circuit)
pub = (isa_circuit, observable, params)
job = exact_estimator.run([pub])
result = job.result()
pub_result = result[0]
exact_value = float(pub_result.data.evs)
exact_value
0.8870140234256602

כעת, נאתחל מודל רעש הכולל שגיאת depolarizing של 2% על כל Gate CX. בפועל, השגיאה הנובעת מ-Gateים דו-קיוביטיים, שהם Gate CX כאן, הם המקור הדומיננטי לשגיאה בעת הרצת מעגל. ראה בניית מודלי רעש לסקירה של בניית מודלי רעש ב-Qiskit Aer.

בתא הבא, נבנה Estimator המשלב מודל רעש זה ונשתמש בו לחישוב ערך הציפייה של האובייקטבל.

from qiskit_aer.noise import NoiseModel, depolarizing_error

noise_model = NoiseModel()
cx_depolarizing_prob = 0.02
noise_model.add_all_qubit_quantum_error(
depolarizing_error(cx_depolarizing_prob, 2), ["cx"]
)

noisy_estimator = Estimator(
options=dict(backend_options=dict(noise_model=noise_model))
)
job = noisy_estimator.run([pub])
result = job.result()
pub_result = result[0]
noisy_value = float(pub_result.data.evs)
noisy_value
0.7247404214143528

כפי שאתה יכול לראות, ערך הציפייה בנוכחות הרעש רחוק מאוד מהערך הנכון. בפועל, תוכל להשתמש במגוון טכניקות של הפחתת שגיאות כדי להתמודד עם השפעות הרעש, אך דיון בטכניקות אלו הוא מעבר לתחום מאמר זה.

כדי לקבל תחושה גסה מאוד של כיצד הרעש משפיע על התוצאה הסופית, שקול את מודל הרעש שלנו, המוסיף שגיאת depolarizing של 2% לכל Gate CX. שגיאת depolarizing עם הסתברות pp מוגדרת כערוץ קוונטי EE שיש לו את הפעולה הבאה על מטריצת צפיפות ρ\rho:

E(ρ)=(1p)ρ+pI2nE(\rho) = (1 - p) \rho + p\frac{I}{2^n}

כאשר nn הוא מספר ה-Qubit, במקרה זה, 2. כלומר, עם הסתברות pp, המצב מוחלף במצב המעורב לחלוטין, והמצב נשמר עם הסתברות 1p1 - p. לאחר mm יישומים של ערוץ ה-depolarizing, ההסתברות שהמצב נשמר תהיה (1p)m(1 - p)^m. לכן, אנחנו מצפים שההסתברות לשמירת המצב הנכון בסוף הסימולציה תרד באופן מעריכי עם מספר ה-Gate CX במעגל שלנו.

בואו נספור את מספר ה-Gate CX במעגל שלנו ונחשב (1p)m(1 - p)^m. נקרא ל-count_ops כדי לקבל מילון הממפה שמות Gate לספירות, ונאחזר את הערך עבור Gate CX.

cx_count = circuit.count_ops()["cx"]
(1 - cx_depolarizing_prob) ** cx_count
0.6542558123199923

ערך זה, 65%, נותן אומדן גס של ההסתברות שהמצב הסופי שלנו נכון. זהו אומדן שמרני מכיוון שאינו לוקח בחשבון את המצב ההתחלתי של הסימולציה.

תא הקוד הבא מציג כיצד להשתמש ב-Sampler primitive מ-Qiskit Aer לדגימה מהמעגל הרועש. עלינו להוסיף מדידות למעגל לפני הרצתו עם ה-Sampler primitive.

from qiskit_aer.primitives import SamplerV2 as Sampler

measured_circuit = circuit.copy()
measured_circuit.measure_all()

noisy_sampler = Sampler(
options=dict(backend_options=dict(noise_model=noise_model))
)
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(measured_circuit)
pub = (isa_circuit, params, 100)
job = noisy_sampler.run([pub])
result = job.result()
pub_result = result[0]
pub_result.data.meas.get_counts()
{'00100000': 1,
'00000000': 65,
'10101000': 1,
'10000000': 5,
'00001000': 1,
'00000110': 2,
'11110010': 1,
'00000011': 3,
'01010000': 3,
'11000000': 3,
'01111000': 1,
'01000000': 2,
'00000010': 1,
'01100000': 1,
'00011000': 1,
'00111100': 1,
'00010100': 1,
'00001111': 1,
'00110000': 1,
'01100101': 1,
'00000100': 1,
'10100000': 1,
'00000001': 1,
'11010000': 1}

צעדים הבאים

המלצות