Paramètres par défaut et options de configuration de la transpilation
Versions des paquets
Le code de cette page a été développé en utilisant les exigences suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
Les circuits abstraits doivent être transpilés car les QPU disposent d'un ensemble limité de portes de base et ne peuvent pas exécuter des opérations arbitraires. La fonction du Transpiler est de modifier des circuits arbitraires afin qu'ils puissent s'exécuter sur un QPU spécifié. Cela se fait en traduisant les circuits vers les portes de base prises en charge, et en introduisant des portes SWAP si nécessaire, afin que la connectivité du circuit corresponde à celle du QPU.
Comme expliqué dans Transpiler avec des gestionnaires de passes, tu peux créer un gestionnaire de passes à l'aide de la fonction generate_preset_pass_manager et passer un circuit ou une liste de circuits à sa méthode run pour les transpiler. Tu peux appeler generate_preset_pass_manager en ne précisant que le niveau d'optimisation et le backend, en laissant les valeurs par défaut pour toutes les autres options, ou bien passer des arguments supplémentaires à la fonction pour affiner la transpilation.
Utilisation de base sans paramètres
Dans cet exemple, nous passons un circuit et un QPU cible au transpileur sans spécifier d'autres paramètres.
Crée un circuit et visualise le résultat :
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, DiagonalGate
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
# Create circuit to test transpiler on
oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))
# Add measurements to the circuit
qc.measure_all()
# View the circuit
qc.draw(output="mpl")
Transpile le circuit et visualise le résultat :
from qiskit.transpiler import generate_preset_pass_manager
# Specify the QPU to target
backend = FakeSherbrooke()
# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled_circ = pass_manager.run(qc)
# View the transpiled circuit
transpiled_circ.draw(output="mpl", idle_wires=False)
Tous les paramètres disponibles
Voici l'ensemble des paramètres disponibles pour la fonction generate_preset_pass_manager. On distingue deux catégories d'arguments : ceux qui décrivent la cible de compilation, et ceux qui influencent le fonctionnement du transpileur.
Tous les paramètres sauf optimization_level sont optionnels. Pour plus de détails, consulte la documentation de l'API Transpiler.
optimization_level(int) — Niveau d'optimisation appliqué aux circuits. Entier compris entre 0 et 3. Plus le niveau est élevé, plus les circuits produits sont optimisés, au prix d'un temps de transpilation plus long. Voir Définir le niveau d'optimisation du transpileur pour plus de détails.
Paramètres décrivant la cible de compilation
Ces arguments décrivent le QPU cible pour l'exécution du circuit, notamment la carte de couplage du QPU (qui décrit la connectivité des qubits), les portes de base prises en charge par le QPU, et les taux d'erreur des portes.
Beaucoup de ces paramètres sont décrits en détail dans Paramètres couramment utilisés pour la transpilation.
Paramètres du QPU (`Backend`)
Paramètres du backend - Si tu spécifies backend, tu n'as pas besoin de spécifier target ni aucune autre option de backend. De même, si tu spécifies target, tu n'as pas besoin de spécifier backend ni aucune autre option de backend.
backend(Backend) - Si cette option est définie, le transpiler compile le circuit d'entrée pour ce dispositif. Si une autre option qui affecte ces paramètres est définie, commecoupling_map, elle remplace les paramètres debackend.target(Target) - Une cible de transpiler pour le backend. Normalement, elle est spécifiée dans le cadre de l'argument backend, mais si tu as construit manuellement un objet Target, tu peux le spécifier ici. Cela remplace la cible debackend.backend_properties(BackendProperties) - Propriétés renvoyées par un QPU, incluant des informations sur les erreurs de porte, les erreurs de lecture, les temps de cohérence des qubits, etc. Trouve un QPU qui fournit ces informations en exécutantbackend.properties().timing_constraints(Dict[str, int] | None) - Une restriction matérielle de contrôle optionnelle sur la résolution temporelle des instructions. Cette information est fournie par la configuration du QPU. Si le QPU n'a aucune restriction sur l'allocation du temps d'instruction,timing_constraintsvautNoneet aucun ajustement n'est effectué. Un QPU peut signaler un ensemble de restrictions, à savoir :granularity: Une valeur entière représentant la résolution minimale de la porte d'impulsion en unités de dt. Une porte d'impulsion définie par l'utilisateur doit avoir une durée qui est un multiple de cette valeur de granularité.min_length: Une valeur entière représentant la longueur minimale de la porte d'impulsion en unités de dt. Une porte d'impulsion définie par l'utilisateur doit être plus longue que cette longueur.pulse_alignment: Une valeur entière représentant une résolution temporelle du moment de départ de l'instruction de porte. Les instructions de porte doivent démarrer à un moment qui est un multiple de cette valeur.acquire_alignment: Une valeur entière représentant une résolution temporelle du moment de départ de l'instruction de mesure. L'instruction de mesure doit démarrer à un moment qui est un multiple de cette valeur.
Paramètres de disposition et de topologie
-
basis_gates(List[str] | None) - Liste des noms des portes de base vers lesquelles dérouler. Par exemple ['u1', 'u2', 'u3', 'cx']. SiNone, ne pas dérouler. -
coupling_map(CouplingMap | List[List[int]]) — Carte de couplage dirigée (éventuellement personnalisée) à cibler lors du mapping. Si la carte de couplage est symétrique, les deux directions doivent être spécifiées. Les formats suivants sont pris en charge :-
Instance de CouplingMap
-
Liste — doit être fournie sous forme de matrice d'adjacence, où chaque entrée spécifie toutes les interactions dirigées à deux qubits prises en charge par le QPU. Par exemple : [[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]
-
-
inst_map(List[InstructionScheduleMap] | None) — Correspondance entre les opérations du circuit et les planifications pulse. SiNone, l'instruction_schedule_mapdu QPU est utilisé.
Paramètres influençant le fonctionnement du transpileur
Ces paramètres ont un impact sur des étapes spécifiques de la transpilation. Certains peuvent affecter plusieurs étapes, mais n'ont été listés que sous une seule pour simplifier. Si tu spécifies un argument, comme initial_layout pour les qubits que tu souhaites utiliser, cette valeur prévaut sur toutes les passes susceptibles de la modifier. En d'autres termes, le transpileur ne changera rien à ce que tu spécifies manuellement. Pour des détails sur les étapes spécifiques, voir Étapes du transpileur.
Étape d'initialisation
-
hls_config(HLSConfig) — Classe de configuration optionnelleHLSConfigpassée directement à la passe de transformationHighLevelSynthesis. Cette classe de configuration te permet de spécifier les listes d'algorithmes de synthèse et leurs paramètres pour divers objets de haut niveau. -
init_method(str) — Nom du plugin à utiliser pour l'étape d'initialisation. Par défaut, aucun plugin externe n'est utilisé. Tu peux voir la liste des plugins installés en exécutantlist_stage_plugins()avecinitcomme argument de nom d'étape. -
unitary_synthesis_method(str) — Nom de la méthode de synthèse unitaire à utiliser. Par défaut,defaultest utilisé. Tu peux voir la liste des plugins installés en exécutantunitary_synthesis_plugin_names(). -
unitary_synthesis_plugin_config(dict) — Dictionnaire de configuration optionnel passé directement au plugin de synthèse unitaire. Par défaut, ce paramètre n'a aucun effet car la méthode de synthèse unitaire par défaut n'accepte pas de configuration personnalisée. Appliquer une configuration personnalisée ne devrait être nécessaire que lorsqu'un plugin de synthèse unitaire est spécifié avec l'argumentunitary_synthesis. Comme cela est propre à chaque plugin, consulte la documentation du plugin pour savoir comment utiliser cette option.
Étape de layout
-
initial_layout(Layout | Dict | List) — Position initiale des qubits virtuels sur les qubits physiques. Si ce layout rend le circuit compatible avec les contraintes decoupling_map, il sera utilisé. Le layout final n'est pas garanti d'être identique, car le transpileur peut permuter les qubits via des SWAP ou d'autres moyens. Pour plus de détails, voir la section Initial layout. -
layout_method(str) — Nom de la passe de sélection de layout (default,dense,sabreettrivial). Il peut également s'agir du nom d'un plugin externe à utiliser pour l'étape de layout. Tu peux voir la liste des plugins installés en exécutantlist_stage_plugins()aveclayoutcomme argumentstage_name. La valeur par défaut estsabre.
Étape de routage
routing_method(str) — Nom de la passe de routage (basic,lookahead,default,sabreounone). Il peut également s'agir du nom d'un plugin externe à utiliser pour l'étape de routage. Tu peux voir la liste des plugins installés en exécutantlist_stage_plugins()avecroutingcomme argumentstage_name. La valeur par défaut estsabre.
Étape de traduction
translation_method(str) — Nom de la passe de traduction (default,synthesis,translator,ibm_backend,ibm_dynamic_circuits,ibm_fractional). Il peut également s'agir du nom d'un plugin externe à utiliser pour l'étape de traduction. Tu peux voir la liste des plugins installés en exécutantlist_stage_plugins()avectranslationcomme argumentstage_name. La valeur par défaut esttranslator.
Étape d'optimisation
-
approximation_degree(float, compris entre 0 et 1 | None) — Curseur heuristique utilisé pour l'approximation du circuit (1,0 = aucune approximation, 0,0 = approximation maximale). La valeur par défaut est 1,0. SpécifierNonefixe le degré d'approximation au taux d'erreur rapporté. Voir la section Degré d'approximation pour plus de détails. -
optimization_method(str) — Nom du plugin à utiliser pour l'étape d'optimisation. Par défaut, aucun plugin externe n'est utilisé. Tu peux voir la liste des plugins installés en exécutantlist_stage_plugins()avecoptimizationcomme argumentstage_name.
Étape de planification
-
scheduling_method(str) — Nom de la passe de planification. Il peut également s'agir du nom d'un plugin externe à utiliser pour l'étape de planification. Tu peux voir la liste des plugins installés en exécutantlist_stage_plugins()avecschedulingcomme argumentstage_name.-
'as_soon_as_possible' : Planifie les instructions de manière gloutonne, le plus tôt possible sur une ressource qubit (alias :
asap). -
'as_late_as_possible' : Planifie les instructions tardivement, c'est-à-dire en gardant les qubits dans l'état fondamental lorsque c'est possible (alias :
alap). C'est la valeur par défaut.
-
Exécution du transpiler
seed_transpiler(int) — Définit les graines aléatoires pour les parties stochastiques du transpileur.
Les valeurs par défaut suivantes sont utilisées si tu ne spécifies aucun des paramètres ci-dessus. Consulte la page de référence de l'API de la méthode pour plus d'informations :
generate_preset_pass_manager(
optimization_level=1,
backend=None,
target=None,
basis_gates=None,
coupling_map=None,
initial_layout=None,
layout_method=None,
routing_method=None,
translation_method=None,
scheduling_method=None,
approximation_degree=1.0,
seed_transpiler=None,
unitary_synthesis_method="default",
unitary_synthesis_plugin_config=None,
hls_config=None,
init_method=None,
optimization_method=None,
)
<qiskit.transpiler.passmanager.StagedPassManager at 0x1403cd250>
Prochaines étapes
- Apprends à définir le niveau d'optimisation.
- Consulte les paramètres couramment utilisés.
- Apprends à définir le niveau d'optimisation.
- Consulte le sujet Transpiler avec des gestionnaires de passes.
- Pour des exemples, voir Représenter des ordinateurs quantiques.
- Apprends comment transpiler des circuits dans le cadre du workflow Qiskit patterns.
- Consulte la documentation de l'API Transpile.