Перейти до основного вмісту

Візуалізація схем

Версії пакетів

Код на цій сторінці був розроблений з використанням наступних вимог. Ми рекомендуємо використовувати ці версії або новіші.

qiskit[all]~=2.3.0

Часто корисно бачити схеми, які ти створюєш. Використовуй наступні опції для відображення схем Qiskit.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit

Малювання квантової схеми

Клас QuantumCircuit підтримує малювання схем через метод draw() або шляхом друку об'єкта схеми. За замовчуванням обидва відтворюють версію діаграми схеми в ASCII-арті.

Зверніть увагу, що print повертає None, але має побічний ефект друку діаграми, тоді як QuantumCircuit.draw повертає діаграму без побічних ефектів. Оскільки Jupyter notebooks відображають вивід останнього рядка кожної комірки, вони мають однаковий ефект.

# 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

Збереження виводу

Малювання великої схеми в Jupyter notebook може бути повільним або нечитабельним. Ти можеш зберегти діаграму безпосередньо у файл, а потім відкрити її в програмі перегляду зображень та збільшити за потреби.

# 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 notebooks розуміють ці типи повернення та відтворюють їх належним чином, але під час роботи поза Jupyter зображення не відображатимуться автоматично.

Метод draw() має необов'язкові аргументи для відображення або збереження виводу. Коли вказано, kwarg filename приймає шлях, за яким він зберігає відтворений вивід. Альтернативно, якщо ти використовуєш виводи mpl або latex, ти можеш використовувати kwarg interactive, щоб відкрити зображення в новому вікні (це не завжди працюватиме з notebook).

Налаштування виводу

Залежно від виводу, є також опції для налаштування діаграми схеми.

Відключення бар'єрів побудови та зворотний порядок бітів

Перші дві опції є спільними для всіх трьох backend. Вони дозволяють налаштувати як порядок бітів, так і те, чи малюєш ти бар'єри. Вони можуть бути встановлені за допомогою 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_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

Наступні кроки

Рекомендації