Instalar e usar plugins do Transpiler
Versões dos pacotes
O código desta página foi desenvolvido com os seguintes requisitos. Recomendamos usar essas versões ou versões mais recentes.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Para facilitar o desenvolvimento e a reutilização de código de transpilação personalizado pela comunidade mais ampla de usuários do Qiskit, o SDK do Qiskit oferece suporte a uma interface de plugins que permite que pacotes Python de terceiros declarem que fornecem funcionalidades estendidas de transpilação acessíveis via Qiskit.
Atualmente, plugins de terceiros podem fornecer funcionalidades estendidas de transpilação de três maneiras:
- Um plugin de estágio do Transpiler fornece um gerenciador de passes que pode ser usado no lugar de um dos 6 estágios de um gerenciador de passes em estágios predefinido:
init,layout,routing,translation,optimizationescheduling. - Um plugin de síntese unitária fornece funcionalidade estendida para síntese de gates unitários.
- Um plugin de síntese de alto nível fornece funcionalidade estendida para sintetizar "objetos de alto nível", como funções lineares ou operadores de Clifford. Objetos de alto nível são representados por subclasses da classe Operation.
O restante da página descreve como listar os plugins disponíveis, instalar novos e utilizá-los.
Listar plugins disponíveis e instalar novos
O Qiskit já inclui alguns plugins integrados para transpilação. Para instalar mais, você pode usar o gerenciador de pacotes Python. Por exemplo, você pode executar pip install qiskit-toqm para instalar o plugin de estágio de roteamento Qiskit TOQM. Vários plugins de terceiros fazem parte do ecossistema Qiskit.
Listar plugins de estágio do Transpiler disponíveis
Use a função list_stage_plugins, passando o nome do estágio cujos plugins você deseja listar.
# 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 estivesse instalado, então toqm apareceria na lista de plugins de routing.
Listar plugins de síntese unitária disponíveis
Use a função unitary_synthesis_plugin_names.
from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names
unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
Listar plugins de síntese de alto nível disponíveis
Use a função high_level_synthesis_plugin_names, passando o nome do tipo de "objeto de alto nível" a ser sintetizado. O nome corresponde ao atributo name da classe Operation que representa o tipo de objeto sendo sintetizado.
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']
Você pode usar a classe HighLevelSynthesisPluginManager para listar os nomes de todos os plugins de síntese de alto nível:
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']
Usar um plugin
Nesta seção, mostramos como usar plugins do Transpiler. Nos exemplos de código, usamos plugins que acompanham o Qiskit, mas plugins instalados de pacotes de terceiros são utilizados da mesma forma.
Usar um plugin de estágio do Transpiler
Para usar um plugin de estágio do Transpiler, especifique seu nome com o argumento apropriado em generate_preset_pass_manager ou transpile. O argumento é formado acrescentando _method ao nome do estágio de transpilação. Por exemplo, para usar o plugin de roteamento lookahead, especificaríamos lookahead no argumento 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"
)
Usar um plugin de síntese unitária
Para usar um plugin de síntese unitária, especifique seu nome como argumento unitary_synthesis_method em 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"]
),
)
A síntese unitária é usada nos estágios init, translation e optimization do gerenciador de passes em estágios retornado por generate_preset_pass_manager ou utilizado em transpile. Consulte Estágios do Transpiler para uma descrição desses estágios.
Use o argumento unitary_synthesis_plugin_config, um dicionário de formato livre, para passar opções para o método de síntese unitária. A documentação do método de síntese deve explicar as opções suportadas. Consulte esta lista para links para a documentação dos plugins de síntese unitária integrados.
Usar um plugin de síntese de alto nível
Primeiro, crie um HLSConfig para armazenar os nomes dos plugins a serem usados para vários objetos de alto nível. Por exemplo:
from qiskit.transpiler.passes import HLSConfig
hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])
Esta célula de código cria uma configuração de síntese de alto nível que usa o plugin layers
para sintetizar objetos Clifford e o plugin pmh para sintetizar
objetos LinearFunction. Os nomes dos argumentos por palavra-chave correspondem ao
atributo name da classe Operation que representa o tipo de objeto sendo sintetizado.
Para cada objeto de alto nível, a lista de plugins fornecida é tentada em sequência até que um deles
tenha sucesso (no exemplo acima, cada lista contém apenas um único plugin).
Além de especificar
um plugin pelo seu nome, você também pode passar uma tupla (nome, opções), onde o segundo elemento da tupla é um dicionário contendo opções para o plugin. A documentação do método de síntese deve explicar as opções suportadas. Consulte esta lista para links para a documentação dos plugins de síntese de alto nível integrados.
Depois de criar o objeto HLSConfig, passe-o como argumento
hls_config para generate_preset_pass_manager ou transpile:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)
A síntese de alto nível é usada nos estágios init, translation e optimization do gerenciador de passes em estágios retornado por generate_preset_pass_manager ou utilizado em transpile. Consulte Estágios do Transpiler para uma descrição desses estágios.
Próximos passos
- Criar um plugin do Transpiler.
- Confira os tutoriais para exemplos de transpilação e execução de circuits quânticos.