Найпоширеніші параметри транспіляції
Package versions
Код на цій сторінці було розроблено з використанням таких залежностей. Рекомендуємо використовувати ці або новіші версії.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
Ця сторінка описує деякі з найпоширеніших параметрів для локальної транспіляції. Ці параметри налаштовуються через аргументи 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 — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_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, 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-вентилів або інших засобів.
У прикладі нижче ми будуємо початкове розміщення для імітованого бекенда FakeSherbrooke, створюючи об'єкт Layout. Наше розміщення відображає перший кубіт схеми на кубіт 5 Sherbrooke, а другий кубіт схеми — на кубіт 6 Sherbrooke. Зверни увагу, що фізичні кубіти завжди представлені цілими числами.
Імітований бекенд FakeSherbrooke з qiskit_ibm_runtime використовується в цих прикладах, але ти можеш спробувати його на будь-якому сумісному з Qiskit реальному або імітованому бекенді. Результати можуть відрізнятися.
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, можна також передати список цілих чисел, де -й елемент списку містить фізичний кубіт, на який слід відобразити -й кубіт. Наприклад:
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).
Наступні кроки
- Переглянь тему Параметри за замовчуванням і налаштування конфігурації.
- Дізнайся, як встановити рівень оптимізації.
- Спробуй посібник Порівняння налаштувань Transpiler.
- Переглянь документацію API Transpiler.