Guía rápida de Estimator
La primitiva Estimator calcula los valores esperados de una o varias variables observables con respecto a los estados generados por circuitos cuánticos. Los circuitos se pueden parametrizar, siempre y cuando los valores de los parámetros también se proporcionen como entrada a la primitiva.
Esta primitiva cuenta con varias técnicas integradas de mitigación y supresión de errores, entre las que se incluyen el desacoplamiento dinámico, el «Pauli-twirling», el ZNE con plegado de puertas, el PEA y el PEC. Además, admite una resilience_level opción que te permite configurar fácilmente el equilibrio entre coste y precisión.
Los pasos de este tema describen cómo instalar Estimator, explorar las opciones disponibles para configurarlo y ejecutarlo en un programa.
Se han introducido nuevas implementaciones de las interfaces « SamplerV2 » y « EstimatorV2 » de Qiskit en qiskit-ibm-runtime v0.50.0. Estas primitivas del lado del cliente realizan la mayor parte del preprocesamiento y el posprocesamiento en el lado del cliente y delegan la ejecución a la primitiva «Executor». La ejecución en el lado del cliente ofrece mayor transparencia, una respuesta más rápida en la depuración y un control más preciso.
Dado que implementan la misma API, estas primitivas del lado del cliente son, en gran medida, sustitutos directos de las primitivas heredadas del lado del servidor, siendo el único cambio la instrucción de importación. Para obtener más información, consulta «Migración del Sampler y el Estimator del lado del servidor al lado del cliente ».
El código de esta página se ha desarrollado teniendo en cuenta los siguientes requisitos. Recomendamos utilizar estas versiones o posteriores.
qiskit[all]~=2.5.2 qiskit-ibm-runtime~=0.47.0
Pasos para utilizar la primitiva «Estimator»
1. Inicializar la cuenta
Primero tienes que activar tu cuenta. A continuación, puedes seleccionar la QPU que quieras utilizar para calcular el valor esperado.
Sigue los pasos que se indican en la sección «Configurar tu cuenta de IBM Cloud » si aún no tienes una cuenta.
Para utilizar las puertas fraccionarias, que ahora son compatibles, configúralas use_fractional_gates=True al solicitar un backend desde una QiskitRuntimeService instancia. Por ejemplo:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)Esta es una función experimental y podría cambiar en el futuro.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
print(backend.name)Output:
ibm_fez
2. Crea un circuito y una variable observable
Necesitas al menos un circuito y una variable observable como entradas para la 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]El circuito y la variable observable deben transformarse para que utilicen únicamente instrucciones compatibles con la QPU (lo que se conoce como circuitos de arquitectura de conjunto de instrucciones, o ISA ). Para ello, utiliza el transpilador.
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()}")Output:
>>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])
3. Inicializar el estimador « IBM Quantum »
Al inicializar Estimator, utiliza el parámetro mode para especificar el modo en el que quieres que se ejecute. Los valores posibles son batch, session, u backend objetos para los modos de ejecución por lotes, por sesión y por trabajo, respectivamente. Para obtener más información, consulta la sección «Introducción a los modos de ejecución del servicio de IBM Quantum Compute ». Ten en cuenta que los usuarios de Open Plan no pueden enviar trabajos de sesión.
# 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. Ejecuta Estimator y obtén los resultados
A continuación, invoca el run() método para calcular los valores esperados de los circuitos de entrada y las observables. Los conjuntos de valores de los parámetros de circuito, observables y opcionales se introducen como tuplas de bloques unificados primitivos ( PUB ).
job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")Output:
>>> 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}")Output:
>>> 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}
Próximos pasos
- Descubre cómo realizar pruebas a nivel local antes de ejecutar el programa en ordenadores cuánticos.
- Revisa los ejemplos detallados.
- Practica con primitivas siguiendo la lección sobre la función «Cost» en IBM Quantum Learning.
- Descubre cómo realizar la transpilación de forma local en la sección «Transpilación ».
- Consulta la guía sobre la configuración del transpilador Compare.
- Aprende a utilizar las opciones básicas.
- Consulta la API para conocer las opciones de Estimator.