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.5.2
qiskit-ibm-runtime~=0.47.0

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('dab7lhjvpcac73ddekcg', '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 nomeado 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, em conformidade com a abstração do Estimator.

No entanto, se precision não for especificado por nenhum PUB nem no argumento nomeado 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 nomeado precision for especificado em run, use 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 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('dab7ljjvpcac73ddekgg', '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.

Valores: 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.

Valores: 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

Valores: True, False

Padrão: False

dynamical_decoupling.extra_slack_distribution

Valores: 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 chamável que recebe o Job ID e o Job result.

Valores: None

Padrão: None

environment.job_tags

Lista de tags.

Valores: None

Padrão: None

environment.log_level

Valores: DEBUG, INFO, WARNING, ERROR, CRITICAL

Padrão: WARNING

environment.private

Valores: 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.

Valores: True, False

Padrão: True

execution.rep_delay

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

Valores: 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.

Valores: 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

Valores: 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

Valores: None, Inteiro >= 1

Padrão: 4

resilience.layer_noise_learning.num_randomizations

Valores: Inteiro >= 1

Padrão: 32

resilience.layer_noise_learning.shots_per_randomization

Valores: Inteiro >= 1

Padrão: 128

resilience.layer_noise_model

Valores: NoiseLearnerResult, Sequence[LayerError]

Padrão: None

resilience.measure_mitigation

Valores: 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

Valores: Inteiro >= 1

Padrão: 32

resilience.measure_noise_learning.shots_per_randomization

Valores: Inteiro, auto

Padrão: auto

resilience.pec_mitigation

Valores: 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

Valores: None, Inteiro >= 1

Padrão: 100

resilience.pec.noise_gain

Valores: auto, float no intervalo [0, 1]

Padrão: auto

resilience.zne_mitigation

Valores: True, False

Padrão: False

resilience.zne
resilience.zne.amplifier

Valores: gate_folding, gate_folding_front, gate_folding_back, pea

Padrão: gate_folding

resilience.zne.extrapolated_noise_factors

Valores: Lista de floats

Padrão: [0, *noise_factors]

resilience.zne.extrapolator

Valores: Um ou mais de: exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7), fallback

Padrão: (exponential, linear)

resilience.zne.noise_factors

Valores: 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.

Valores: 0, 1, 2

Padrão: 1

Documentação de API resilience_level

seed_estimator

Valores: Inteiro

Padrão: None

seed_estimator

simulator

Opções a passar ao simular um backend

Documentação de API simulator

simulator.basis_gates

Valores: 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

Valores: Lista de interações direcionadas de dois qubits

Padrão: None, o que implica nenhuma restrição de conectividade (conectividade total).

simulator.noise_model

Valores: Qiskit Aer NoiseModel, ou sua representação

Padrão: None

simulator.seed_simulator

Valores: Inteiro

Padrão: None

twirling

Opções de twirling

Documentação de API twirling

twirling.enable_gates

Valores: True, False

Padrão: False

twirling.enable_measure

Valores: True, False

Padrão: True

twirling.num_randomizations

Valores: auto, Inteiro >= 1

Padrão: auto

twirling.shots_per_randomization

Valores: auto, Inteiro >= 1

Padrão: auto

twirling.strategy

Valores: 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 portas de emaranhamento 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