Wizualizacja obwodów
Wersje pakietów
Kod na tej stronie został opracowany przy użyciu poniższych zależności. Zalecamy korzystanie z tych wersji lub nowszych.
qiskit[all]~=2.3.0
Często przydatne jest podglądanie tworzonych obwodów. Skorzystaj z poniższych opcji, aby wyświetlać obwody Qiskit.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
Rysowanie obwodu kwantowego
Klasa QuantumCircuit obsługuje rysowanie obwodów za pomocą metody draw() lub przez wydrukowanie obiektu obwodu. Domyślnie obie metody renderują wersję diagramu obwodu w postaci grafiki ASCII.
Należy pamiętać, że print zwraca None, ale ma efekt uboczny w postaci wydrukowania diagramu, natomiast QuantumCircuit.draw zwraca diagram bez efektów ubocznych. Ponieważ notebooki Jupyter wyświetlają dane wyjściowe ostatniego wiersza każdej komórki, obie metody wydają się mieć ten sam efekt.
# 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
Alternatywne renderery
Wyjście tekstowe jest przydatne do szybkiego podglądu wyników podczas tworzenia obwodu, ale nie zapewnia największej elastyczności. Istnieją dwa alternatywne renderery do wyświetlania obwodów kwantowych. Jeden używa Matplotlib, a drugi LaTeX. Renderer LaTeX wymaga pakietu qcircuit. Wybierz te renderery, ustawiając argument "output" na ciągi mpl i latex.
Użytkownicy systemu OSX mogą uzyskać wymagane pakiety LaTeX przez pakiet mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
Zapisywanie wyników
Rysowanie obwodu na dużą skalę bezpośrednio w notebooku Jupyter może być powolne lub nieczytelne. Możesz zapisać diagram bezpośrednio do pliku, a następnie otworzyć go w przeglądarce obrazów i powiększyć w razie potrzeby.
# 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")
Sterowanie rysowaniem obwodów
Domyślnie metoda draw() zwraca wyrenderowany obraz jako obiekt i nie generuje żadnych danych wyjściowych. Dokładna klasa zwracana zależy od podanego wyjścia: 'text' (domyślny) zwraca obiekt TextDrawer, 'mpl' zwraca obiekt matplotlib.Figure, a latex zwraca obiekt PIL.Image. Notebooki Jupyter rozumieją te typy zwracane i renderują je poprawnie, ale gdy działają poza Jupyterem, obrazy nie będą wyświetlane automatycznie.
Metoda draw() ma opcjonalne argumenty do wyświetlania lub zapisywania wyników. Po podaniu argument filename przyjmuje ścieżkę, do której zapisuje wyrenderowane dane wyjściowe. Alternatywnie, jeśli używasz wyjść mpl lub latex, możesz użyć argumentu interactive, aby otworzyć obraz w nowym oknie (może to nie działać zawsze z poziomu notebooka).
Dostosowywanie wyjścia
W zależności od wyjścia dostępne są również opcje dostosowywania diagramu obwodu.
Wyłączanie barier i odwracanie kolejności bitów
Pierwsze dwie opcje są wspólne dla wszystkich trzech backendów. Pozwalają skonfigurować zarówno kolejność bitów, jak i to, czy rysować bariery. Można je ustawić odpowiednio za pomocą argumentu reverse_bits i plot_barriers. Poniższe przykłady działają z dowolnym rendererem; mpl jest tutaj używany dla zwięzłości.
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)
Dostosowania specyficzne dla renderera
Niektóre dostępne opcje dostosowywania są specyficzne dla renderera.
Argument fold ustawia maksymalną szerokość wyjścia. W rendererze text określa długość linii diagramu przed zawinięciem do następnej linii. W przypadku renderera mpl jest to liczba (wizualnych) warstw przed zawinięciem do następnej linii.
Renderer mpl ma argument style, który zmienia kolory i kontury. Więcej szczegółów znajdziesz w dokumentacji API.
Opcja scale skaluje wyjście rendererów mpl i 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)
Samodzielna funkcja rysowania obwodów
Jeśli masz aplikację, w której wolisz rysować obwód za pomocą samodzielnej funkcji zamiast jako metodę obiektu obwodu, możesz bezpośrednio użyć funkcji circuit_drawer(), która jest częścią publicznego stabilnego interfejsu z qiskit.visualization. Funkcja zachowuje się identycznie jak metoda circuit.draw(), z tą różnicą, że przyjmuje obiekt obwodu jako wymagany argument.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
Kolejne kroki
- Zobacz przykład wizualizacji obwodów w samouczku Algorytm Grovera.
- Wizualizuj proste obwody za pomocą IBM Quantum Composer.
- Wizualizuj czas obwodu.
- Zapoznaj się z dokumentacją API wizualizacji Qiskit.