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

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

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

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

qiskit[all]~=2.3.0

לעיתים קרובות שימושי לראות את המעגלים שאתם יוצרים. השתמשו באפשרויות הבאות כדי להציג מעגלי Qiskit.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
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 מגדיר רוחב מקסימלי לפלט. ברנדר text, זה מגדיר את אורך השורות של הדיאגרמה לפני שהיא עוברת לשורה הבאה. בשימוש ברנדר 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

צעדים הבאים

המלצות