Installare e utilizzare i plugin transpiler
Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti. Si consiglia di utilizzare queste versioni o versioni più recenti.
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
Per facilitare lo sviluppo e il riutilizzo di codice di transpilazione personalizzato da parte della più ampia comunità di utenti di Qiskit, l'SDK di Qiskit supporta un'interfaccia di plugin che consente ai pacchetti di terze parti di Python di dichiarare che forniscono funzionalità di transpilazione estese accessibili tramite Qiskit.
Attualmente, i plugin di terze parti possono fornire funzionalità di transpilazione estese in tre modi:
- Un plugin transpiler stage fornisce un pass manager che può essere utilizzato al posto di uno dei 6 stadi di uno staged pass manager preimpostato:
init,layout,routing,translation,optimization, escheduling. - Un plugin per la sintesi unitaria fornisce funzionalità estese per la sintesi di porte unitarie.
- Un plugin di sintesi di alto livello fornisce funzionalità estese per la sintesi di "oggetti di alto livello" come funzioni lineari o operatori di Clifford. Gli oggetti di alto livello sono rappresentati da sottoclassi della classe Operation.
Il resto della pagina descrive come elencare i plugin disponibili, installarne di nuovi e utilizzarli.
Elenca i plugin disponibili e installa quelli nuovi
Qiskit include già alcuni plugin integrati per la trasposizione. Per installarne altri, si può usare il gestore di pacchetti Python. Ad esempio, si può eseguire pip install qiskit-toqm per installare il plugin dello stadio di routing Qiskit TOQM. Una serie di plugin di terze parti fa parte dell' ecosistema Qiskit.
Elenco dei plugin disponibili per la fase di transpilazione
Utilizzare la funzione list_stage_plugins, passando il nome dello stadio di cui si vogliono elencare i plugin.
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']
Se qiskit-toqm fosse installato, allora toqm apparirebbe nell'elenco dei plugin di routing .
Elenco dei plugin di sintesi unitari disponibili
Utilizzare la funzione unitary_synthesis_plugin_names.
from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names
unitary_synthesis_plugin_names()Output:
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
Elenco dei plugin di sintesi di alto livello disponibili
Utilizzare la funzione high_level_synthesis_plugin_names, passando il nome del tipo di "oggetto di alto livello" da sintetizzare. Il nome corrisponde all'attributo name della classe Operation che rappresenta il tipo di oggetto da sintetizzare.
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']
È possibile utilizzare la classe HighLevelSynthesisPluginManager per elencare i nomi di tutti i plugin di sintesi di alto livello:
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']
Utilizza un plugin
In questa sezione viene mostrato come utilizzare i plugin del transpiler. Negli esempi di codice, utilizziamo i plugin forniti con Qiskit, ma i plugin installati da pacchetti di terze parti vengono utilizzati allo stesso modo.
Utilizza un plugin per la fase di transpilazione
Per utilizzare un plugin di fase di transpilazione, specificarne il nome con l'argomento appropriato in generate_preset_pass_manager o transpile. L'argomento viene formato aggiungendo _method al nome della fase di transpilazione. Ad esempio, per utilizzare il plugin lookahead di routing, dovremmo specificare lookahead come argomento routing_method .
In questi esempi viene utilizzato il backend FakeSherbrooke``qiskit_ibm_runtime fittizio di, ma è possibile provarlo su qualsiasi backend reale o fittizio compatibile con Qiskit. I tuoi risultati potrebbero essere diversi.
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"
)Utilizza un plugin di sintesi unitario
Per utilizzare un plugin di sintesi unitaria, specificare il suo nome come argomento di unitary_synthesis_method a generate_preset_pass_manager oppure 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 sintesi unitaria viene utilizzata negli stadi init, translation e optimization del gestore di passaggi a stadi restituito da generate_preset_pass_manager o utilizzato in transpile. Per una descrizione di queste fasi, vedere Fasi Transpiler.
Utilizzare l'argomento unitary_synthesis_plugin_config , un dizionario a forma libera, per passare le opzioni per il metodo di sintesi unitaria. La documentazione del metodo di sintesi deve spiegare le opzioni che supporta. Per i link alla documentazione dei plugin di sintesi unitaria incorporati, consultare questo elenco.
Utilizza un plugin di sintesi di alto livello
Per prima cosa, creare un HLSConfig per per memorizzare i nomi dei plugin da usare per i vari oggetti di alto livello. Ad esempio:
from qiskit.transpiler.passes import HLSConfig
hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])Questa cella di codice crea una configurazione di sintesi di alto livello che utilizza il plugin layers per la sintesi degli oggetti Clifford e il plugin pmh per la sintesi degli oggetti LinearFunction oggetti. I nomi degli argomenti delle parole chiave corrispondono agli argomenti di name della classe Operation che rappresenta il tipo di oggetto da sintetizzare.
Per ogni oggetto di alto livello, l'elenco dei plugin dati viene provato in sequenza finché uno di essi riesce (nell'esempio precedente, ogni elenco contiene solo un singolo plugin).
Oltre a specificare un plugin con il suo nome, si può invece passare una tupla (name, options) , dove il secondo elemento della tupla è un dizionario contenente le opzioni del plugin. La documentazione del metodo di sintesi deve spiegare le opzioni che supporta. Per i link alla documentazione dei plugin di sintesi ad alto livello integrati, consultare questo elenco.
Una volta creato l'oggetto HLSConfig , passarlo come argomento del metodo hls_config a generate_preset_pass_manager o transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)La sintesi di alto livello viene utilizzata negli stadi init, translation e optimization del gestore di passaggi a stadi restituito da generate_preset_pass_manager o utilizzato in transpile. Per una descrizione di queste fasi, vedere Fasi Transpiler.
Passi successivi
- Crea un plugin di transpiler.
- Consultate le esercitazioni per trovare esempi di transpiling e di esecuzione di circuiti quantistici.