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 :
- 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 atributooptions. - Se você não especificar um valor para uma opção, ela recebe um valor especial de
Unsete os padrões do servidor são usados. - O atributo
optionsé do tipo Pythondataclass. Você pode usar o método integradoasdictpara 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.
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:
- Se o PUB especifica precision, use esse valor.
- Se o argumento keyword precision for especificado em
run, use esse valor. - Se
twirlingestiver habilitado (True por padrão), o produto denum_randomizationseshots_per_randomization, conforme especificado nas opções de twirling, é usado. - Se
estimator.options.default_shotsfor especificado, use esse valor para controlar a quantidade de dados. - Se
estimator.options.default_precisionfor 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.
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.
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
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))
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
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.
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.
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.
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
seed_estimator
simulator
Opções a passar ao simular um backend
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
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
- Encontre mais detalhes sobre os métodos
EstimatorV2na referência de API do Estimator. - Decida em qual modo de execução executar seu job.
- Aprenda sobre gerenciamento de ruído com Estimator.