Vai al contenuto principale

Installare e usare i plugin del transpiler

Versioni dei pacchetti

Il codice in questa pagina è stato sviluppato con i seguenti requisiti. Si consiglia di usare queste versioni o versioni più recenti.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Per facilitare lo sviluppo e il riutilizzo di codice di transpilazione personalizzato da parte della comunità Qiskit, l'SDK Qiskit supporta un'interfaccia a plugin che consente a pacchetti Python di terze parti di dichiarare che forniscono funzionalità di transpilazione estesa accessibili tramite Qiskit.

Al momento, i plugin di terze parti possono fornire funzionalità di transpilazione estesa in tre modi:

  • Un plugin per la fase del transpiler fornisce un pass manager che può essere usato al posto di una delle 6 fasi di un pass manager staged predefinito: init, layout, routing, translation, optimization e scheduling.
  • Un plugin di sintesi unitaria fornisce funzionalità estesa per la sintesi di gate unitari.
  • Un plugin di sintesi ad alto livello fornisce funzionalità estesa per la sintesi di "oggetti ad alto livello" come funzioni lineari o operatori di Clifford. Gli oggetti ad alto livello sono rappresentati da sottoclassi della classe Operation.

Il resto della pagina descrive come elencare i plugin disponibili, installarne di nuovi e utilizzarli.

Elencare i plugin disponibili e installarne di nuovi​

Qiskit include già alcuni plugin integrati per la transpilazione. Per installarne altri, puoi usare il tuo gestore di pacchetti Python. Ad esempio, potresti eseguire pip install qiskit-toqm per installare il plugin di routing Qiskit TOQM. Diversi plugin di terze parti fanno parte dell'ecosistema Qiskit.

Elencare i plugin disponibili per le fasi del transpiler​

Usa la funzione list_stage_plugins, passando il nome della fase di cui vuoi elencare i plugin.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins

list_stage_plugins("layout")
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")
['basic', 'default', 'lookahead', 'none', 'sabre']

Se qiskit-toqm fosse installato, toqm apparirebbe nell'elenco dei plugin di routing.

Elencare i plugin di sintesi unitaria disponibili​

Usa la funzione unitary_synthesis_plugin_names.

from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names

unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']

Elencare i plugin di sintesi ad alto livello disponibili​

Usa la funzione high_level_synthesis_plugin_names, passando il nome del tipo di "oggetto ad 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")
['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']

Puoi usare la classe HighLevelSynthesisPluginManager per elencare i nomi di tutti i plugin di sintesi ad alto livello:

from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)

HighLevelSynthesisPluginManager().plugins.names()
['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']

Usare un plugin​

In questa sezione mostriamo come usare i plugin del transpiler. Negli esempi di codice utilizziamo plugin inclusi in Qiskit, ma i plugin installati da pacchetti di terze parti si usano nello stesso modo.

Usare un plugin per la fase del transpiler​

Per usare un plugin per la fase del transpiler, specifica il suo nome con l'argomento appropriato di generate_preset_pass_manager o transpile. L'argomento si forma aggiungendo _method al nome della fase di transpilazione. Ad esempio, per usare il plugin di routing lookahead, specifica lookahead come valore dell'argomento routing_method:

from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend("ibm_fez")

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, routing_method="lookahead"
)

Usare un plugin di sintesi unitaria​

Per usare un plugin di sintesi unitaria, specifica il suo nome come argomento unitary_synthesis_method di generate_preset_pass_manager o 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 usata nelle fasi init, translation e optimization del pass manager staged restituito da generate_preset_pass_manager o usato in transpile. Consulta Fasi del transpiler per una descrizione di queste fasi.

Usa l'argomento unitary_synthesis_plugin_config, un dizionario libero, per passare opzioni al metodo di sintesi unitaria. La documentazione del metodo di sintesi dovrebbe indicare le opzioni supportate. Consulta questo elenco per i link alla documentazione dei plugin di sintesi unitaria integrati.

Usare un plugin di sintesi ad alto livello​

Prima di tutto, crea un oggetto HLSConfig per memorizzare i nomi dei plugin da usare per i vari oggetti ad 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 ad alto livello che usa il plugin layers per sintetizzare oggetti Clifford e il plugin pmh per sintetizzare oggetti LinearFunction. I nomi degli argomenti keyword corrispondono all'attributo name della classe Operation che rappresenta il tipo di oggetto da sintetizzare. Per ogni oggetto ad alto livello, i plugin elencati vengono provati in sequenza finché uno di essi riesce (nell'esempio sopra, ogni lista contiene un solo plugin).

Oltre a specificare un plugin tramite il suo nome, puoi in alternativa passare una tupla (name, options), dove il secondo elemento è un dizionario contenente le opzioni per il plugin. La documentazione del metodo di sintesi dovrebbe indicare le opzioni supportate. Consulta questo elenco per i link alla documentazione dei plugin di sintesi ad alto livello integrati.

Una volta creato l'oggetto HLSConfig, passalo come argomento 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 ad alto livello viene usata nelle fasi init, translation e optimization del pass manager staged restituito da generate_preset_pass_manager o usato in transpile. Consulta Fasi del transpiler per una descrizione di queste fasi.

Passi successivi​

Raccomandazioni