Pular para o conteúdo principal

Especificar opções do Estimator

Versões dos pacotes

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

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

Você pode usar opções para personalizar a primitiva Estimator. 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 para obter informações sobre as opções de qiskit.primitives.BaseEstimatorV2 e qiskit_aer.BaseEstimatorV2.

Notes :

Notas sobre como especificar opções nas primitivas Estimator
  • Você pode ver as opções disponíveis e atualizar os valores de opção durante ou após a inicialização do Estimator.
  • Use o método update() para aplicar alterações ao atributo options.
  • Se você não especificar um valor para uma opção, ela recebe um valor especial de Unset e os padrões do servidor são usados.
  • O atributo options é do tipo Python dataclass. Você pode usar o método integrado asdict para convertê-lo em um dicionário.

Definir opções do Estimator

Você pode definir opções ao inicializar o Estimator, após inicializar o Estimator, ou (somente para precision), no método run().

Inicialização da primitiva

Você pode passar uma instância da classe de opções ou um dicionário ao inicializar o Estimator, que então faz uma cópia dessas opções. Assim, alterar o dicionário original ou a instância de opções não afeta as opções de propriedade da primitiva.

Classe de opções

Ao criar uma instância da classe EstimatorV2, você pode passar uma instância da classe de opções. Essas opções serão aplicadas quando você usar run() para realizar o cálculo. Especifique as opções neste formato: options.option.sub-option.sub-sub-option = choice. Por exemplo: options.dynamical_decoupling.enable = True

Exemplo:

# 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 EstimatorV2 as Estimator
from qiskit_ibm_runtime.options import EstimatorOptions

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

options = EstimatorOptions(
resilience_level=2,
resilience={"zne_mitigation": True, "zne": {"noise_factors": [1, 3, 5]}},
)

# or...
options = EstimatorOptions()
options.resilience_level = 2
options.resilience.zne_mitigation = True
options.resilience.zne.noise_factors = [1, 3, 5]

estimator = Estimator(mode=backend, options=options)

Dicionário

Você pode especificar opções como um dicionário ao inicializar o Estimator.

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator

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

# Setting options during initialization
estimator = Estimator(
backend,
options={
"resilience_level": 2,
"resilience": {
"zne_mitigation": True,
"zne": {"noise_factors": [1, 3, 5]},
},
},
)

Atualizar opções após a inicialização

Você pode especificar as opções neste formato: estimator.options.option.sub-option.sub-sub-option = choice para aproveitar o autocompletar, ou usar o método update() para fazer atualizações em massa.

A classe de opções do EstimatorV2 (EstimatorOptions) não precisa ser instanciada se você estiver definindo opções após inicializar a primitiva.

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator

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

estimator = Estimator(mode=backend)

# Setting options after initialization
# This uses auto-complete.
estimator.options.default_precision = 0.01
# This does bulk update.
estimator.options.update(
default_precision=0.02, resilience={"zne_mitigation": True}
)

Método Run()

Os únicos valores que você pode passar a run() são os definidos na interface. Ou seja, precision para Estimator. Isso sobrescreve qualquer valor definido para default_precision na execução atual.

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit.circuit.library import random_iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp

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

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

observable = SparsePauliOp("Z" * 3)

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

transpiled1 = pass_manager.run(circuit1)
transpiled2 = pass_manager.run(circuit2)
isa_observable1 = observable.apply_layout(transpiled1.layout)
isa_observable2 = observable.apply_layout(transpiled2.layout)

estimator = Estimator(mode=backend)
# Default precision to use if not specified in run()
estimator.options.default_precision = 0.01
# Run two circuits, requiring a precision of .02 for both.
estimator.run(
[(transpiled1, isa_observable1), (transpiled2, isa_observable2)],
precision=0.02,
)
<RuntimeJobV2('d7amh42k86tc73a1sa20', 'estimator')>

Caso especial: precision

