ויזואליזציה של מעגלים
גרסאות חבילות
הקוד בעמוד זה פותח בשימוש בדרישות הבאות. אנחנו ממליצים להשתמש בגרסאות אלה או בגרסאות חדשות יותר.
qiskit[all]~=2.5.2
לעיתים קרובות שימושי לראות את המעגלים שאתם יוצרים. השתמשו באפשרויות הבאות כדי להציג מעגלי Qiskit.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit
ציור Circuit קוונטי
המחלקה QuantumCircuit תומכת בציור מעגלים דרך המתודה draw(), או על ידי הדפסת אובייקט המעגל. כברירת מחדל, שתיהן מציגות גרסת ASCII art של דיאגרמת המעגל.
שימו לב ש-print מחזיר None אך כתופעת לוואי מדפיס את הדיאגרמה, ואילו QuantumCircuit.draw מחזיר את הדיאגרמה ללא תופעות לוואי. מכיוון שמחברות Jupyter מציגות את הפלט של השורה האחרונה בכל תא, נראה ששתי הדרכים פועלות באותו אופן.
# Build a quantum circuit
circuit = QuantumCircuit(3, 3)
circuit.x(1)
circuit.h(range(3))
circuit.cx(0, 1)
circuit.measure(range(3), range(3));
print(circuit)
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
circuit.draw()
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
רנדרים חלופיים
פלט טקסט שימושי לראיית הפלט במהירות בזמן פיתוח מעגל, אך אינו מספק את הגמישות הרבה ביותר. קיימים שני רנדרים חלופיים למעגל הקוונטי. אחד משתמש ב-Matplotlib והשני משתמש ב-LaTeX. הרנדר של LaTeX דורש את חבילת qcircuit. בחרו את הרנדרים הללו על ידי הגדרת הארגומנט "output" למחרוזות mpl ו-latex.
משתמשי OSX יכולים לקבל את חבילות LaTeX הנדרשות דרך חבילת mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
שמירת הפלט
ציור Circuit בקנה מידה גדול בתוך מחברת Jupyter יכול להיות איטי או בלתי קריא. אפשר לשמור את הדיאגרמה ישירות לקובץ, ואז לפתוח אותה בצופה תמונות ולהתקרב לפי הצורך.
# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")
שליטה בציורי המעגל
כברירת מחדל, המתודה draw() מחזירה את התמונה המרונדרת כאובייקט ואינה מפיקה כלום. המחלקה המדויקת שמוחזרת תלויה בפלט שצוין: 'text' (ברירת המחדל) מחזיר אובייקט TextDrawer, 'mpl' מחזיר אובייקט matplotlib.Figure, ו-latex מחזיר אובייקט PIL.Image. מחברות Jupyter מבינות את סוגי ההחזרה הללו ומציגות אותם כראוי, אך כאשר רצים מחוץ ל-Jupyter, תמונות לא יוצגו אוטומטית.
למתודה draw() יש ארגומנטים אופציונליים להצגה או שמירת הפלט. כשמצוין, ה-kwarg filename מקבל נתיב שאליו הוא שומר את הפלט המרונדר. לחלופין, אם אתם משתמשים בפלט mpl או latex, אפשר להשתמש ב-kwarg interactive כדי לפתוח את התמונה בחלון חדש (זה לא תמיד יעבוד מתוך מחברת).
התאמה אישית של הפלט
בהתאם לפלט, ישנן גם אפשרויות להתאמה אישית של דיאגרמת המעגל.
ביטול מחסומים בגרף והיפוך סדר ביטים
שתי האפשרויות הראשונות משותפות לכל שלושת הבאקאנד. הן מאפשרות לכם לקנפג את סדר הביטים ואת האפשרות לצייר מחסומים או לא. ניתן להגדיר אותן על ידי ה-kwarg reverse_bits וה-kwarg plot_barriers, בהתאמה. הדוגמאות הבאות פועלות עם כל רנדר; mpl משמש כאן לקיצור.
from qiskit import QuantumRegister, ClassicalRegister
# Draw a new circuit with barriers and more registers
q_a = QuantumRegister(3, name="a")
q_b = QuantumRegister(5, name="b")
c_a = ClassicalRegister(3)
c_b = ClassicalRegister(5)
circuit = QuantumCircuit(q_a, q_b, c_a, c_b)
circuit.x(q_a[1])
circuit.x(q_b[1])
circuit.x(q_b[2])
circuit.x(q_b[4])
circuit.barrier()
circuit.h(q_a)
circuit.barrier(q_a)
circuit.h(q_b)
circuit.cswap(q_b[0], q_b[1], q_b[2])
circuit.cswap(q_b[2], q_b[3], q_b[4])
circuit.cswap(q_b[3], q_b[4], q_b[0])
circuit.barrier(q_b)
circuit.measure(q_a, c_a)
circuit.measure(q_b, c_b);
# Draw the circuit
circuit.draw(output="mpl")
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)
התאמות ספציפיות לרנדר
חלק מאפשרויות ההתאמה הזמינות ספציפיות לרנדר.
הארגומנט fold קובע רוחב מקסימלי לפלט. ב-renderer מסוג text, זה קובע את אורך השורות של הדיאגרמה לפני שהיא עוברת לשורה הבאה. כאשר משתמשים ב-renderer מסוג 'mpl', זהו מספר השכבות (הוויזואליות) לפני המעבר לשורה הבאה.
לרנדר mpl יש את ה-kwarg style, שמשנה את הצבעים והקווים המתארים. ראו את תיעוד ה-API לפרטים נוספים.
האפשרות scale משנה את קנה המידה של הפלט ברנדרים mpl ו-latex.
circuit = QuantumCircuit(1)
for _ in range(10):
circuit.h(0)
# limit line length to 40 characters
circuit.draw(output="text", fold=40)
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
q: ┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├»
└───┘└───┘└───┘└───┘└───┘└───┘└───┘»
« ┌───┐┌───┐┌───┐
«q: ┤ H ├┤ H ├┤ H ├
« └───┘└───┘└───┘
# Change the background color in mpl
style = {"backgroundcolor": "lightgreen"}
circuit.draw(output="mpl", style=style)
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)
פונקציית ציור Circuit עצמאית
אם יש לכם אפליקציה שבה אתם מעדיפים לצייר Circuit עם פונקציה עצמאית במקום כמתודה של אובייקט מעגל, אפשר להשתמש ישירות בפונקציה circuit_drawer(), שהיא חלק מהממשק הציבורי היציב של qiskit.visualization. הפונקציה מתנהגת בצורה זהה למתודה circuit.draw(), אלא שהיא מקבלת אובייקט מעגל כארגומנט חובה.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
צעדים הבאים
- ראו דוגמה לויזואליזציה של מעגל במדריך אלגוריתם גרובר.
- ויזואליזציה של מעגלים פשוטים באמצעות IBM Quantum Composer.
- ויזואליזציה של תזמון מעגל.
- ראו בתיעוד API של ויזואליזציות Qiskit.