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

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

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

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

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

Ця сторінка знайомить з двома нещодавно підтриманими типами гейтів у флоті 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 — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime

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

Внутрішньо ці дробові гейти працюють шляхом безпосереднього виконання обертання 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_fractional = service.backend("ibm_torino", use_fractional_gates=True)
backend_conventional = service.backend(
"ibm_torino", 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, поданому до Qiskit Runtime, виходить за межі цього діапазону.

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

Історично базові гейти, доступні на 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.backend("ibm_torino")
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.backend("ibm_torino")
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 Runtime для отримання додаткової інформації. Також дивись документацію API для QiskitRuntimeService.backend, де описано use_fractional_gates.

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

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

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

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

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