Przejdź do głównej treści

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.

wskazówka

Użytkownicy systemu OSX mogą uzyskać wymagane pakiety LaTeX przez pakiet 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

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

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

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

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

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)

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

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)

Output of the previous code cell

Kolejne kroki

Zalecenia