דלג לתוכן הראשי
פרויקט זה בשלב בטא. מצאת באג? פתח issue ב-GitHub. יש שאלה או רעיון? שאל ב-Discussions — נשמח לשמוע ממך!
מה איכות התרגום בדף זה?

ויזואליזציה של מעגלים

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

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

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")

Output of the previous code cell

# Latex drawing
circuit.draw(output="latex")

Output of the previous code cell

שמירת הפלט​

ציור Circuit בקנה מידה גדול בתוך מחברת Jupyter יכול להיות איטי או בלתי קריא. אפשר לשמור את הדיאגרמה ישירות לקובץ, ואז לפתוח אותה בצופה תמונות ולהתקרב לפי הצורך.

# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")

Output of the previous code cell

# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")

Output of the previous code cell

שליטה בציורי המעגל​

כברירת מחדל, המתודה 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")

Output of the previous code cell

# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)

Output of the previous code cell

# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)

Output of the previous code cell

התאמות ספציפיות לרנדר​

חלק מאפשרויות ההתאמה הזמינות ספציפיות לרנדר.

הארגומנט 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)

Output of the previous code cell

# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)

Output of the previous code cell

פונקציית ציור Circuit עצמאית​

אם יש לכם אפליקציה שבה אתם מעדיפים לצייר Circuit עם פונקציה עצמאית במקום כמתודה של אובייקט מעגל, אפשר להשתמש ישירות בפונקציה circuit_drawer(), שהיא חלק מהממשק הציבורי היציב של qiskit.visualization. הפונקציה מתנהגת בצורה זהה למתודה circuit.draw(), אלא שהיא מקבלת אובייקט מעגל כארגומנט חובה.

from qiskit.visualization import circuit_drawer

circuit_drawer(circuit, output="mpl", plot_barriers=False)

Output of the previous code cell

צעדים הבאים​

המלצות