Przejdź do głównej treści

Szybki start z Estimator

Prymityw Estimator oblicza wartości oczekiwane dla jednego lub więcej obserwowalnych względem stanów przygotowanych przez obwody kwantowe. Obwody mogą być sparametryzowane, pod warunkiem że wartości parametrów są również podane jako dane wejściowe do prymitywu.

Ten prymityw ma kilka wbudowanych technik łagodzenia i tłumienia błędów, w tym dynamical decoupling, Pauli-twirling, gate-folding ZNE, PEA i PEC. Obsługuje również opcję resilience_level, która umożliwia łatwą konfigurację kompromisu między kosztem a dokładnością. Kroki opisane w tym temacie pokazują, jak skonfigurować Estimator, zapoznać się z dostępnymi opcjami konfiguracji i wywołać go w programie.

Wersje pakietów

Kod na tej stronie został opracowany przy użyciu następujących wymagań. Zalecamy używanie tych lub nowszych wersji.

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*/}

## Kroki korzystania z prymitywu Estimator \{#steps-to-use-the-estimator-primitive}

### 1. Inicjalizacja konta \{#initialize-the-account}

Ponieważ Qiskit Runtime jest usługą zarządzaną, musisz najpierw zainicjować swoje konto. Następnie możesz wybrać QPU, którego chcesz użyć do obliczenia wartości oczekiwanej.

Jeśli nie masz jeszcze konta, postępuj zgodnie z krokami opisanymi w [Konfiguracja konta IBM Cloud](cloud-setup).

:::note[Bramki ułamkowe]

Aby korzystać z nowo obsługiwanych [bramek ułamkowych](/guides/fractional-gates), ustaw `use_fractional_gates=True` podczas żądania backendu z instancji `QiskitRuntimeService`. Na przykład:
```python
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)

Jest to funkcja eksperymentalna i może ulec zmianie w przyszłości.

:::

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. Tworzenie obwodu i obserwowalnego

Do prymitywu Estimator potrzebujesz co najmniej jednego obwodu i jednego obserwowalnego jako danych wejściowych.

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]

Obwód i obserwowalne muszą zostać przekształcone tak, aby używały tylko instrukcji obsługiwanych przez QPU (określanych jako obwody architektury zestawu instrukcji (ISA)). Użyj Transpilatora, aby to zrobić.

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. Inicjalizacja Qiskit Runtime Estimator

Podczas inicjalizacji Estimator użyj parametru mode, aby określić tryb działania. Możliwe wartości to batch, session lub obiekty backend odpowiednio dla trybu wsadowego, sesji i wykonania zadania. Aby uzyskać więcej informacji, zobacz Wprowadzenie do trybów wykonania Qiskit Runtime. Pamiętaj, że użytkownicy Open Plan nie mogą przesyłać zadań sesji.

from qiskit_ibm_runtime import EstimatorV2 as Estimator

estimator = Estimator(mode=backend)

4. Wywołanie Estimator i uzyskanie wyników

Następnie wywołaj metodę run(), aby obliczyć wartości oczekiwane dla wejściowych obwodów i obserwowalnych. Obwód, obserwowalne i opcjonalne zestawy wartości parametrów są podawane jako krotki 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}

Następne kroki

Zalecenia