Pular para o conteúdo principal

Função de circuito IBM

Consulte a referência da API

Nota
  • As Qiskit Functions são um recurso experimental disponível apenas para usuários dos planos IBM Quantum® Premium, Flex e On-Prem (via API do IBM Quantum Platform). Elas estão em status de pré-lançamento e sujeitas a alterações.

Visão geral

A função de circuito IBM® recebe PUBs abstratos como entradas e retorna valores de expectativa mitigados como saídas. Essa função de circuito inclui um pipeline automatizado e personalizado para permitir que pesquisadores se concentrem na descoberta de algoritmos e aplicações.

Descrição

Após enviar seu PUB, seus circuitos abstratos e observáveis são automaticamente transpilados, executados em hardware e pós-processados para retornar valores de expectativa mitigados. Para isso, combina as seguintes ferramentas:

Função de circuito IBM

Primeiros passos

Autentique-se usando sua chave de API e selecione a Qiskit Function da seguinte forma. (Este trecho assume que você já salvou sua conta no seu ambiente 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")

Exemplos

Para começar, experimente este exemplo 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,
)

Verifique o status da sua carga de trabalho da Qiskit Function ou obtenha os resultados da seguinte forma:

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

Os resultados têm o mesmo formato de um resultado do 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

Exemplos de nível de mitigação

O exemplo a seguir demonstra como definir o nível de mitigação:

options = {"mitigation_level": 2}

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

No exemplo a seguir, definir o nível de mitigação como 1 desativa inicialmente a mitigação ZNE, mas definir zne_mitigation como True substitui a configuração relevante do mitigation_level.

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

Exemplo de saída

O trecho de código a seguir descreve o formato do PrimitiveResult (e do PubResult associado).

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}

Buscar mensagens de erro

Se o status da sua carga de trabalho for ERROR, use job.result() para obter a mensagem de erro e ajudar na depuração da seguinte forma:

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

print(job.result())

Obter suporte

Entre em contato com o suporte IBM Quantum e inclua as seguintes informações:

  • ID do job da Qiskit Function (qiskit-ibm-catalog), job.job_id
  • Uma descrição detalhada do problema
  • Quaisquer mensagens de erro ou códigos relevantes
  • Passos para reproduzir o problema

Próximos passos

Recomendações