Spécifier les options de l'Estimator
Versions des packages
Le code de cette page a été développé avec les exigences suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
Tu peux utiliser les options pour personnaliser la primitive Estimator. Bien que l'interface de la méthode run() des primitives soit commune à toutes les implémentations, leurs options ne le sont pas. Consulte les références API pour obtenir des informations sur les options de qiskit.primitives.BaseEstimatorV2 et qiskit_aer.BaseEstimatorV2.
Notes :
- Tu peux voir les options disponibles et mettre à jour les valeurs d'options pendant ou après l'initialisation de l'Estimator.
- Utilise la méthode
update()pour appliquer les modifications à l'attributoptions. - Si tu ne spécifies pas de valeur pour une option, elle reçoit une valeur spéciale
Unsetet les valeurs par défaut du serveur sont utilisées. - L'attribut
optionsest de type Pythondataclass. Tu peux utiliser la méthode intégréeasdictpour le convertir en dictionnaire.
Définir les options de l'Estimator
Tu peux définir les options lors de l'initialisation de l'Estimator, après l'initialisation de l'Estimator, ou (pour precision uniquement), dans la méthode run().
Initialisation de la primitive
Tu peux passer une instance de la classe d'options ou un dictionnaire lors de l'initialisation de l'Estimator, qui fait alors une copie de ces options. Ainsi, modifier le dictionnaire ou l'instance d'options d'origine n'affecte pas les options appartenant à la primitive.
Classe d'options
Lors de la création d'une instance de la classe EstimatorV2, tu peux passer une instance de la classe d'options. Ces options seront ensuite appliquées lorsque tu utiliseras run() pour effectuer le calcul. Spécifie les options dans ce format : options.option.sub-option.sub-sub-option = choice. Par exemple : options.dynamical_decoupling.enable = True
Exemple :
# 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)
Dictionnaire
Tu peux spécifier les options sous forme de dictionnaire lors de l'initialisation de l'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]},
},
},
)
Mettre à jour les options après l'initialisation
Tu peux spécifier les options dans ce format : estimator.options.option.sub-option.sub-sub-option = choice pour profiter de l'auto-complétion, ou utiliser la méthode update() pour effectuer des mises à jour en masse.
La classe d'options EstimatorV2 (EstimatorOptions) n'a pas besoin d'être instanciée si tu définis les options après l'initialisation de la primitive.
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éthode Run()
Les seules valeurs que tu peux passer à run() sont celles définies dans l'interface. C'est-à-dire precision pour Estimator. Cela écrase toute valeur définie pour default_precision pour l'exécution courante.
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')>
Cas particulier : précision
La méthode EstimatorV2.run accepte deux arguments : une liste de PUBs, chacun pouvant spécifier une valeur de précision spécifique au PUB, et un argument de mot-clé precision. Ces valeurs de précision font partie de l'interface d'exécution de l'Estimator, et sont indépendantes des options du Runtime Estimator. Elles ont la priorité sur toutes les valeurs spécifiées en tant qu'options afin de se conformer à l'abstraction de l'Estimator.
Cependant, si precision n'est pas spécifié par un PUB ou dans l'argument de mot-clé run (ou s'ils sont tous None), alors la valeur de précision des options est utilisée, notamment default_precision.
Ces paramètres de précision servent uniquement à spécifier la précision cible, et les résultats ne sont pas garantis d'atteindre la précision spécifiée.
Note que les options de l'Estimator contiennent à la fois default_shots et default_precision. Cependant, comme le gate-twirling est activé par défaut, le produit de num_randomizations et shots_per_randomization prend la priorité sur ces deux options.
Spécifiquement, pour tout PUB d'Estimator :
- Si le PUB spécifie la précision, utiliser cette valeur.
- Si l'argument de mot-clé precision est spécifié dans
run, utiliser cette valeur. - Si
twirlingest activé (True par défaut), alors le produit denum_randomizationsetshots_per_randomization, tel que spécifié dans les optionstwirling, est utilisé. - Si
estimator.options.default_shotsest spécifié, utiliser cette valeur pour contrôler la quantité de données. - Si
estimator.options.default_precisionest spécifié, utiliser cette valeur.
Par exemple, si la précision est spécifiée dans les quatre endroits, celui avec la priorité la plus haute (précision spécifiée dans le PUB) est utilisé.
Bien que la précision spécifiée dans le PUB et dans run ait une priorité plus élevée, le job échoue si twirling est activé et que le produit de num_randomizations et shots_per_randomization est inférieur au nombre de shots nécessaires pour atteindre la précision. Dans ce scénario, EstimatorV2 est incapable de répartir les shots parmi les num_randomizations spécifiés.
La précision évolue inversement avec l'utilisation. C'est-à-dire que plus la précision est faible, plus le temps QPU nécessaire à l'exécution est long.
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')>
Désactiver toute la mitigation d'erreurs et la suppression d'erreurs
Tu peux désactiver toute la mitigation et la suppression d'erreurs si tu effectues, par exemple, des recherches sur tes propres techniques de mitigation. Pour ce faire, définis resilience_level = 0.
Exemple :
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
Options disponibles
Le tableau suivant documente les options de la dernière version de qiskit-ibm-runtime. Pour voir les versions d'options antérieures, consulte la référence API qiskit-ibm-runtime et sélectionne une version précédente.
default_shots
Le nombre total de shots à utiliser par circuit et par configuration.
Choix : Entier >= 0
Par défaut : None
default_precision
La précision par défaut à utiliser pour tout PUB ou appel run() qui n'en spécifie pas une.
Choix : Float > 0
Par défaut : 0.015625 (1 / sqrt(4096))
dynamical_decoupling
Contrôler les paramètres de la mitigation d'erreur par découplage dynamique.
Documentation API dynamical_decoupling
dynamical_decoupling.enable
Choix : True, False
Par défaut : False
dynamical_decoupling.extra_slack_distribution
Choix : middle, edges
Par défaut : middle
dynamical_decoupling.scheduling_method
Choix : asap, alap
Par défaut : alap
dynamical_decoupling.sequence_type
Choix : XX, XpXm, XY4
Par défaut : XX
dynamical_decoupling.skip_reset_qubits
Choix : True, False
Par défaut : False
environment
environment.callback
Fonction callable qui reçoit le Job ID et le Job result.
Choix : None
Par défaut : None
environment.job_tags
Liste de balises.
Choix : None
Par défaut : None
environment.log_level
Choix : DEBUG, INFO, WARNING, ERROR, CRITICAL
Par défaut : WARNING
environment.private
Choix : True, False
Par défaut : False
execution
execution.init_qubits
Indique s'il faut réinitialiser les qubits à l'état fondamental pour chaque shot.
Choix : True, False
Par défaut : True
execution.rep_delay
Le délai entre une mesure et le circuit quantique suivant.
Choix : Valeur dans la plage fournie par backend.rep_delay_range
Par défaut : Donné par backend.default_rep_delay
max_execution_time
Limite la durée d'exécution d'un job, en secondes. Consulte le guide sur le temps d'exécution maximum pour plus de détails.
Choix : Nombre entier de secondes dans la plage [1, 10800]
Par défaut : 10800 (3 heures)
resilience
Options de résilience avancées pour affiner la stratégie de résilience.
resilience.layer_noise_learning
Options pour l'apprentissage du bruit des couches.
resilience.layer_noise_learning.layer_pair_depths
Choix : list[int] de 2 à 10 valeurs dans la plage [0, 200]
Par défaut : (0, 1, 2, 4, 16, 32)
resilience.layer_noise_learning.max_layers_to_learn
Choix : None, Entier >= 1
Par défaut : 4
resilience.layer_noise_learning.num_randomizations
Choix : Entier >= 1
Par défaut : 32
resilience.layer_noise_learning.shots_per_randomization
Choix : Entier >= 1
Par défaut : 128
resilience.layer_noise_model
Choix : NoiseLearnerResult, Sequence[LayerError]
Par défaut : None
resilience.measure_mitigation
Choix : True, False
Par défaut : True
resilience.measure_noise_learning
Options pour l'apprentissage du bruit de mesure.
resilience.measure_noise_learning.num_randomizations
Choix : Entier >= 1
Par défaut : 32
resilience.measure_noise_learning.shots_per_randomization
Choix : Entier, auto
Par défaut : auto
resilience.pec_mitigation
Choix : True, False
Par défaut : False
resilience.pec
Options de mitigation par cancellation d'erreurs probabiliste.
resilience.pec.max_overhead
Choix : None, Entier >= 1
Par défaut : 100
resilience.pec.noise_gain
Choix : auto, float dans la plage [0, 1]
Par défaut : auto
resilience.zne_mitigation
Choix : True, False
Par défaut : False
resilience.zne
resilience.zne.amplifier
Choix : gate_folding, gate_folding_front, gate_folding_back, pea
Par défaut : gate_folding
resilience.zne.extrapolated_noise_factors
Choix : Liste de floats
Par défaut : [0, *noise_factors]
resilience.zne.extrapolator
Choix : Un ou plusieurs de : exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7), fallback
Par défaut : (exponential, linear)
resilience.zne.noise_factors
Choix : Liste de floats ; chaque float >= 1
Par défaut : (1, 1.5, 2) pour PEA, et (1, 3, 5) sinon
resilience_level
Niveau de résilience à construire contre les erreurs. Des niveaux plus élevés génèrent des résultats plus précis au détriment de temps de traitement plus longs. Consulte la section niveaux de résilience dans le sujet Gestion du bruit pour en savoir plus.
Choix : 0, 1, 2
Par défaut : 1
seed_estimator
simulator
Options à passer lors de la simulation d'un Backend
simulator.basis_gates
Choix : Liste des noms de portes de base à déplier
Par défaut : L'ensemble de toutes les portes de base supportées par le simulateur Qiskit Aer
simulator.coupling_map
Choix : Liste d'interactions à deux qubits dirigées
Par défaut : None, ce qui implique l'absence de contraintes de connectivité (connectivité complète).
simulator.noise_model
Choix : Qiskit Aer NoiseModel, ou sa représentation
Par défaut : None
simulator.seed_simulator
Choix : Entier
Par défaut : None
twirling
Options de twirling
twirling.enable_gates
Choix : True, False
Par défaut : False
twirling.enable_measure
Choix : True, False
Par défaut : True
twirling.num_randomizations
Choix : auto, Entier >= 1
Par défaut : auto
twirling.shots_per_randomization
Choix : auto, Entier >= 1
Par défaut : auto
twirling.strategy
Choix : active, active-circuit, active-accum, all
Par défaut : active-accum
experimental
Options expérimentales, le cas échéant.
Compatibilité des fonctionnalités
Certaines fonctionnalités de runtime ne peuvent pas être utilisées ensemble dans un seul job. Clique sur l'onglet approprié pour obtenir la liste des fonctionnalités incompatibles avec la fonctionnalité sélectionnée :
Fractional gates
Incompatible avec :
- Gate twirling
- PEA
- PEC
Gate-folding ZNE
Peut ne pas fonctionner lors de l'utilisation de gates personnalisés. Incompatible avec :
- PEA
- PEC
Gate twirling
Incompatible avec :
- Fractional gates
- Stretches
Autres remarques :
- Le measurement twirling ne peut être appliqué qu'aux mesures terminales.
- Ne fonctionne pas avec les entangleurs non-Clifford.
PEA
Incompatible avec :
- Fractional gates
- Gate-folding ZNE
- PEC
PEC
Incompatible avec :
- Fractional gates
- Gate-folding ZNE
- PEA
Prochaines étapes
- Trouve plus de détails sur les méthodes
EstimatorV2dans la référence API Estimator. - Décide dans quel mode d'exécution exécuter ton job.
- Découvre la gestion du bruit avec Estimator.