Швидкий старт з Executor
Версії пакетів
Код на цій сторінці було розроблено з використанням таких вимог. Рекомендуємо використовувати ці або новіші версії.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
samplomatic~=0.18.0
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime samplomatic
Подібно до примітива Sampler, Executor виконує вибірку вихідних регістрів з виконань квантових схем, але не має жодних вбудованих придушення або пом'якшення помилок. Натомість він є частиною моделі спрямованого виконання, що надає складові для фіксування намірів проєктування на стороні клієнта та переміщує дорогу генерацію варіантів схем на сторону сервера. Executor дотримується директив, наданих в анотаціях схем та опціях, генерує та прив'язує значення параметрів, виконує прив'язані схеми на апаратному забезпеченні та повертає результати виконання та метадані. Він не приймає неявних рішень за тебе та надає повний контроль і прозорість.
Пакет Qiskit ще не має базового класу для примітива Executor.
Перш ніж почати
Деякі приклади коду на цій сторінці використовують samplex, що є частиною пакету Samplomatic. Тому перед запуском цих блоків коду необхідно встановити Samplomatic, як показано в наступному блоці коду. Докладніше дивись у документації Samplomatic.
pip install samplomatic
# For visualization support, include the visualization dependencies.
# pip install samplomatic[vis]
Кроки для використання примітива Executor
1. Ініціалізація акаунту
Оскільки Qiskit Runtime є керованим сервісом, спочатку потрібно ініціалізувати свій акаунт. Потім можна обрати QPU, який хочеш використовувати для обчислення очікуваного значення.
Виконай кроки в темі Налаштування акаунту IBM Cloud®, якщо акаунту ще немає.
from qiskit_ibm_runtime import QiskitRuntimeService, Executor
from qiskit_ibm_runtime.quantum_program import QuantumProgram
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic import build
# Initialize the service and choose a backend
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend)
<IBMBackend('ibm_fez')>
2. Створення та транспіляція схеми
Тобі потрібна щонайменше одна схема для використання примітива Executor. Вона може опціонально мати параметри.
# Generate the circuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.h(1)
circuit.cz(0, 1)
circuit.h(1)
# Using `measure_all` automatically creates the necessary
# classical registers.
circuit.measure_all()
Схема потребує перетворення для використання лише інструкцій, підтримуваних QPU (що називаються схемами instruction set architecture (ISA)). Використовуй Transpiler для цього.
# Transpile the circuit
preset_pass_manager = generate_preset_pass_manager(
backend=backend, optimization_level=0
)
isa_circuit = preset_pass_manager.run(circuit)
3. Ініціалізація QuantumProgram
Ініціалізуй QuantumProgram з твоїм навантаженням. QuantumProgram складається з QuantumProgramItems. Зазвичай кожен елемент складається зі схеми, набору значень параметрів і, можливо, samplex для рандомізації вмісту схеми. Для повних деталей дивись Входи та виходи Executor.
Наступна клітинка ініціалізує QuantumProgram та вказує виконати 25 вимірювань. Далі вона додає транспільовану цільову схему.
# Initialize an empty program
program = QuantumProgram(shots=25)
# Append the circuit to the program
program.append_circuit_item(isa_circuit)
4. Необов'язково: Групування вентилів та вимірювань у анотовані блоки
Групування інструкцій у блоки та їх анотування є основним способом вказати свій намір. У наступному прикладі ми використовуємо generate_boxing_pass_manager та його параметри twirling для групування двокубітних вентилів та вимірювань у блоки та застосування анотації twirling.
# Generate a boxing pass manager to group gates
# and measurements into boxes and add
# a`Twirl` annotation.
boxes_pm = generate_boxing_pass_manager(
# Add gate twirling
enable_gates=True,
# Add measurement twirling
enable_measures=True,
)
boxed_circuit = boxes_pm.run(isa_circuit)
boxed_circuit.draw("mpl", idle_wires=False)
5. Необов'язково: Побудова шаблонної схеми та samplex, додавання до програми
Далі використовуй метод Samplomatic build для генерації пари шаблонна схема та samplex. Шаблонна схема є структурно еквівалентною до оригінальної схеми. Однак її однокубітні вентилі замінені параметризованими вентилями для реалізації заданих анотацій (gate twirling та measurement twirling у цьому прикладі). Samplex кодує всю інформацію, необхідну для генерації рандомізованих параметрів для шаблонної схеми.
Після генерації пари шаблонна схема та samplex використовуй метод append_samplex_item для додавання пари до програми.
Дивись документацію API Samplomatic для повних деталей про samplomatic.samplex.Samplex та його аргументи.
# Build the template circuit and the samplex
template_circuit, samplex = build(boxed_circuit)
# Append the template circuit and samplex as a `samplex_item`
program.append_samplex_item(
template_circuit,
samplex=samplex,
shape=(num_randomizations := 20,),
)
6. Виклик Executor та отримання результатів
Запусти QuantumProgram на backend IBM®, використовуючи примітив Executor з опціями за замовчуванням. Дивись Опції Executor, щоб дізнатися про доступні опції.
# Initialize an Executor with the default options
executor = Executor(mode=backend)
# Submit the job
job = executor.run(program)
job
<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>
# Retrieve the result
result = job.result()
Результат має тип QuantumProgramResult. Дивись Вхід та вихід Executor, щоб дізнатися про об'єкт результату.
Наступні кроки
- Спробуй деякі приклади Executor.
- Зрозумій вхід та вихід Executor.
- Дізнайся про семантику мовлення Executor.