Saltar al contenido principal

Especificar opciones del Estimator

Versiones de paquetes

El código de esta página fue desarrollado con los siguientes requisitos. Recomendamos usar estas versiones o versiones más recientes.

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

Puedes usar opciones para personalizar la primitiva Estimator. Aunque la interfaz del método run() de las primitivas es común a todas las implementaciones, sus opciones no lo son. Consulta las referencias de API para obtener información sobre las opciones de qiskit.primitives.BaseEstimatorV2 y qiskit_aer.BaseEstimatorV2.

Notas :

Notas sobre cómo especificar opciones en las primitivas Estimator
  • Puedes ver las opciones disponibles y actualizar los valores de las opciones durante o después de la inicialización del Estimator.
  • Usa el método update() para aplicar cambios al atributo options.
  • Si no especificas un valor para una opción, se le asigna un valor especial de Unset y se usan los valores predeterminados del servidor.
  • El atributo options es del tipo Python dataclass. Puedes usar el método integrado asdict para convertirlo en un diccionario.

Establecer opciones del Estimator

Puedes establecer opciones al inicializar el Estimator, después de inicializarlo, o (solo para precision), en el método run().

Inicialización de la primitiva

Puedes pasar una instancia de la clase de opciones o un diccionario al inicializar el Estimator, que luego hace una copia de esas opciones. Por lo tanto, cambiar el diccionario original o la instancia de opciones no afecta a las opciones del propietario de la primitiva.

Clase de opciones

Al crear una instancia de la clase EstimatorV2, puedes pasar una instancia de la clase de opciones. Esas opciones se aplicarán cuando uses run() para realizar el cálculo. Especifica las opciones en este formato: options.option.sub-option.sub-sub-option = choice. Por ejemplo: options.dynamical_decoupling.enable = True

Ejemplo:

# 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)

Diccionario

Puedes especificar opciones como un diccionario al inicializar el 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]},
},
},
)

Actualizar opciones después de la inicialización

Puedes especificar las opciones en este formato: estimator.options.option.sub-option.sub-sub-option = choice para aprovechar el autocompletado, o usar el método update() para hacer actualizaciones masivas.

La clase de opciones de EstimatorV2 (EstimatorOptions) no necesita ser instanciada si estás configurando opciones después de inicializar la 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()

Los únicos valores que puedes pasar a run() son los definidos en la interfaz. Es decir, precision para el Estimator. Esto sobrescribe cualquier valor establecido para default_precision para la ejecución actual.

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: precisión

El método EstimatorV2.run acepta dos argumentos: una lista de PUBs, cada uno de los cuales puede especificar un valor de precisión específico del PUB, y un argumento de palabra clave precision. Estos valores de precisión forman parte de la interfaz de ejecución del Estimator y son independientes de las opciones del Runtime Estimator. Tienen prioridad sobre cualquier valor especificado como opciones para cumplir con la abstracción del Estimator.

Sin embargo, si precision no está especificado por ningún PUB ni en el argumento de palabra clave run (o si todos son None), entonces se usa el valor de precisión de las opciones, principalmente default_precision.

nota

Estos parámetros de precisión son solo para especificar la precisión objetivo, y no se garantiza que los resultados alcancen la precisión especificada.

Ten en cuenta que las opciones del Estimator contienen tanto default_shots como default_precision. Sin embargo, como el gate-twirling está habilitado de forma predeterminada, el producto de num_randomizations y shots_per_randomization tiene prioridad sobre esas dos opciones.

Específicamente, para cualquier PUB del Estimator:

  1. Si el PUB especifica precisión, usar ese valor.
  2. Si el argumento de palabra clave precision está especificado en run, usar ese valor.
  3. Si twirling está habilitado (True por defecto), entonces se usa el producto de num_randomizations y shots_per_randomization, tal como se especifica en las opciones twirling.
  4. Si estimator.options.default_shots está especificado, usar ese valor para controlar la cantidad de datos.
  5. Si estimator.options.default_precision está especificado, usar ese valor.

