Візуалізація схем
Версії пакетів
Код на цій сторінці був розроблений з використанням наступних вимог. Ми рекомендуємо використовувати ці версії або новіші.
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")
# Latex drawing
circuit.draw(output="latex")
Збереження виводу
Малювання великої схеми в Jupyter notebook може бути повільним або нечитабельним. Ти можеш зберегти діаграму безпосередньо у файл, а потім відкрити її в програмі перегляду зображень та збільшити за потреби.
# 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")
Керування малюванням схем
За замовчуванням метод 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")
# 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)
Налаштування специфічні для рендерера
Деякі доступні опції налаштування є специфічними для рендерера.
Аргумент 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)
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)
Автономна функція малювання схем
Якщо у тебе є додаток, де ти віддаєш перевагу малюванню схеми за допомогою самостійної функції замість як методу об'єкта схеми, ти можеш безпосередньо використовувати функцію circuit_drawer(), яка є частиною публічного стабільного інтерфейсу з qiskit.visualization. Функція поводиться ідентично методу circuit.draw(), за винятком того, що вона приймає об'єкт схеми як обов'язковий аргумент.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
Наступні кроки
- Подивіться приклад візуалізації схеми в підручнику Алгоритм Гровера.
- Візуалізуйте прості схеми, використовуючи IBM Quantum Composer.
- Візуалізуйте часові характеристики схеми.
- Перегляньте документацію API візуалізацій Qiskit.