Saltar al contenido principal

Función de Circuit de IBM

Consulta la referencia de API

Nota
  • Las Qiskit Functions son una función experimental disponible únicamente para usuarios del Plan Premium, Plan Flex y Plan On-Prem (a través de la API de IBM Quantum Platform) de IBM Quantum®. Están en estado de versión preliminar y pueden cambiar.

Descripción general

La función de Circuit de IBM® recibe PUBs abstractos como entradas y devuelve valores de expectación mitigados como salidas. Esta función de Circuit incluye un pipeline automatizado y personalizado para que los investigadores puedan centrarse en el descubrimiento de algoritmos y aplicaciones.

Descripción

Después de enviar tu PUB, tus circuitos abstractos y observables se transpilan automáticamente, se ejecutan en hardware y se post-procesan para devolver valores de expectación mitigados. Para ello, combina las siguientes herramientas:

IBM Circuit function

Primeros pasos

Autentícate con tu clave de API y selecciona la Qiskit Function de la siguiente manera. (Este fragmento asume que ya has guardado tu cuenta en tu entorno local.)

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

function = catalog.load("ibm/circuit-function")

Ejemplos

Para comenzar, prueba este ejemplo básico:

from qiskit.circuit.random import random_circuit
from qiskit_ibm_runtime import QiskitRuntimeService

# You can skip this step if you have a target backend, e.g.
# backend_name = "ibm_brisbane"
# You'll need to specify the credentials when initializing QiskitRuntimeService, if they were not previously saved.
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits
pubs = [(circuit, observable)]

job = function.run(
# Use `backend_name=backend_name` if you didn't initialize a backend object
backend_name=backend.name,
pubs=pubs,
)

Consulta el estado de la carga de trabajo de tu Qiskit Function o recupera los resultados de la siguiente manera:

print(job.status())
result = job.result()
QUEUED

Los resultados tienen el mismo formato que un resultado de Estimator:

print(f"The result of the submitted job had {len(result)} PUB\n")
print(
f"The associated PubResult of this job has the following DataBins:\n {result[0].data}\n"
)
print(f"And this DataBin has attributes: {result[0].data.keys()}")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
The result of the submitted job had 1 PUB

The associated PubResult of this job has the following DataBins:
DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>))

And this DataBin has attributes: dict_keys(['evs', 'stds', 'ensemble_standard_error'])
The expectation values measured from this PUB are:
1.02116704805492

Ejemplos de nivel de mitigación

El siguiente ejemplo muestra cómo establecer el nivel de mitigación:

options = {"mitigation_level": 2}

job = function.run(backend_name=backend.name, pubs=pubs, options=options)

En el siguiente ejemplo, establecer el nivel de mitigación en 1 desactiva inicialmente la mitigación ZNE, pero establecer zne_mitigation en True sobreescribe la configuración relevante de mitigation_level.

options = {"mitigation_level": 1, "resilience": {"zne_mitigation": True}}

Ejemplo de salida

El siguiente fragmento de código describe el formato de PrimitiveResult (y el PubResult asociado).

print(f"The result of the submitted job had {len(result)} PUB")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
print(f"And the associated metadata is: \n{result[0].metadata}")
The result of the submitted job had 1 PUB
The expectation values measured from this PUB are:
1.02116704805492
And the associated metadata is:
{'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

Obtener mensajes de error

Si el estado de tu carga de trabajo es ERROR, usa job.result() para obtener el mensaje de error y depurar el problema de la siguiente manera:

job = function.run(
backend_name="bad_backend_name", pubs=pubs, options=options
)

print(job.result())

Obtener soporte

Contacta con el soporte de IBM Quantum e incluye la siguiente información:

  • ID del trabajo de Qiskit Function (qiskit-ibm-catalog), job.job_id
  • Una descripción detallada del problema
  • Cualquier mensaje o código de error relevante
  • Pasos para reproducir el problema

Próximos pasos

Recomendaciones