Zum Hauptinhalt springen

Estimator-Schnellstart

Das Estimator-Primitive berechnet die Erwartungswerte für einen oder mehrere Observablen bezüglich der durch Quantum Circuits vorbereiteten Zustände. Die Circuits können parametrisiert sein, solange die Parameterwerte ebenfalls als Eingabe an das Primitive übergeben werden.

Dieses Primitive verfügt über mehrere eingebaute Fehlerminderungs- und -unterdrückungstechniken, darunter Dynamical Decoupling, Pauli-Twirling, Gate-Folding ZNE, PEA und PEC. Es unterstützt außerdem eine Option resilience_level, mit der du den Kompromiss zwischen Kosten und Genauigkeit einfach konfigurieren kannst. Die Schritte in diesem Thema beschreiben, wie du den Estimator einrichtest, die verfügbaren Konfigurationsoptionen erkundest und ihn in einem Programm aufrufst.

Paketversionen

Der Code auf dieser Seite wurde mit den folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.

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

## Schritte zur Verwendung des Estimator-Primitives \{#steps-to-use-the-estimator-primitive}

### 1. Konto initialisieren \{#1-initialize-the-account}

Da Qiskit Runtime ein verwalteter Dienst ist, musst du zunächst dein Konto initialisieren. Danach kannst du den QPU auswählen, den du zur Berechnung des Erwartungswerts verwenden möchtest.

Folge den Schritten unter [IBM Cloud-Konto einrichten](cloud-setup), falls du noch kein Konto hast.

:::note[Fractional Gates]

Um die neu unterstützten [Fractional Gates](/guides/fractional-gates) zu verwenden, setze `use_fractional_gates=True`, wenn du ein Backend von einer `QiskitRuntimeService`-Instanz anforderst. Zum Beispiel:
```python
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)

Dies ist eine experimentelle Funktion und kann sich in Zukunft ändern.

:::

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. Circuit und Observable erstellen

Du benötigst mindestens einen Circuit und einen Observablen als Eingaben für das Estimator-Primitive.

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]

Der Circuit und der Observable müssen so transformiert werden, dass sie nur Anweisungen verwenden, die vom QPU unterstützt werden (bezeichnet als Instruction Set Architecture (ISA)-Circuits). Verwende dafür den 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 initialisieren

Wenn du den Estimator initialisierst, verwende den Parameter mode, um den gewünschten Ausführungsmodus festzulegen. Mögliche Werte sind batch-, session- oder backend-Objekte für den Batch-, Session- bzw. Job-Ausführungsmodus. Weitere Informationen findest du unter Einführung in Qiskit Runtime-Ausführungsmodi. Beachte, dass Nutzer des Open Plan keine Session-Jobs einreichen können.

from qiskit_ibm_runtime import EstimatorV2 as Estimator

estimator = Estimator(mode=backend)

4. Estimator aufrufen und Ergebnisse abrufen

Rufe als Nächstes die Methode run() auf, um Erwartungswerte für die Eingabe-Circuits und Observablen zu berechnen. Circuit, Observable und optionale Parameterwert-Sets werden als Primitive Unified Bloc (PUB)-Tupel übergeben.

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}

Nächste Schritte

Empfehlungen