O método EstimatorV2.run aceita dois argumentos: uma lista de PUBs, cada um dos quais pode especificar um valor de precision específico para o PUB, e um argumento keyword precision. Esses valores de precision fazem parte da interface de execução do Estimator e são independentes das opções do Runtime Estimator. Eles têm precedência sobre qualquer valor especificado como opção, a fim de cumprir com a abstração do Estimator.

No entanto, se precision não for especificado por nenhum PUB nem no argumento keyword run (ou se todos forem None), o valor de precision das opções é usado, especialmente default_precision.

nota

Esses parâmetros de precision servem apenas para especificar a precision alvo, e não há garantia de que os resultados alcançarão a precision especificada.

Note que as opções do Estimator contêm tanto default_shots quanto default_precision. No entanto, como gate-twirling está habilitado por padrão, o produto de num_randomizations e shots_per_randomization tem precedência sobre essas duas opções.

Especificamente, para qualquer PUB do Estimator:

  1. Se o PUB especifica precision, use esse valor.
  2. Se o argumento keyword precision for especificado em run, use esse valor.
  3. Se twirling estiver habilitado (True por padrão), o produto de num_randomizations e shots_per_randomization, conforme especificado nas opções de twirling, é usado.
  4. Se estimator.options.default_shots for especificado, use esse valor para controlar a quantidade de dados.
  5. Se estimator.options.default_precision for especificado, use esse valor.

Por exemplo, se precision for especificado em todos os quatro lugares, o de maior precedência (precision especificado no PUB) é usado.

nota

Embora a precision especificada no PUB e em run tenha maior precedência, o job falha se twirling estiver habilitado e o produto de num_randomizations e shots_per_randomization for menor que os shots necessários para atingir a precision. Nesse cenário, o EstimatorV2 não consegue alocar os shots entre os num_randomizations especificados.

nota

A precision escala inversamente com o uso. Ou seja, quanto menor a precision, mais tempo de QPU é necessário para executar.

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit.circuit.library import random_iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp

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

observable = SparsePauliOp("Z" * 3)

circuit = random_iqp(3)
circuit.measure_all()

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

isa_circuit = pass_manager.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)

# Setting precision during primitive initialization
estimator = Estimator(mode=backend, options={"default_precision": 0.05})

# Run with precision=0.02, overwriting the default.
estimator.run(
[(isa_circuit, isa_observable1)],
precision=0.02,
)
<RuntimeJobV2('d8286b00bvlc73d1vn50', 'estimator')>

Desativar toda mitigação e supressão de erros

Você pode desativar toda mitigação e supressão de erros se, por exemplo, estiver fazendo pesquisa sobre suas próprias técnicas de mitigação. Para fazer isso, defina resilience_level = 0.

Exemplo:

from qiskit_ibm_runtime import EstimatorV2 as Estimator, QiskitRuntimeService

# Define the service. This allows you to access an IBM QPU.
service = QiskitRuntimeService()

# Get a backend
backend = service.least_busy(operational=True, simulator=False)

# Define Estimator
estimator = Estimator(backend)

options = estimator.options

# Turn off all error mitigation and suppression
options.resilience_level = 0

Opções disponíveis

A tabela a seguir documenta as opções da versão mais recente de qiskit-ibm-runtime. Para ver versões de opções mais antigas, 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 default_shots

default_precision

A precision padrão a usar para qualquer PUB ou chamada run() que não especifique uma.

Opções: Float > 0

Padrão: 0.015625 (1 / sqrt(4096))

Documentação de API default_precision

dynamical_decoupling

Controla as configurações de mitigação de erros de dynamical decoupling.

Documentação de API 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 environment

environment.callback

Função callable que recebe o ID do job e o resultado do job.

Opções: None

Padrão: None

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 execution

execution.init_qubits

Se deve redefinir os qubits 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: Dado por backend.default_rep_delay

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 detalhes.

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

Padrão: 10800 (3 horas)

resilience

