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

Дробові гейти

Package versions

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

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0

Ця сторінка знайомить з двома нещодавно підтриманими типами гейтів у флоті QPU IBM Quantum®. Ці дробові гейти підтримуються на QPU Heron у вигляді:

  • RZZ(θ)R_{ZZ}(\theta) для 0<θ≤π/20 \lt \theta \leq \pi/2
  • RX(θ)R_X(\theta) для довільного θ\theta

На цій сторінці розглядаються випадки використання дробових гейтів, де вони можуть підвищити ефективність твоїх робочих процесів, а також те, як застосовувати ці гейти на QPU IBM Quantum.

# 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")

Як використовувати дробові гейти​

Внутрішньо ці дробові гейти працюють шляхом безпосереднього виконання обертання RZZ(θ)R_{ZZ}(\theta) і RX(θ)R_X(\theta) на довільний кут. Використання гейта RX(θ)R_X(\theta) може скоротити тривалість і похибку для однокубітних обертань на довільний кут до двох разів. Безпосереднє виконання обертання гейта RZZ(θ)R_{ZZ}(\theta) дозволяє уникнути декомпозиції в кілька об'єктів CZGate, аналогічно скорочуючи тривалість і похибку схеми. Це особливо корисно для схем, що містять багато одно- і двокубітних обертань — наприклад, при моделюванні динаміки квантової системи або при використанні варіаційного ансатцу з великою кількістю параметрів.

Хоча ці типи гейтів є в бібліотеці стандартних гейтів, якою може володіти QuantumCircuit, вони можуть використовуватися лише на конкретних QPU IBM Quantum, і для цього потрібно завантажити їх з прапорцем use_fractional_gates зі значенням True (показано нижче). Цей прапорець гарантує, що дробові гейти будуть включені до Target бекенду для транспілятора.

service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)

Цей приклад коду демонструє, як використовувати дробові гейти в контексті робочого процесу, що моделює динаміку ланцюжка Ізінга за допомогою дробових гейтів. Тривалість схеми потім порівнюється з бекендом, що не використовує дробові гейти.

Примітка про звітні рівні похибок

Значення похибки, що повідомляється в Target бекенду з увімкненими дробовими гейтами, є лише копією відповідного значення недробового гейта (яке може не збігатися). Це пов'язано з тим, що звітність про рівні похибок для дробових гейтів ще не підтримується.

Однак, оскільки час виконання дробових і недробових гейтів однаковий, можна обґрунтовано припустити, що їхні рівні похибок є порівнянними — особливо коли домінуючим джерелом похибки в схемі є релаксація.

from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple

from qiskit_ibm_runtime import QiskitRuntimeService

num_qubits = 5
num_time_steps = 3
rx_angle = 0.1
rzz_angle = 0.1

