Pular para o conteúdo principal

Especificar opções do Sampler

Versões dos pacotes

O código desta página foi desenvolvido com os seguintes requisitos. Recomendamos usar essas versões ou versões mais recentes.

qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1

Você pode usar opções para personalizar a primitiva Sampler. Esta seção foca em como especificar as opções da primitiva Qiskit Runtime. Embora a interface do método run() das primitivas seja comum a todas as implementações, suas opções não são. Consulte as referências de API correspondentes para obter informações sobre as opções de qiskit.primitives.BackendSamplerV2 e qiskit_aer.primitives.SamplerV2.

Definir opções do Sampler

Você pode definir opções ao inicializar o Sampler, após inicializá-lo, ou atualizar as opções depois que o Sampler foi inicializado. Para instruções sobre como usar essas técnicas, consulte o tópico Introdução às opções.

Além disso, você pode definir o valor shots no método run(), conforme descrito na seção a seguir.

Método Run()

Os únicos valores que você pode passar para run() são os definidos na interface, ou seja, shots. Isso substitui qualquer valor definido para default_shots na execução atual.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.circuit.library import random_iqp
from qiskit.transpiler import generate_preset_pass_manager

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circuit1 = random_iqp(3)
circuit1.measure_all()
circuit2 = random_iqp(3)
circuit2.measure_all()

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend
)

transpiled1 = pass_manager.run(circuit1)
transpiled2 = pass_manager.run(circuit2)

sampler = Sampler(mode=backend)
# Default shots to use if not specified in run()
sampler.options.default_shots = 500
# Sample two circuits at 128 shots each.
sampler.run([transpiled1, transpiled2], shots=128)
<RuntimeJobV2('d8286680bvlc73d1vmu0', 'sampler')>

Casos especiais

Shots

O método SamplerV2.run aceita dois argumentos: uma lista de PUBs, cada um dos quais pode especificar um valor de shots específico do PUB, e um argumento de palavra-chave shots. Esses valores de shots fazem parte da interface de execução do Sampler e são independentes das opções do Sampler Runtime. Eles têm precedência sobre quaisquer valores especificados como opções para cumprir com a abstração do Sampler.

Porém, se shots não for especificado por nenhum PUB nem no argumento de palavra-chave run (ou se forem todos None), então o valor de shots das opções é usado, principalmente default_shots.

Em resumo, esta é a ordem de precedência para especificar shots no Sampler, para qualquer PUB particular:

  1. Se o PUB especificar shots, usar esse valor.
  2. Se o argumento de palavra-chave shots for especificado em run, usar esse valor.
  3. Se twirling estiver habilitado (True por padrão), então o produto de num_randomizations e shots_per_randomization, conforme especificado nas opções de twirling, é usado.
  4. Se sampler.options.default_shots for especificado, usar esse valor.

Portanto, se shots forem especificados em todos os lugares possíveis, o de maior precedência (shots especificados no PUB) é usado.

nota

Embora os shots especificados no PUB e em run tenham maior precedência, o job falha se twirling estiver habilitado e o produto de num_randomizations e shots_per_randomization for menor que o valor de shots. Nesse cenário, o SamplerV2 não consegue alocar os shots entre os num_randomizations especificados.

Exemplo:

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.circuit.library import random_iqp
from qiskit.transpiler import generate_preset_pass_manager

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circuit1 = random_iqp(3)
circuit1.measure_all()
circuit2 = random_iqp(3)
circuit2.measure_all()

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend
)

transpiled1 = pass_manager.run(circuit1)
transpiled2 = pass_manager.run(circuit2)

# Setting shots during primitive initialization
sampler = Sampler(mode=backend, options={"default_shots": 4096})

# Setting options after primitive initialization
# This uses auto-complete.
sampler.options.default_shots = 2000

# This does bulk update. The value for default_shots is overridden
# if you specify shots with run() or in the PUB.
sampler.options.update(
default_shots=1024, dynamical_decoupling={"sequence_type": "XpXm"}
)

# Sample two circuits at 128 shots each.
sampler.run([transpiled1, transpiled2], shots=128)
<RuntimeJobV2('d82868ugbeec73alfa80', 'sampler')>

Opções disponíveis

