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

Швидкий старт з Estimator

Примітив Estimator обчислює очікувані значення для одного або кількох спостережуваних щодо станів, підготовлених квантовими схемами. Схеми можуть бути параметризованими, якщо значення параметрів також надаються як вхідні дані для примітива.

Цей примітив має кілька вбудованих технік пом'якшення та придушення помилок, включаючи динамічне роз'єднання, Pauli-twirling, gate-folding ZNE, PEA та PEC. Він також підтримує опцію resilience_level, яка дозволяє легко налаштовувати компроміс між вартістю та точністю. Кроки в цій темі описують, як налаштувати Estimator, вивчити доступні опції для його конфігурації та викликати його в програмі.

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

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

qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
```json

{/*Verified the v2 examples 2/29/24 - updated 10/29/24*/}

## Кроки для використання примітива Estimator \{#steps-to-use-the-estimator-primitive}

### 1. Ініціалізація акаунту \{#1-initialize-the-account}

Оскільки Qiskit Runtime є керованим сервісом, спочатку потрібно ініціалізувати свій акаунт. Потім можна обрати QPU, який хочеш використовувати для обчислення очікуваного значення.

Виконай кроки в темі [Налаштування акаунту IBM Cloud](cloud-setup), якщо акаунту ще немає.

:::note[Дробові вентилі]

Щоб використовувати нещодавно підтримані [дробові вентилі](/guides/fractional-gates), встанови `use_fractional_gates=True` при запиті backend від екземпляра `QiskitRuntimeService`. Наприклад:
```python
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)

Це є експериментальною функцією та може змінитися в майбутньому.

:::

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)

print(backend.name)
ibm_fez

2. Створення схеми та спостережуваного

Тобі потрібна щонайменше одна схема та одне спостережуване як вхідні дані для примітива Estimator.

from qiskit.circuit.library import qaoa_ansatz
from qiskit.quantum_info import SparsePauliOp

entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]
observable = SparsePauliOp.from_sparse_list(
[("ZZ", [i, j], 0.5) for i, j in entanglement],
num_qubits=backend.num_qubits,
)
circuit = qaoa_ansatz(observable, reps=2)
# The circuit is parametrized, so we will define the parameter values for execution
param_values = [0.1, 0.2, 0.3, 0.4]

Схема та спостережуваний потребують перетворення для використання лише інструкцій, підтримуваних QPU (що називаються схемами instruction set architecture (ISA)). Використовуй Transpiler для цього.

from qiskit.transpiler import generate_preset_pass_manager

pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])

3. Ініціалізація Qiskit Runtime Estimator

При ініціалізації Estimator використовуй параметр mode, щоб вказати режим, в якому хочеш запускати. Можливі значення: об'єкти batch, session або backend для пакетного, сесійного та режиму виконання завдання відповідно. Докладніше див. у Вступ до режимів виконання Qiskit Runtime. Зверни увагу, що користувачі Open Plan не можуть надсилати завдання в режимі Session.

from qiskit_ibm_runtime import EstimatorV2 as Estimator

estimator = Estimator(mode=backend)

4. Виклик Estimator та отримання результатів

Далі викличи метод run() для обчислення очікуваних значень для вхідних схем та спостережуваних. Схема, спостережуваний та необов'язкові набори значень параметрів передаються як кортежі primitive unified bloc (PUB).

job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: d82869ntjchs73bnokog
>>> Job Status: QUEUED
result = job.result()
print(f">>> {result}")
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
>>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
> Expectation value: 30.60337496305257
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

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

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