Schaltkreise visualisieren
Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.
qiskit[all]~=2.5.2
Es ist oft nützlich, die Schaltkreise zu sehen, die Sie erstellen. Verwenden Sie die folgenden Optionen, um Qiskit-Schaltkreise anzuzeigen.
from qiskit import QuantumCircuitZeichnen Sie einen Quantenschaltkreis
Die Klasse QuantumCircuit unterstützt das Zeichnen von Schaltkreisen über die Methode draw() oder das Drucken des Schaltkreisobjekts. Standardmäßig geben beide eine ASCII-Version des Schaltplans wieder.
Beachten Sie, dass print None zurückgibt, aber den Nebeneffekt hat, dass das Diagramm gedruckt wird, während QuantumCircuit.draw das Diagramm ohne Nebeneffekte zurückgibt. Da Jupyter-Notebooks die Ausgabe der letzten Zeile jeder Zelle anzeigen, scheinen sie denselben 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)Output:
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
circuit.draw()Output:
┌───┐ ┌─┐
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 bei der Entwicklung einer Schaltung schnell die Ausgabe zu sehen, aber sie bietet nicht die größte Flexibilität. Für den Quantenschaltkreis gibt es zwei alternative Renderer. Der eine verwendet Matplotlib und der andere verwendet LaTeX. Der Renderer LaTeX benötigt das Paket qcircuit. Wählen Sie diese Renderer aus, indem Sie das Argument "Ausgabe" auf die Zeichenketten mpl und latex setzen.
OSX-Benutzer können die erforderlichen LaTeX Pakete über das mactex-Paket beziehen.
# Matplotlib drawing
circuit.draw(output="mpl")Output:
# Latex drawing
circuit.draw(output="latex")Output:
Ausgabe speichern
Das Inline-Zeichnen eines großen Schaltkreises in einem Jupyter-Notebook kann langsam oder unlesbar sein. Sie können das Diagramm direkt in einer Datei speichern und es dann in einem Bildbetrachter öffnen und nach Bedarf vergrößern.
# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")Output:
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")Output:
Schaltpläne für Steuerkreise
Standardmäßig gibt die Methode draw() das gerenderte Bild als Objekt zurück und gibt nichts aus. Welche Klasse genau zurückgegeben wird, hängt von der angegebenen Ausgabe ab: 'text' (Standard) 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 stellen sie korrekt dar, aber wenn sie außerhalb von Jupyter ausgeführt werden, werden die Bilder nicht automatisch angezeigt.
Die Methode draw() hat optionale Argumente zur Anzeige oder Speicherung der Ausgabe. Wenn angegeben, nimmt der filename kwarg einen Pfad an, in dem er die gerenderte Ausgabe speichert. Wenn Sie die Ausgaben mpl oder latex verwenden, können Sie alternativ den Warg interactive verwenden, um das Bild in einem neuen Fenster zu öffnen (dies funktioniert nicht immer innerhalb eines Notebooks).
Anpassen der Ausgabe
Je nach Ausgang gibt es auch Optionen zur Anpassung des Schaltplans.
Plotbarrieren deaktivieren und Bitreihenfolge umkehren
Die ersten beiden Optionen werden von allen drei Backends gemeinsam genutzt. Sie ermöglichen es Ihnen, sowohl die Bitreihenfolge zu konfigurieren als auch zu bestimmen, ob Sie Barrieren zeichnen oder nicht. Diese können über reverse_bits kwarg bzw. plot_barriers kwarg eingestellt werden. Die folgenden Beispiele funktionieren mit jedem Ausgaberenderer; 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")Output:
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)Output:
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)Output:
Renderer-spezifische Anpassungen
Einige der verfügbaren Anpassungsoptionen sind spezifisch für einen Renderer.
Das Argument fold legt eine maximale Breite für die Ausgabe fest. Im Renderer text wird damit die Länge der Zeilen des Diagramms festgelegt, bevor zur nächsten Zeile umgebrochen wird. Bei Verwendung des "mpl"-Renderers ist dies die Anzahl der (visuellen) Ebenen vor der Faltung zur nächsten Zeile.
Der mpl Renderer hat die style kwarg, die die Farben und Umrisse ändert. Weitere Einzelheiten finden Sie in der API-Dokumentation.
Die Option scale skaliert die Ausgabe der Renderer mpl und latex .
circuit = QuantumCircuit(1)
for _ in range(10):
circuit.h(0)
# limit line length to 40 characters
circuit.draw(output="text", fold=40)Output:
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
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:
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)Output:
Eigenständige Schaltplanzeichnungsfunktion
Wenn Sie eine Anwendung haben, in der Sie es vorziehen, einen Stromkreis mit einer eigenständigen Funktion statt als Methode eines Stromkreisobjekts zu zeichnen, können Sie direkt die Funktion circuit_drawer() verwenden, die Teil der öffentlichen stabilen Schnittstelle von qiskit.visualization ist. Die Funktion verhält sich genauso wie die Methode circuit.draw() , mit dem Unterschied, dass sie ein Schaltkreisobjekt als erforderliches Argument annimmt.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)Output:
Nächste Schritte
- Ein Beispiel für die Visualisierung von Schaltkreisen finden Sie in der Anleitung zum Grover-Algorithmus.
- Visualisieren Sie einfache Schaltkreise mit „ IBM Quantum Composer “.
- Visualisieren Sie das Schaltungstiming.
- Lesen Sie die Dokumentation zur Qiskit-Visualisierungs-API.