Interfaccia plugin Transpiler Stage
qiskit.transpiler.preset_passmanagers.plugin
Questo modulo definisce l'interfaccia del plugin per fornire implementazioni personalizzate delle fasi per i gestori dei passaggi predefiniti e per transpile() la funzione. Ciò consente ai pacchetti esterni di Python di fornire PassManager oggetti che possono essere utilizzati per ciascuna fase specificata.
Le interfacce dei plugin sono costruite utilizzando i punti di ingresso di setuptools che consentono ai pacchetti esterni a Qiskit di pubblicizzare l'inclusione di uno o più stadi del transpiler.
Per i dettagli su come scrivere invece i plugin per i metodi di sintesi del transpiler, vedere qiskit.transpiler.passes.synthesis.plugin.
Fasi del plugin
Ci sono sei stadi nei gestori dei passaggi di preselezione, che caricano attivamente i plugin esterni utilizzando i punti di ingresso corrispondenti. La tabella seguente riassume ogni fase. Per maggiori dettagli sulla descrizione e sulle aspettative di ogni fase, seguite il link al nome della fase per accedere alla documentazione completa.
Nome fase | Punto di ingresso | Nomi riservati | Riepilogo |
|---|---|---|---|
| inizializzare | qiskit.transpiler.init | default | Ottimizzazioni logiche di alto livello su circuiti astratti e riduzione delle operazioni multi-qubit a operazioni a uno e due-qubit. |
| layout | qiskit.transpiler.layout | trivial, dense, sabre, default | Scegliere una mappatura iniziale di qubit virtuali a qubit fisici, compresa l'espansione del circuito per includere ancille esplicite. Questa fase è talvolta combinata con routing. |
| instradamento | qiskit.transpiler.routing | default, basic, stochastic, lookahead, sabre | Inserire delle porte nel circuito per garantire che rispetti i vincoli di connettività del Target. Non è necessario che i gate inseriti facciano già parte dell’ISA di destinazione, quindi spesso vengono semplicemente generati come swap istruzioni. Questa fase viene talvolta inclusa in layout. |
| traduzione | qiskit.transpiler.translation | default, translator, synthesis | Riscrivere tutti i gate al di fuori dell'ISA di destinazione per utilizzare solo i gate all'interno dell'ISA. |
| di rete | qiskit.transpiler.optimization | default | Ottimizzazioni di basso livello, consapevoli del circuito fisico. A differenza di init, lo stadio optimization agisce a livello di circuito fisico. |
| pianificazione | qiskit.transpiler.scheduling | alap, asap, default | Inserire Delay per rendere completamente esplicita la temporizzazione wall-clock del circuito. |
Scrittura dei plugin
Per scrivere un plugin per la fase di gestione dei pass sono necessari due passaggi principali. Il primo passo consiste nel creare una sottoclasse della classe PassManagerStagePlugin astratta del plugin, che viene utilizzata per definire come verrà costruito il plugin PassManager per lo stage. Ad esempio, per creare un layout plugin di fase che si limiti a eseguire VF2Layout (con un numero crescente di tentativi, a seconda del livello di ottimizzazione) e che ricorra all'uso TrivialLayout di qualora VF2Layout non riesca a trovare una disposizione perfetta:
from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin
from qiskit.transpiler.preset_passmanagers import common
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import VF2Layout, TrivialLayout
from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
from qiskit.passmanager import ConditionalController
def _vf2_match_not_found(property_set):
return property_set.get("layout") is None or (
property_set.get("VF2Layout_stop_reason") is not None
and property_set.get("VF2Layout_stop_reason")
is not VF2LayoutStopReason.SOLUTION_FOUND
)
class VF2LayoutPlugin(PassManagerStagePlugin):
def pass_manager(self, pass_manager_config, optimization_level):
layout_pm = PassManager(
[
VF2Layout(
coupling_map=pass_manager_config.coupling_map,
max_trials=optimization_level * 10 + 1,
target=pass_manager_config.target,
),
ConditionalController(
TrivialLayout(pass_manager_config.coupling_map),
condition=_vf2_match_not_found,
),
]
)
layout_pm += common.generate_embed_passmanager(pass_manager_config.coupling_map)
return layout_pmIl secondo passo consiste nell'indicare la PassManagerStagePlugin sottoclasse come punto di accesso di setuptools nei metadati del pacchetto. Questo può essere fatto in una entry-points tabella in pyproject.toml per il pacchetto del plugin, con i punti di ingresso necessari nel namespace appropriato per lo stadio a cui è destinato il plugin. È possibile visualizzare l'elenco delle fasi, dei punti di ingresso e delle aspettative relative a ciascuna fase nella sezione " Fasi del plugin ". Ad esempio, riprendendo l'esempio del plugin riportato sopra:
[project.entry-points."qiskit.transpiler.layout"]
"vf2" = "qiskit_plugin_pkg.module.plugin:VF2LayoutPlugin"Non c'è limite al numero di plugin che un singolo pacchetto può includere, purché ogni plugin abbia un nome unico. Quindi un singolo pacchetto può esporre più plugin, se necessario. Per un elenco dei nomi riservati per ogni fase, fare riferimento a Fasi del plugin.
API del plugin
PassManagerStagePlugin() | Un PassManagerStagePlugin è un oggetto di interfaccia del plugin per l'utilizzo di stadi personalizzati in transpile(). |
PassManagerStagePluginManager() | Classe di gestione per i plugin dello stadio di gestione dei passaggi preimpostati. |
list_stage_plugins
qiskit.transpiler.preset_passmanagers.plugin.list_stage_plugins(stage_name)
Ottenere un elenco dei plugin installati per uno stage.
Parametri
stage_name (str) – Il nome dello stage per cui ottenere i nomi dei plugin
Risultati
L'elenco dei nomi dei plugin installati per le fasi specificate
Tipo di restituzione
plugin
Aumenti
TranspilerError - Se viene specificato un nome di stage non valido.
passmanager_stage_plugins
qiskit.transpiler.preset_passmanagers.plugin.passmanager_stage_plugins(stage)
Restituisce un dict con, per ogni nome di stadio, il tipo di classe del plugin.
Questa funzione è utile per ottenere ulteriori informazioni su un plugin:
from qiskit.transpiler.preset_passmanagers.plugin import passmanager_stage_plugins
routing_plugins = passmanager_stage_plugins('routing')
basic_plugin = routing_plugins['basic']
help(basic_plugin)Help on BasicSwapPassManager in module ...preset_passmanagers.builtin_plugins object:
class BasicSwapPassManager(...preset_passmanagers.plugin.PassManagerStagePlugin)
| Plugin class for routing stage with :class:`~.BasicSwap`
|
| Method resolution order:
| BasicSwapPassManager
| ...preset_passmanagers.plugin.PassManagerStagePlugin
| abc.ABC
| builtins.object
...Parametri
stage (str) – Il nome d'arte da ottenere
Risultati
la chiave è il nome del plugin e il valore è il tipo di classe per ciascuno.
Tipo di restituzione
Aumenti
TranspilerError - Se viene specificato un nome di stage non valido.