Przejdź do głównej treści
Ten projekt jest w wersji beta. Znalazłeś błąd? Otwórz zgłoszenie na GitHub. Masz pytanie lub pomysł? Zapytaj w Discussions — chętnie poznamy Twoją opinię!
Jak oceniasz jakość tłumaczenia tej strony?

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.

Nowa implementacja Estimatora

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.

Bramki ułamkowe

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​

Zalecenia