Schaltkreise visualisieren
Paketversionen
Der Code auf dieser Seite wurde mit den folgenden Anforderungen entwickelt. Wir empfehlen, diese oder neuere Versionen zu verwenden.
qiskit[all]~=2.3.0
Es ist oft nützlich, die Schaltkreise zu sehen, die du erstellst. Verwende die folgenden Optionen, um Qiskit-Schaltkreise anzuzeigen.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
Einen Quantenschaltkreis zeichnen
Die QuantumCircuit Klasse unterstützt das Zeichnen von Schaltkreisen durch die draw() Methode oder durch Drucken des Schaltkreisobjekts. Standardmäßig rendern beide eine ASCII-Art-Version des Schaltkreisdiagramms.
Beachte, dass print None zurückgibt, aber den Nebeneffekt hat, das Diagramm zu drucken, während QuantumCircuit.draw das Diagramm ohne Nebeneffekte zurückgibt. Da Jupyter Notebooks die Ausgabe der letzten Zeile jeder Zelle anzeigen, scheinen sie den gleichen Effekt zu haben.
# 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
Alternative Renderer
Eine Textausgabe ist nützlich, um die Ausgabe während der Entwicklung eines Schaltkreises schnell zu sehen, bietet aber nicht die größte Flexibilität. Es gibt zwei alternative Ausgabe-Renderer für den Quantenschaltkreis. Einer verwendet Matplotlib und der andere verwendet LaTeX. Der LaTeX-Renderer erfordert das qcircuit-Paket. Wähle diese Renderer aus, indem du das "output"-Argument auf die Strings mpl und latex setzt.
OSX-Benutzer können die erforderlichen LaTeX-Pakete über das mactex-Paket erhalten.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
Ausgabe speichern
Das Zeichnen eines großen Schaltkreises inline in einem Jupyter Notebook kann langsam oder unleserlich sein. Du kannst das Diagramm direkt in eine Datei speichern, diese dann in einem Bildbetrachter öffnen und nach Bedarf hineinzoomen.
# 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")
Schaltkreiszeichnungen steuern
Standardmäßig gibt die draw() Methode das gerenderte Bild als Objekt zurück und gibt nichts aus. Die genaue zurückgegebene Klasse hängt von der angegebenen Ausgabe ab: 'text' (die Standardeinstellung) gibt ein TextDrawer Objekt zurück, 'mpl' gibt ein matplotlib.Figure Objekt zurück, und latex gibt ein PIL.Image Objekt zurück. Jupyter Notebooks verstehen diese Rückgabetypen und rendern sie ordnungsgemäß, aber beim Ausführen außerhalb von Jupyter werden Bilder nicht automatisch angezeigt.
Die draw() Methode hat optionale Argumente, um die Ausgabe anzuzeigen oder zu speichern. Wenn angegeben, nimmt das filename kwarg einen Pfad, unter dem die gerenderte Ausgabe gespeichert wird. Alternativ kannst du, wenn du die mpl oder latex Ausgaben verwendest, das interactive kwarg verwenden, um das Bild in einem neuen Fenster zu öffnen (dies funktioniert nicht immer innerhalb eines Notebooks).
Die Ausgabe anpassen
Abhängig von der Ausgabe gibt es auch Optionen, um das Schaltkreisdiagramm anzupassen.
Plot-Barrieren deaktivieren und Bit-Reihenfolge umkehren
Die ersten beiden Optionen werden von allen drei Backends gemeinsam genutzt. Sie ermöglichen es dir, sowohl die Bit-Reihenfolgen zu konfigurieren als auch zu entscheiden, ob du Barrieren zeichnen möchtest oder nicht. Diese können durch das reverse_bits kwarg bzw. das plot_barriers kwarg gesetzt werden. Die folgenden Beispiele funktionieren mit jedem Ausgabe-Renderer; mpl wird hier der Kürze halber verwendet.
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)
Renderer-spezifische Anpassungen
Einige verfügbare Anpassungsoptionen sind spezifisch für einen Renderer.
Das fold Argument setzt eine maximale Breite für die Ausgabe. Im text Renderer setzt dies die Länge der Zeilen des Diagramms, bevor es zur nächsten Zeile umbricht. Bei Verwendung des 'mpl' Renderers ist dies die Anzahl der (visuellen) Schichten vor dem Falten zur nächsten Zeile.
Der mpl Renderer hat das style kwarg, das die Farben und Umrisse ändert. Siehe die API-Dokumentation für weitere Details.
Die scale Option skaliert die Ausgabe der mpl und latex Renderer.
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)
Eigenständige Schaltkreis-Zeichnungsfunktion
Falls du eine Anwendung hast, in der du es vorziehst, einen Schaltkreis mit einer eigenständigen Funktion anstatt als Methode eines Schaltkreisobjekts zu zeichnen, kannst du die circuit_drawer() Funktion direkt verwenden, die Teil der öffentlichen stabilen Schnittstelle von qiskit.visualization ist. Die Funktion verhält sich identisch zur circuit.draw() Methode, außer dass sie ein Schaltkreisobjekt als erforderliches Argument entgegennimmt.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
Nächste Schritte
- Sieh ein Beispiel für Schaltkreisvisualisierung im Grover's Algorithm Tutorial.
- Visualisiere einfache Schaltkreise mit IBM Quantum Composer.
- Schaltkreis-Timing visualisieren.
- Sieh die Qiskit Visualisierungs-API-Dokumentation durch.