Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

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

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

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

qiskit[all]~=2.5.2

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

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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

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

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