ising_circuit = QuantumCircuit(num_qubits)
for i in range(num_time_steps):
# rx layer
for q in range(num_qubits):
ising_circuit.rx(rx_angle, q)
for q in range(1, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
# 2nd rzz layer
for q in range(0, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
ising_circuit.barrier()
ising_circuit.draw("mpl")

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

Задай два об'єкти бекенду: один з увімкненими дробовими гейтами, інший — з вимкненими, потім транспілюй обидва.

service = QiskitRuntimeService()
backend_name = service.least_busy(operational=True, simulator=False).name
backend_fractional = service.backend(backend_name, use_fractional_gates=True)
backend_conventional = service.backend(
backend_name, use_fractional_gates=False
)

pm_fractional = generate_preset_pass_manager(
optimization_level=3, backend=backend_fractional, scheduling_method="alap"
)
pm_conventional = generate_preset_pass_manager(
optimization_level=3,
backend=backend_conventional,
scheduling_method="alap",
)

ising_circuit_fractional = pm_fractional.run(ising_circuit)
ising_circuit_conventional = pm_conventional.run(ising_circuit)

Відобрази часову шкалу схеми з двома типами гейтів.

# Draw timeline of circuit with conventional gates
draw_timeline(
ising_circuit_conventional,
idle_wires=False,
target=backend_conventional.target,
time_range=(0, 500),
style=IQXSimple(),
)

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

# Draw timeline of circuit with fractional gates
draw_timeline(
ising_circuit_fractional,
idle_wires=False,
target=backend_fractional.target,
time_range=(0, 500),
style=IQXSimple(),
)

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

Обмеження на кути​

Для двокубітного гейта RZZ(θ)R_{ZZ}(\theta) на обладнанні IBM Quantum можна виконувати лише кути між 00 і π/2\pi/2. Якщо схема містить будь-які гейти RZZ(θ)R_{ZZ}(\theta) з кутом поза цим діапазоном, стандартний конвеєр транспіляції зазвичай виправить це за допомогою відповідного перетворення схеми (через прохід FoldRzzAngle). Однак для будь-якого гейта RZZ(θ)R_{ZZ}(\theta), що містить один або більше Parameterів, транспілятор вважатиме, що ці параметри будуть отримувати кути у цьому діапазоні під час виконання. Завдання завершиться помилкою, якщо будь-яке зі значень параметрів, зазначених у PUB, поданому до IBM Quantum Compute Service, виходить за межі цього діапазону.

Де використовувати дробові гейти​

Історично базові гейти, доступні на QPU IBM Quantum, — це CZ, X, RZ, SX і ID, які не можуть ефективно представляти схеми з одно- і двокубітними обертаннями, що не є кратними π/2\pi / 2. Наприклад, гейт RX(θ)R_X(\theta) при транспіляції має розкластися в послідовність гейтів RZRZ і X\sqrt{X}, що породжує схему з двома гейтами скінченної тривалості замість одного.

Аналогічно, при транспіляції двокубітних обертань, таких як гейт RZZ(θ)R_{ZZ}(\theta), декомпозиція потребує двох гейтів CZ і кількох однокубітних гейтів, що збільшує глибину схеми. Ці декомпозиції показані в наступному коді.

qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")

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

# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)

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

from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager

from qiskit_ibm_runtime import QiskitRuntimeService

qc = QuantumCircuit(2)
param = Parameter("θ")
qc.rzz(param, 0, 1)
qc.draw("mpl")

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

# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)

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

Для робочих процесів, що потребують багатьох однокубітних обертань RX(θ)R_X(\theta) або двокубітних обертань (наприклад, у варіаційному ансатці або при моделюванні часової еволюції квантових систем), це обмеження призводить до швидкого зростання глибини схеми. Однак дробові гейти знімають цю вимогу, оскільки одно- і двокубітні обертання виконуються безпосередньо, що породжує більш ефективну (а отже, менш схильну до похибок) квантову схему.

Коли не варто використовувати дробові гейти​

Важливо зазначити, що дробові гейти є експериментальною функцією, і поведінка прапорця use_fractional_gates може змінитися в майбутньому. Слідкуй за нотатками про випуски нових версій qiskit-ibm-runtime для отримання додаткової інформації. Також дивись документацію API для QiskitRuntimeService.backend, де описано use_fractional_gates.

Крім того, транспілятор Qiskit має обмежені можливості використання RZZ(θ)R_{ZZ}(\theta) у своїх проходах оптимізації. Це вимагає більш ретельного підходу до створення та оптимізації схем, що містять ці інструкції.

Нарешті, використання дробових гейтів не підтримується для:

Прочитай посібник із параметрів примітивів, щоб дізнатися більше про налаштування методів пом'якшення і придушення похибок для конкретного квантового завдання.

Які бекенди підтримують дробові гейти?​

Не всі бекенди підтримують дробові гейти. Запусти service.backends(use_fractional_gates=True), щоб знайти ті, що підтримують. З виходом qiskit-ibm-runtime v0.48 ти також можеш запустити service.least_busy(fractional_gates=True), щоб знайти найменш завантажений бекенд, який підтримує дробові гейти. Фейковий бекенд підтримує дробові гейти, лише якщо відповідний "реальний" бекенд їх підтримує.

Зверни увагу, що фейкові бекенди не підтримують дробові гейти за замовчуванням, оскільки дробові гейти вимкнено за замовчуванням. Щоб увімкнути дробові гейти на фейковому бекенді, який їх підтримує, онови його конфігурацію.

Example:

service = QiskitRuntimeService()
fake_backend = FakeBoston()
fake_backend.refresh(service=service, use_fractional_gates=True)

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

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