Instale e utilize plugins transpiler
O código desta página foi desenvolvido usando os seguintes requisitos. Recomendamos o uso dessas versões ou de versões mais recentes.
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
Para facilitar o desenvolvimento e a reutilização do código de transpilação personalizado pela comunidade mais ampla de usuários do Qiskit, o Qiskit SDK oferece suporte a uma interface de plug-in que permite que pacotes Python de terceiros declarem que fornecem funcionalidade de transpilação estendida acessível via Qiskit.
Atualmente, os plug-ins de terceiros podem fornecer a funcionalidade de transpilação estendida de três maneiras:
- Um plug-in de estágio de transpilador fornece um gerenciador de passagem que pode ser usado no lugar de um dos 6 estágios de um gerenciador de passagem em estágios predefinido:
init,layout,routing,translation,optimization, escheduling. - Um plug-in de síntese unitária oferece funcionalidade estendida para a síntese de porta unitária.
- Um plug-in de síntese de alto nível oferece funcionalidade estendida para sintetizar "objetos de alto nível", como funções lineares ou operadores Clifford. Os objetos de alto nível são representados por subclasses da classe Operation.
O restante da página descreve como listar os plug-ins disponíveis, instalar novos plug-ins e usá-los.
Listar plugins disponíveis e instalar novos
O Qiskit já inclui alguns plug-ins 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 plug-in do estágio de roteamento do Qiskit TOQM. Vários plug-ins de terceiros fazem parte do ecossistema do Qiskit.
Lista de plugins de estágio do transpiler disponíveis
Use a função list_stage_plugins, passando o nome do estágio cujos plug-ins você deseja listar.
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 estivesse instalado, então toqm apareceria na lista de plug-ins routing .
Lista de 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()Output:
['aqc', 'clifford', 'default', 'gridsynth', 'sk']
Lista de plug-ins 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 que está sendo sintetizado.
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']
Você pode usar a classe HighLevelSynthesisPluginManager para listar os nomes de todos os plug-ins de síntese de alto nível:
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']
Use um plugin
Nesta seção, mostraremos como usar os plug-ins do transpilador. Nos exemplos de código, usamos plug-ins que vêm com o Qiskit, mas os plug-ins instalados a partir de pacotes de terceiros são usados da mesma forma.
Use um plugin de etapa transpiler
Para usar um plug-in de etapa de transpilador, especifique seu nome com o argumento apropriado para generate_preset_pass_manager ou transpile. O argumento é formado acrescentando-se _method ao nome da etapa de transpilagem. Por exemplo, para usar o plugin lookahead de roteamento, especificaríamos lookahead para o routing_method argumento.
Nestes exemplos, é utilizado o backend FakeSherbrooke``qiskit_ibm_runtime simulado do, mas você pode testá-lo em qualquer backend real ou simulado compatível com o Qiskit. Seus resultados podem ser diferentes.
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"
)Use um plugin de síntese unitária
Para usar um plug-in de síntese unitária, especifique seu nome como o argumento unitary_synthesis_method para 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 passagem em estágios retornado por generate_preset_pass_manager ou usada em transpile. Consulte Estágios do transpiler para obter uma descrição desses estágios.
Use o argumento unitary_synthesis_plugin_config , um dicionário de forma 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 que ele suporta. Consulte esta lista para obter links para a documentação dos plug-ins de síntese unitária incorporados.
Use um plug-in de síntese de alto nível
Primeiro, crie um HLSConfig para armazenar os nomes dos plug-ins 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"])Essa célula de código cria uma configuração de síntese de alto nível que usa o plug-in layers para sintetizar objetos Clifford e o plug-in pmh para sintetizar LinearFunction objetos. Os nomes dos argumentos da palavra-chave correspondem ao name da classe Operation que representa o tipo de objeto que está sendo sintetizado.
Para cada objeto de alto nível, a lista de plug-ins fornecidos é tentada em sequência até que um deles seja bem-sucedido (no exemplo acima, cada lista contém apenas um único plug-in).
Além de especificar um plug-in por seu nome, você pode passar uma tupla (name, options) , em que o segundo elemento da tupla é um dicionário que contém opções para o plug-in. A documentação do método de síntese deve explicar as opções que ele suporta. Consulte esta lista para obter links para a documentação dos plug-ins de síntese de alto nível incorporados.
Depois de criar o objeto HLSConfig , passe-o como o argumento hls_config para o 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 passagem em estágios retornado por generate_preset_pass_manager ou usado em transpile. Consulte Estágios do transpiler para obter uma descrição desses estágios.
Próximas etapas
- Crie um plug-in de transpilação.
- Confira os tutoriais para ver exemplos de transpilação e execução de circuitos quânticos.