Por ejemplo, si la precisión está especificada en los cuatro lugares, se usa el que tiene mayor prioridad (precisión especificada en el PUB).

nota

Aunque la precisión especificada en el PUB y en run tienen mayor prioridad, el trabajo falla si twirling está habilitado y el producto de num_randomizations y shots_per_randomization es menor que los shots necesarios para alcanzar la precisión. En este escenario, EstimatorV2 no puede distribuir los shots entre los num_randomizations especificados.

nota

La precisión escala inversamente con el uso. Es decir, cuanto menor sea la precisión, más tiempo de QPU se necesita para ejecutar.

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')>

Desactivar toda la mitigación y supresión de errores

Puedes desactivar toda la mitigación y supresión de errores si, por ejemplo, estás investigando tus propias técnicas de mitigación. Para lograr esto, establece resilience_level = 0.

Ejemplo:

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

Opciones disponibles

La siguiente tabla documenta las opciones de la versión más reciente de qiskit-ibm-runtime. Para ver versiones de opciones anteriores, visita la referencia de API de qiskit-ibm-runtime y selecciona una versión anterior.

default_shots

El número total de shots a usar por circuito por configuración.

Opciones: Entero >= 0

Predeterminado: None

Documentación de API de default_shots

default_precision

La precisión predeterminada a usar para cualquier PUB o llamada run() que no especifique una.

Opciones: Float > 0

Predeterminado: 0.015625 (1 / sqrt(4096))

Documentación de API de default_precision

dynamical_decoupling

Controla los ajustes de mitigación de errores por desacoplamiento dinámico.

Documentación de API de dynamical_decoupling

dynamical_decoupling.enable

Opciones: True, False

Predeterminado: False

dynamical_decoupling.extra_slack_distribution

Opciones: middle, edges

Predeterminado: middle

dynamical_decoupling.scheduling_method

Opciones: asap, alap Predeterminado: alap

dynamical_decoupling.sequence_type

Opciones: XX, XpXm, XY4 Predeterminado: XX

dynamical_decoupling.skip_reset_qubits

Opciones: True, False Predeterminado: False

environment

Documentación de API de environment

environment.callback

Función invocable que recibe el Job ID y el Job result.

Opciones: None

Predeterminado: None

environment.job_tags

Lista de etiquetas.

Opciones: None

Predeterminado: None

environment.log_level

Opciones: DEBUG, INFO, WARNING, ERROR, CRITICAL

Predeterminado: WARNING

environment.private

Opciones: True, False

Predeterminado: False

execution

Documentación de API de execution

execution.init_qubits

Si se deben restablecer los qubits al estado base para cada shot.

Opciones: True, False

Predeterminado: True

execution.rep_delay

El retraso entre una medición y el circuito cuántico subsiguiente.

Opciones: Valor en el rango proporcionado por backend.rep_delay_range

Predeterminado: Dado por backend.default_rep_delay

max_execution_time

Limita cuánto tiempo puede ejecutarse un trabajo, en segundos. Consulta la guía de tiempo máximo de ejecución para más detalles.

Opciones: Número entero de segundos en el rango [1, 10800]

Predeterminado: 10800 (3 horas)

resilience

Opciones de resiliencia avanzadas para ajustar la estrategia de resiliencia.

Documentación de API de resilience

resilience.layer_noise_learning

Opciones para el aprendizaje del ruido de capa.

Documentación de API de resilience.layer_noise_learning

resilience.layer_noise_learning.layer_pair_depths

Opciones: list[int] de 2 a 10 valores en el rango [0, 200]

Predeterminado: (0, 1, 2, 4, 16, 32)

resilience.layer_noise_learning.max_layers_to_learn

Opciones: None, Entero >= 1

Predeterminado: 4

resilience.layer_noise_learning.num_randomizations

Opciones: Entero >= 1

Predeterminado: 32

resilience.layer_noise_learning.shots_per_randomization

Opciones: Entero >= 1

Predeterminado: 128

resilience.layer_noise_model

Opciones: NoiseLearnerResult, Sequence[LayerError]

