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.
W wersji qiskit-ibm-runtime v0.50.0 wprowadzono nowe implementacje interfejsów Qiskit SamplerV2 i EstimatorV2. Te prymitywy po stronie klienta wykonują większość przetwarzania wstępnego i końcowego po stronie klienta oraz delegują wykonanie do prymitywu Executor. Działanie po stronie klienta zapewnia większą przejrzystość, szybszą informację zwrotną podczas debugowania i dokładniejszą kontrolę.
Ponieważ implementują ten sam interfejs API, te prymitywy po stronie klienta w dużej mierze bezpośrednio zastępują starsze prymitywy po stronie serwera, przy czym jedyną zmianą jest instrukcja importu. Więcej informacji znajdziesz w przewodniku Migracja z Sampler i Estimator po stronie serwera na wersje po stronie klienta.
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.5.2
qiskit-ibm-runtime~=0.47.0
Kroki korzystania z prymitywu Estimator
1. Inicjalizacja konta
Najpierw musisz 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.
Aby korzystać z nowo obsługiwanych bramek ułamkowych, ustaw use_fractional_gates=True podczas żądania backendu z instancji QiskitRuntimeService. Na przykład:
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.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 IBM Quantum 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 IBM Quantum Compute Service. Pamiętaj, że użytkownicy Open Plan nie mogą przesyłać zadań sesji.
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Estimator
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_estimator import 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: dab7lfurrl7c7386gjn0
>>> 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: 28.60306448415693
> 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ą o 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 prymitywów.
- Zobacz API dla opcji Estimator.