Installer et utiliser les plugins de transpiler
Le code de cette page a été développé en tenant compte des exigences suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
Pour faciliter le développement et la réutilisation du code de transpilation personnalisé par la communauté élargie des utilisateurs de Qiskit, le SDK Qiskit prend en charge une interface de plugin qui permet aux paquets tiers Python de déclarer qu'ils fournissent des fonctionnalités de transpilation étendues accessibles via Qiskit.
Actuellement, les plugins tiers peuvent fournir des fonctionnalités de transpilation étendues de trois manières :
- Un plugin transpiler stage fournit un gestionnaire de passage qui peut être utilisé à la place de l'un des 6 stades d'un gestionnaire de passage prédéfini :
init,layout,routing,translation,optimization, etscheduling. - Un plugin de synthèse unitaire offre des fonctionnalités étendues pour la synthèse de portes unitaires.
- Un plugin de synthèse de haut niveau offre des fonctionnalités étendues pour synthétiser des "objets de haut niveau" tels que des fonctions linéaires ou des opérateurs de Clifford. Les objets de haut niveau sont représentés par des sous-classes de la classe Opération.
Le reste de la page décrit comment dresser la liste des plugins disponibles, en installer de nouveaux et les utiliser.
Répertorier les plugins disponibles et en installer de nouveaux
Qiskit comprend déjà des plugins intégrés pour la transpilation. Pour en installer d'autres, vous pouvez utiliser votre gestionnaire de paquets Python. Par exemple, vous pouvez lancer pip install qiskit-toqm pour installer le plugin d'étape de routage Qiskit TOQM. Un certain nombre de plugins tiers font partie de l' écosystème Qiskit.
Liste des plugins de transpiler stage disponibles
Utilisez la fonction list_stage_plugins, en passant le nom de la scène dont vous voulez lister les plugins.
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins
list_stage_plugins("layout")Output:
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")Output:
['basic', 'default', 'lookahead', 'none', 'sabre']
Si qiskit-toqm était installé, toqm apparaîtrait dans la liste des plugins routing .
Liste des plugins de synthèse unitaire disponibles
Utiliser la fonction unitary_synthesis_plugin_names.
from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names
unitary_synthesis_plugin_names()Output:
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
Liste des plugins de synthèse de haut niveau disponibles
Utiliser la fonction high_level_synthesis_plugin_names, en transmettant le nom du type d'"objet de haut niveau" à synthétiser. Le nom correspond à l'attribut name de la classe d' opération représentant le type d'objet synthétisé.
from qiskit.transpiler.passes.synthesis import (
high_level_synthesis_plugin_names,
)
high_level_synthesis_plugin_names("clifford")Output:
['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']
Vous pouvez utiliser la classe HighLevelSynthesisPluginManager pour lister les noms de tous les plugins de synthèse de haut niveau :
from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)
HighLevelSynthesisPluginManager().plugins.names()Output:
['FullAdder.default',
'FullAdder.ripple_c04',
'FullAdder.ripple_v95',
'HalfAdder.default',
'HalfAdder.qft_d00',
'HalfAdder.ripple_c04',
'HalfAdder.ripple_r25',
'HalfAdder.ripple_v95',
'IntComp.default',
'IntComp.noaux',
'IntComp.twos',
'ModularAdder.default',
'ModularAdder.modular_v17',
'ModularAdder.qft_d00',
'ModularAdder.ripple_c04',
'ModularAdder.ripple_v95',
'Multiplier.cumulative_h18',
'Multiplier.default',
'Multiplier.qft_r17',
'PauliEvolution.default',
'PauliEvolution.rustiq',
'WeightedSum.default',
'annotated.default',
'clifford.ag',
'clifford.bm',
'clifford.default',
'clifford.greedy',
'clifford.layers',
'clifford.lnn',
'linear_function.default',
'linear_function.kms',
'linear_function.pmh',
'mcmt.default',
'mcmt.noaux',
'mcmt.vchain',
'mcmt.xgate',
'mcx.1_clean_b95',
'mcx.1_clean_kg24',
'mcx.1_dirty_kg24',
'mcx.2_clean_kg24',
'mcx.2_dirty_kg24',
'mcx.default',
'mcx.gray_code',
'mcx.n_clean_m15',
'mcx.n_dirty_i15',
'mcx.noaux_hp24',
'mcx.noaux_v24',
'permutation.acg',
'permutation.basic',
'permutation.default',
'permutation.kms',
'permutation.token_swapper',
'qft.default',
'qft.full',
'qft.line',
'clifford.rb_default']
Utilisez un plugin
Dans cette section, nous montrons comment utiliser les plugins de transposition. Dans les exemples de code, nous utilisons les plugins fournis avec Qiskit, mais les plugins installés à partir de paquets tiers sont utilisés de la même manière.
Utilisez un plugin de transpilation
Pour utiliser un plugin d'étape de transcompilation, indiquez son nom à l'aide de l'argument approprié dans generate_preset_pass_manager ou transpile. L'argument est formé en ajoutant _method au nom de l'étape de transpilation. Par exemple, pour utiliser le plugin lookahead de routage, il faudrait spécifier lookahead pour routing_method l'argument.
Le backend FakeSherbrooke fictif de qiskit_ibm_runtime est utilisé dans ces exemples, mais vous pouvez l'essayer sur n'importe quel backend réel ou fictif compatible avec Qiskit. Vos résultats peuvent varier.
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, routing_method="lookahead"
)Utilisez un plugin de synthèse unitaire
Pour utiliser un plugin de synthèse unitaire, spécifiez son nom en tant qu'argument unitary_synthesis_method à generate_preset_pass_manager ou transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
unitary_synthesis_method="sk",
unitary_synthesis_plugin_config=dict(
basis_gates=["cz", "id", "rz", "sx", "x"]
),
)La synthèse unitaire est utilisée dans les étapes init, translation, et optimization du gestionnaire de passage par étapes renvoyé par generate_preset_pass_manager ou utilisée dans transpile. Voir les étapes du transpondeur pour une description de ces étapes.
Utilisez l'argument unitary_synthesis_plugin_config , un dictionnaire de forme libre, pour transmettre des options pour la méthode de synthèse unitaire. La documentation de la méthode de synthèse doit expliquer les options qu'elle prend en charge. Voir cette liste pour les liens vers la documentation des plugins de synthèse unitaire intégrés.
Utilisez un plugin de synthèse de haut niveau
Tout d'abord, créez un HLSConfig pour stocker les noms des plugins à utiliser pour les différents objets de haut niveau. Par exemple :
from qiskit.transpiler.passes import HLSConfig
hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])Cette cellule de code crée une configuration de synthèse de haut niveau qui utilise le plugin layers pour synthétiser les objets de Clifford et le plugin pmh pour synthétiser les objets de LinearFunction objets. Les noms des arguments des mots-clés correspondent à l'élément name de la classe Operation représentant le type d'objet synthétisé.
Pour chaque objet de haut niveau, la liste des plugins donnés est essayée en séquence jusqu'à ce que l'un d'entre eux réussisse (dans l'exemple ci-dessus, chaque liste ne contient qu'un seul plugin) réussisse (dans l'exemple ci-dessus, chaque liste ne contient qu'un seul plugin).
En plus de spécifier un plugin par son nom, vous pouvez transmettre un tuple (name, options) , où le deuxième élément du tuple est un dictionnaire contenant des options pour le plugin. La documentation de la méthode de synthèse doit expliquer les options qu'elle prend en charge. Voir cette liste pour les liens vers la documentation des plugins de synthèse de haut niveau intégrés.
Une fois que vous avez créé l'objet HLSConfig , transmettez-le en tant qu'argument à la commande hls_config à generate_preset_pass_manager ou transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)La synthèse de haut niveau est utilisée dans les étapes init, translation, et optimization du gestionnaire de passage par étapes renvoyé par generate_preset_pass_manager ou utilisée dans transpile. Voir les étapes du transpondeur pour une description de ces étapes.
Etapes suivantes
- Créer un plugin de transcompilation.
- Consultez les didacticiels pour des exemples de transposition et d'exécution de circuits quantiques.