Opções avançadas de resiliência para ajustar a estratégia de resiliência.

Documentação de API resilience

resilience.layer_noise_learning

Opções para aprendizado de ruído por camada.

Documentação de API resilience.layer_noise_learning

resilience.layer_noise_learning.layer_pair_depths

Opções: list[int] de 2-10 valores no intervalo [0, 200]

Padrão: (0, 1, 2, 4, 16, 32)

resilience.layer_noise_learning.max_layers_to_learn

Opções: None, Inteiro >= 1

Padrão: 4

resilience.layer_noise_learning.num_randomizations

Opções: Inteiro >= 1

Padrão: 32

resilience.layer_noise_learning.shots_per_randomization

Opções: Inteiro >= 1

Padrão: 128

resilience.layer_noise_model

Opções: NoiseLearnerResult, Sequence[LayerError]

Padrão: None

resilience.measure_mitigation

Opções: True, False

Padrão: True

resilience.measure_noise_learning

Opções para aprendizado de ruído de medição.

Documentação de API resilience.measure_noise_learning

resilience.measure_noise_learning.num_randomizations

Opções: Inteiro >= 1

Padrão: 32

resilience.measure_noise_learning.shots_per_randomization

Opções: Inteiro, auto

Padrão: auto

resilience.pec_mitigation

Opções: True, False

Padrão: False

resilience.pec

Opções de mitigação de cancelamento probabilístico de erros.

Documentação de API resilience.pec

resilience.pec.max_overhead

Opções: None, Inteiro >= 1

Padrão: 100

resilience.pec.noise_gain

Opções: auto, float no intervalo [0, 1]

Padrão: auto

resilience.zne_mitigation

Opções: True, False

Padrão: False

resilience.zne
resilience.zne.amplifier

Opções: gate_folding, gate_folding_front, gate_folding_back, pea

Padrão: gate_folding

resilience.zne.extrapolated_noise_factors

Opções: Lista de floats

Padrão: [0, *noise_factors]

resilience.zne.extrapolator

Opções: Um ou mais de: exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7), fallback

Padrão: (exponential, linear)

resilience.zne.noise_factors

Opções: Lista de floats; cada float >= 1

Padrão: (1, 1.5, 2) para PEA, e (1, 3, 5) caso contrário

resilience_level

Quanta resiliência construir contra erros. Níveis mais altos geram resultados mais precisos ao custo de tempos de processamento mais longos. Consulte a seção níveis de resiliência no tópico Gerenciamento de ruído para saber mais.

Opções: 0, 1, 2

Padrão: 1

Documentação de API resilience_level

seed_estimator

Opções: Inteiro

Padrão: None

seed_estimator

simulator

Opções a passar ao simular um backend

Documentação de API simulator

simulator.basis_gates

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

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

simulator.coupling_map

Opções: Lista de interações bidirecionais de dois qubits

Padrão: None, o que implica nenhuma restrição 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 twirling

twirling.enable_gates

Opções: True, False

Padrão: False

twirling.enable_measure

Opções: True, False

Padrão: True

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 funcionalidades

Certas funcionalidades de runtime não podem ser usadas juntas em um único job. Clique na aba apropriada para ver a lista de funcionalidades incompatíveis com a funcionalidade selecionada:

Fractional gates

Incompatível com:

  • Gate twirling
  • PEA
  • PEC
Gate-folding ZNE

Pode não funcionar ao usar gates personalizados. Incompatível com:

  • PEA
  • PEC
Gate twirling

Incompatível com:

  • Fractional gates
  • Stretches

Outras observações:

  • O measurement twirling só pode ser aplicado a medições terminais.
  • Não funciona com entangladores não-Clifford.
PEA

Incompatível com:

  • Fractional gates
  • Gate-folding ZNE
  • PEC
PEC

Incompatível com:

  • Fractional gates
  • Gate-folding ZNE
  • PEA

Próximos passos

Recomendações