A tabela a seguir documenta as opções da versão mais recente do qiskit-ibm-runtime. Para ver versões anteriores das opções, visite a referência de API do qiskit-ibm-runtime e selecione uma versão anterior.

default_shots

O número total de shots a usar por circuito por configuração.

Opções: Inteiro >= 0

Padrão: None

Documentação de API de default_shots

dynamical_decoupling

Controla as configurações de mitigação de erros por desacoplamento dinâmico.

Documentação de API de dynamical_decoupling

dynamical_decoupling.enable

Opções: True, False

Padrão: False

dynamical_decoupling.extra_slack_distribution

Opções: middle, edges

Padrão: middle

dynamical_decoupling.scheduling_method

Opções: asap, alap Padrão: alap

dynamical_decoupling.sequence_type

Opções: XX, XpXm, XY4 Padrão: XX

dynamical_decoupling.skip_reset_qubits

Opções: True, False Padrão: False

environment

Documentação de API de environment

environment.job_tags

Lista de tags.

Opções: None

Padrão: None

environment.log_level

Opções: DEBUG, INFO, WARNING, ERROR, CRITICAL

Padrão: WARNING

environment.private

Opções: True, False

Padrão: False

execution

Documentação de API de execution

execution.init_qubits

Se os qubits devem ser redefinidos para o estado fundamental a cada shot.

Opções: True, False

Padrão: True

execution.rep_delay

O atraso entre uma medição e o circuito quântico subsequente.

Opções: Valor no intervalo fornecido por backend.rep_delay_range

Padrão: Fornecido por backend.default_rep_delay

execution.meas_type

Opções: classified, kerneled, avg_kerneled

Padrão: classified

max_execution_time

Limita por quanto tempo um job pode ser executado, em segundos. Consulte o guia de tempo máximo de execução para mais detalhes.

Opções: Número inteiro de segundos no intervalo [1, 10800]

Padrão: 10800 (3 horas)

Documentação de API de max_execution_time

simulator

Opções a passar ao simular um Backend

Documentação de API de simulator

simulator.basis_gates

Opções: Lista de nomes de gates base para desdobrar

Padrão: O conjunto de todos os gates base suportados pelo simulador Qiskit Aer

simulator.coupling_map

Opções: Lista de interações direcionadas entre dois qubits

Padrão: None, o que implica ausência de restrições de conectividade (conectividade total).

simulator.noise_model

Opções: Qiskit Aer NoiseModel, ou sua representação

Padrão: None

simulator.seed_simulator

Opções: Inteiro

Padrão: None

twirling

Opções de twirling

Documentação de API de twirling

twirling.enable_gates

Opções: True, False

Padrão: False

twirling.enable_measure

Opções: True, False

Padrão: False

twirling.num_randomizations

Opções: auto, Inteiro >= 1

Padrão: auto

twirling.shots_per_randomization

Opções: auto, Inteiro >= 1

Padrão: auto

twirling.strategy

Opções: active, active-circuit, active-accum, all

Padrão: active-accum

experimental

Opções experimentais, quando disponíveis.

Compatibilidade de recursos

Certos recursos de runtime não podem ser usados juntos em um único job. Clique na aba apropriada para ver uma lista de recursos incompatíveis com o recurso selecionado:

Circuitos dinâmicos

Incompatível com:

  • Desacoplamento dinâmico

Outras observações:

  • O twirling de gates pode ser aplicado a circuitos dinâmicos, mas apenas a gates que não estejam dentro de blocos condicionais. O twirling de medição só pode ser aplicado a medições terminais.
  • Compatível com gates fracionários ao usar o qiskit-ibm-runtime v0.42.0 ou posterior.
Desacoplamento dinâmico

Incompatível com:

  • Circuitos dinâmicos
Gates fracionários

Incompatível com:

  • Twirling de gates

Compatível com circuitos dinâmicos ao usar o qiskit-ibm-runtime v0.42.0 ou posterior.

Twirling de gates

Incompatível com:

  • Gates fracionários
  • Stretches

Outras observações:

  • O twirling de gates pode ser aplicado a circuitos dinâmicos, mas apenas a gates que não estejam dentro de blocos condicionais.
  • O twirling de medição só pode ser aplicado a medições terminais.
  • O twirling de medição é incompatível com a instrução store.
  • Não funciona com entanglers não-Clifford.

Próximos passos

Recomendações