Дробові гейти
Package versions
Код на цій сторінці було розроблено з використанням наступних залежностей. Рекомендуємо використовувати ці або новіші версії.
qiskit[all]~=2.3.1
qiskit-ibm-runtime~=0.45.1
Ця сторінка знайомить з двома нещодавно підтриманими типами гейтів у флоті QPU IBM Quantum®. Ці дробові гейти підтримуються на QPU Heron у вигляді:
- для
- для довільного
На цій сторінці розглядаються випадки використання дробових гейтів, де вони можуть підвищити ефективність твоїх робочих процесів, а також те, як застосовувати ці гейти на QPU IBM Quantum.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
Як використовувати дробові гейти
Внутрішньо ці дробові гейти працюють шляхом безпосереднього виконання обертання і на довільний кут. Використання гейта може скоротити тривалість і похибку для однокубітних обертань на довільний кут до двох разів. Безпосереднє виконання обертання гейта дозволяє уникнути декомпозиції в кілька об'єктів 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(),
)
Обмеження на кути
Для двокубітного гейта на обладнанні IBM Quantum можна виконувати лише кути між і . Якщо схема містить будь-які гейти з кутом поза цим діапазоном, стандартний конвеєр транспіляції зазвичай виправить це за допомогою відповідного перетворення схеми (через прохід FoldRzzAngle). Однак для будь-якого гейта , що містить один або більше Parameterів, транспілятор вважатиме, що ці параметри будуть отримувати кути у цьому діапазоні під час виконання. Завдання завершиться помилкою, якщо будь-яке зі значень параметрів, зазначених у PUB, поданому до Qiskit Runtime, виходить за межі цього діапазону.
Де використовувати дробові гейти
Історично базові гейти, доступні на QPU IBM Quantum, — це CZ, X, RZ, SX і ID, які не можуть ефективно представляти схеми з одно- і двокубітними обертаннями, що не є кратними . Наприклад, гейт при транспіляції має розкластися в послідовність гейтів і , що породжує схему з двома гейтами скінченної тривалості замість одного.
Аналогічно, при транспіляції двокубітних обертань, таких як гейт , декомпозиція потребує двох гейтів 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)
Для робочих процесів, що потребують багатьох однокубітних обертань або двокубітних обертань (наприклад, у варіаційному ансатці або при моделюванні часової еволюції квантових систем), це обмеження призводить до швидкого зростання глибини схеми. Однак дробові гейти знімають цю вимогу, оскільки одно- і двокубітні обертання виконуються безпосередньо, що породжує більш ефективну (а отже, менш схильну до похибок) квантову схему.
Коли не варто використовувати дробові гейти
Важливо зазначити, що дробові гейти є експериментальною функцією, і поведінка прапорця use_fractional_gates може змінитися в майбутньому. Слідкуй за нотатками про випуски нових версій Qiskit Runtime для отримання додаткової інформації. Також дивись документацію API для QiskitRuntimeService.backend, де описано use_fractional_gates.
Крім того, транспілятор Qiskit має обмежені можливості використання у своїх проходах оптимізації. Це вимагає більш ретельного підходу до створення та оптимізації схем, що містять ці інструкції.
Нарешті, використання дробових гейтів не підтримується для:
- Динамічних схем
- Скручування Паулі — проте скручування вимірювань з TREX підтримується.
- Імовірнісного скасування похибок
- Екстраполяції нульового шуму (з використанням імовірнісного підсилення похибок)
Прочитай посібник із параметрів примітивів, щоб дізнатися більше про налаштування методів пом'якшення і придушення похибок для конкретного квантового завдання.
Наступні кроки
- Щоб дізнатися більше про транспіляцію, переглянь сторінку введення в транспіляцію.
- Прочитай про написання власного проходу транспілятора.
- Дізнайся, як налаштувати пом'якшення похибок для Qiskit Runtime.