Sari la conținutul principal

Start rapid cu Estimator

Primitiva Estimator calculează valorile de așteptare pentru unul sau mai mulți observabili față de stările pregătite de circuite cuantice. Circuitele pot fi parametrizate, cu condiția ca valorile parametrilor să fie furnizate de asemenea ca intrare primitivei.

Această primitivă are mai multe tehnici integrate de atenuare și suprimare a erorilor, inclusiv decuplare dinamică, Pauli-twirling, ZNE prin pliere de gate, PEA și PEC. Suportă, de asemenea, o opțiune resilience_level care îți permite să configurezi ușor compromisul cost-acuratețe. Pașii din acest subiect descriu cum să configurezi Estimator, să explorezi opțiunile pe care le poți folosi pentru a-l configura și să îl invoci într-un program.

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm utilizarea acestor versiuni sau a unor versiuni mai noi.

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

## Pași pentru utilizarea primitivei Estimator \{#steps-to-use-the-estimator-primitive}

### 1. Inițializarea contului \{#1-initialize-the-account}

Deoarece Qiskit Runtime este un serviciu gestionat, trebuie mai întâi să îți inițializezi contul. Poți selecta apoi QPU-ul pe care vrei să îl folosești pentru a calcula valoarea de așteptare.

Urmează pașii din [Configurarea contului IBM Cloud](cloud-setup) dacă nu ai deja un cont configurat.

:::note[Gate-uri fracționale]

Pentru a utiliza [gate-urile fracționale](/guides/fractional-gates) nou suportate, setează `use_fractional_gates=True` atunci când soliciți un backend dintr-o instanță `QiskitRuntimeService`. De exemplu:
```python
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)

Aceasta este o caracteristică experimentală și s-ar putea schimba în viitor.

:::

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. Crearea unui circuit și a unui observabil

Ai nevoie de cel puțin un circuit și un observabil ca intrări pentru primitiva Estimator.

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]

Circuitul și observabilul trebuie transformate pentru a utiliza doar instrucțiunile suportate de QPU (denumite circuite de arhitectură set de instrucțiuni (ISA)). Folosește transpilerul pentru aceasta.

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. Inițializarea Qiskit Runtime Estimator

Când inițializezi Estimator, folosești parametrul mode pentru a specifica modul în care vrei să ruleze. Valorile posibile sunt obiecte batch, session sau backend pentru modul de execuție batch, session și respectiv job. Pentru mai multe informații, consultă Introducere în modurile de execuție Qiskit Runtime. Rețineți că utilizatorii planului Open nu pot trimite joburi de sesiune.

from qiskit_ibm_runtime import EstimatorV2 as Estimator

estimator = Estimator(mode=backend)

4. Invocarea Estimator și obținerea rezultatelor

Apoi, invocă metoda run() pentru a calcula valorile de așteptare pentru circuitele și observabilii de intrare. Circuitul, observabilul și seturile opționale de valori de parametri sunt introduse ca tupluri 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}

Pașii următori

Recomandări