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

Найпоширеніші параметри транспіляції

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

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

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Ця сторінка описує деякі з найпоширеніших параметрів для локальної транспіляції. Ці параметри налаштовуються через аргументи generate_preset_pass_manager або transpile.

Ступінь апроксимації

Ступінь апроксимації дозволяє вказати, наскільки точно результуюча схема має відповідати бажаній (вхідній) схемі. Це число з плаваючою точкою в діапазоні (0.0 – 1.0), де 0.0 — максимальна апроксимація, а 1.0 (за замовчуванням) — без апроксимації. Менші значення обмінюють точність виводу на простоту виконання (тобто менше вентилів). Значення за замовчуванням — 1.0.

У синтезі двокубітних унітарних операцій (який використовується на початкових етапах для всіх рівнів та на етапі оптимізації з рівнем 3) це значення задає цільову точність (fidelity) вихідного розкладання. Тобто, скільки похибки вноситься при перетворенні матричного представлення схеми на дискретні вентилі. Якщо ступінь апроксимації менший (більша апроксимація), вихідна схема після синтезу відрізнятиметься більше від вхідної матриці, але, ймовірно, матиме менше вентилів (оскільки будь-яку довільну двокубітну операцію можна розкласти точно щонайбільше трьома вентилями CX) і її легше виконати.

Коли ступінь апроксимації менший за 1.0, може бути синтезовано схеми з одним або двома вентилями CX, що призводить до меншої апаратної похибки, але більшої похибки апроксимації. Оскільки CX є найдорожчим вентилем з точки зору похибки, може бути вигідно зменшити їхню кількість ціною точності синтезу (ця техніка використовувалась для збільшення квантового об'єму на пристроях IBM®: Validating quantum computers using randomized model circuits).

Як приклад, ми генеруємо випадковий двокубітний UnitaryGate, який буде синтезовано на початковому етапі. Встановлення approximation_degree меншим за 1.0 може сформувати наближену схему. Також треба вказати basis_gates, щоб метод синтезу знав, які вентилі він може використовувати для наближеного синтезу.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager

UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)

qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])
2

Результат дорівнює 2, оскільки апроксимація потребує менше вентилів CX.

Зерно генератора випадкових чисел

Деякі частини Transpiler є стохастичними, тому повторні запуски транспіляції можуть повертати різні результати. Щоб отримати відтворюваний результат, можна встановити зерно для генератора псевдовипадкових чисел за допомогою аргументу seed_transpiler. Повторні запуски з однаковим зерном повертатимуть однакові результати.

Приклад:

pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")

Вивід попередньої комірки коду

Початкове розміщення

До транспіляції кубіти у твоїй схемі є віртуальними і не обов'язково відповідають фізичним кубітам цільового Backend. Можна задати початкове відображення віртуальних кубітів на фізичні за допомогою аргументу initial_layout. Зверни увагу, що кінцеве розміщення кубітів може відрізнятися від початкового, оскільки Transpiler може переставляти кубіти за допомогою swap-вентилів або інших засобів.

У прикладі нижче ми будуємо початкове розміщення для мок-Backend FakeSherbrooke, створюючи об'єкт Layout. Наше розміщення відображає перший кубіт схеми на кубіт 5 Sherbrooke, а другий кубіт схеми — на кубіт 6 Sherbrooke. Зверни увагу, що фізичні кубіти завжди представлені цілими числами.

from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout

backend = FakeSherbrooke()

a, b = qubits
initial_layout = Layout({a: 5, b: 6})

pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Вивід попередньої комірки коду

Крім вказання об'єкта Layout, можна також передати список цілих чисел, де ii-й елемент списку містить фізичний кубіт, на який слід відобразити ii-й кубіт. Наприклад:

initial_layout = [5, 6]

pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Вивід попередньої комірки коду

Можна скористатися функцією plot_error_map, щоб сформувати діаграму графа пристрою з інформацією про похибки та підписаними фізичними кубітами. Аналогічні діаграми також доступні на сторінці Обчислювальні ресурси.

from qiskit.visualization import plot_error_map

plot_error_map(backend, figsize=(30, 24))

Вивід попередньої комірки коду

Параметри етапів Transpiler та плагінів

Ці параметри мають суфікс _method. Вони впливають на роботу Transpiler і використовуються для отримання кращого, іншого або специфічного виводу.

  • init_method (str) — Плагін для етапу ініціалізації.

  • layout_method (str) — Прохід вибору розміщення (trivial, dense, sabre). Також може бути назвою зовнішнього плагіна для етапу розміщення.

  • optimization_method (str) — Плагін для етапу оптимізації.

  • routing_method (str) — Назва проходу маршрутизації (basic, lookahead, default, sabre, none). Також може бути назвою зовнішнього плагіна для етапу маршрутизації.

  • scheduling_method (str) — Назва проходу планування. Також може бути назвою зовнішнього плагіна для етапу планування.

    • as_soon_as_possible: Планувати інструкції жадібно: якомога раніше на ресурсі кубіта (псевдонім: asap).
    • as_late_as_possible: Планувати інструкції пізно. Тобто тримати кубіти в основному стані якомога довше (псевдонім: alap).
  • translation_method (str) — Назва проходу трансляції (unroller, translator, synthesis). Також може бути назвою зовнішнього плагіна для етапу трансляції.

  • unitary_synthesis_method (str) — Назва методу унітарного синтезу. За замовчуванням використовується default.

примітка

Щоб переглянути список усіх встановлених плагінів для певного етапу, виконай list_stage_plugins("stage_name"). Наприклад, щоб побачити список усіх встановлених плагінів для етапу маршрутизації, виконай list_stage_plugins(routing).

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