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
- Dowiedz się, jak testować lokalnie przed uruchomieniem na komputerach kwantowych.
- Przejrzyj szczegółowe przykłady.
- Ćwicz korzystanie z prymitywów, pracując nad lekcją funkcji kosztu w IBM Quantum Learning.
- Dowiedz się, jak transpilować lokalnie w sekcji Transpilacja.
- Wypróbuj przewodnik Porównanie ustawień transpilatora.
- Dowiedz się, jak korzystać z opcji prymitywu.
- Zobacz API dla opcji Estimator.
- Przeczytaj Migracja do prymitywów V2.