Predeterminado: None

resilience.measure_mitigation

Opciones: True, False

Predeterminado: True

resilience.measure_noise_learning

Opciones para el aprendizaje del ruido de medición.

Documentación de API de resilience.measure_noise_learning

resilience.measure_noise_learning.num_randomizations

Opciones: Entero >= 1

Predeterminado: 32

resilience.measure_noise_learning.shots_per_randomization

Opciones: Entero, auto

Predeterminado: auto

resilience.pec_mitigation

Opciones: True, False

Predeterminado: False

resilience.pec

Opciones de mitigación por cancelación de errores probabilista.

Documentación de API de resilience.pec

resilience.pec.max_overhead

Opciones: None, Entero >= 1

Predeterminado: 100

resilience.pec.noise_gain

Opciones: auto, float en el rango [0, 1]

Predeterminado: auto

resilience.zne_mitigation

Opciones: True, False

Predeterminado: False

resilience.zne
resilience.zne.amplifier

Opciones: gate_folding, gate_folding_front, gate_folding_back, pea

Predeterminado: gate_folding

resilience.zne.extrapolated_noise_factors

Opciones: Lista de floats

Predeterminado: [0, *noise_factors]

resilience.zne.extrapolator

Opciones: Uno o más de: exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7), fallback

Predeterminado: (exponential, linear)

resilience.zne.noise_factors

Opciones: Lista de floats; cada float >= 1

Predeterminado: (1, 1.5, 2) para PEA, y (1, 3, 5) en caso contrario

resilience_level

El nivel de resiliencia a construir contra los errores. Los niveles más altos generan resultados más precisos a costa de tiempos de procesamiento más largos. Consulta la sección niveles de resiliencia en el tema Gestión del ruido para obtener más información.

Opciones: 0, 1, 2

Predeterminado: 1

Documentación de API de resilience_level

seed_estimator

Opciones: Entero

Predeterminado: None

seed_estimator

simulator

Opciones para pasar al simular un Backend

Documentación de API de simulator

simulator.basis_gates

Opciones: Lista de nombres de puertas base a desplegar

Predeterminado: El conjunto de todas las puertas base admitidas por el simulador Qiskit Aer

simulator.coupling_map

Opciones: Lista de interacciones de dos qubits dirigidas

Predeterminado: None, lo que implica que no hay restricciones de conectividad (conectividad completa).

simulator.noise_model

Opciones: Qiskit Aer NoiseModel, o su representación

Predeterminado: None

simulator.seed_simulator

Opciones: Entero

Predeterminado: None

twirling

Opciones de twirling

Documentación de API de twirling

twirling.enable_gates

Opciones: True, False

Predeterminado: False

twirling.enable_measure

Opciones: True, False

Predeterminado: True

twirling.num_randomizations

Opciones: auto, Entero >= 1

Predeterminado: auto

twirling.shots_per_randomization

Opciones: auto, Entero >= 1

Predeterminado: auto

twirling.strategy

Opciones: active, active-circuit, active-accum, all

Predeterminado: active-accum

experimental

Opciones experimentales, cuando estén disponibles.

Compatibilidad de funcionalidades

Ciertas funcionalidades de runtime no pueden usarse juntas en un solo job. Haz clic en la pestaña correspondiente para ver la lista de funcionalidades incompatibles con la funcionalidad seleccionada:

Fractional gates

Incompatible con:

  • Gate twirling
  • PEA
  • PEC
Gate-folding ZNE

Puede no funcionar cuando se usan gates personalizados. Incompatible con:

  • PEA
  • PEC
Gate twirling

Incompatible con:

  • Fractional gates
  • Stretches

Otras notas:

  • El measurement twirling solo puede aplicarse a mediciones terminales.
  • No funciona con entangladores no-Clifford.
PEA

Incompatible con:

  • Fractional gates
  • Gate-folding ZNE
  • PEC
PEC

Incompatible con:

  • Fractional gates
  • Gate-folding ZNE
  • PEA

Próximos pasos

Recomendaciones