Saltar al contenido principal

Instalar y usar plugins del transpilador

Package versions

The code on this page was developed using the following requirements. We recommend using these versions or newer.

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

Para facilitar el desarrollo y la reutilización de código de transpilación personalizado por parte de la comunidad de usuarios de Qiskit, el SDK de Qiskit admite una interfaz de plugins que permite que paquetes Python de terceros declaren que proporcionan funcionalidad de transpilación extendida accesible a través de Qiskit.

Actualmente, los plugins de terceros pueden proporcionar funcionalidad de transpilación extendida de tres maneras:

  • Un plugin de etapa de transpilador proporciona un administrador de pases que puede usarse en lugar de una de las 6 etapas de un administrador de pases por etapas preestablecido: init, layout, routing, translation, optimization y scheduling.
  • Un plugin de síntesis unitaria proporciona funcionalidad extendida para la síntesis de puertas unitarias.
  • Un plugin de síntesis de alto nivel proporciona funcionalidad extendida para sintetizar "objetos de alto nivel", como funciones lineales u operadores Clifford. Los objetos de alto nivel están representados por subclases de la clase Operation.

El resto de la página describe cómo listar los plugins disponibles, instalar nuevos y usarlos.

Listar plugins disponibles e instalar nuevos

Qiskit ya incluye algunos plugins integrados para la transpilación. Para instalar más, puedes usar tu administrador de paquetes de Python. Por ejemplo, podrías ejecutar pip install qiskit-toqm para instalar el plugin de etapa de enrutamiento Qiskit TOQM. Varios plugins de terceros forman parte del ecosistema de Qiskit.

Listar plugins de etapa de transpilador disponibles

Usa la función list_stage_plugins, pasando el nombre de la etapa cuyos plugins quieres 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']

Si qiskit-toqm estuviera instalado, toqm aparecería en la lista de plugins de routing.

Listar plugins de síntesis unitaria disponibles

Usa la función 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íntesis de alto nivel disponibles

Usa la función high_level_synthesis_plugin_names, pasando el nombre del tipo de "objeto de alto nivel" que se va a sintetizar. El nombre corresponde al atributo name de la clase Operation que representa el tipo de objeto que se está sintetizando.

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']

Puedes usar la clase HighLevelSynthesisPluginManager para listar los nombres de todos los plugins de síntesis de alto nivel:

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 un plugin

En esta sección mostramos cómo usar plugins del transpilador. En los ejemplos de código usamos plugins que vienen con Qiskit, pero los plugins instalados desde paquetes de terceros se usan de la misma manera.

Usar un plugin de etapa de transpilador

Para usar un plugin de etapa de transpilador, especifica su nombre con el argumento apropiado para generate_preset_pass_manager o transpile. El argumento se forma añadiendo _method al nombre de la etapa de transpilación. Por ejemplo, para usar el plugin de enrutamiento lookahead, especificaríamos lookahead para el 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 un plugin de síntesis unitaria

Para usar un plugin de síntesis unitaria, especifica su nombre como argumento unitary_synthesis_method para 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 síntesis unitaria se usa en las etapas init, translation y optimization del administrador de pases por etapas devuelto por generate_preset_pass_manager o utilizado en transpile. Consulta Etapas del transpilador para una descripción de estas etapas.

Usa el argumento unitary_synthesis_plugin_config, un diccionario de forma libre, para pasar opciones para el método de síntesis unitaria. La documentación del método de síntesis debe explicar las opciones que admite. Consulta esta lista para ver enlaces a la documentación de los plugins de síntesis unitaria integrados.

Usar un plugin de síntesis de alto nivel

Primero, crea un objeto HLSConfig para almacenar los nombres de los plugins que se usarán para los distintos objetos de alto nivel. Por ejemplo:

from qiskit.transpiler.passes import HLSConfig

hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])

Esta celda de código crea una configuración de síntesis de alto nivel que usa el plugin layers para sintetizar objetos Clifford y el plugin pmh para sintetizar objetos LinearFunction. Los nombres de los argumentos de palabras clave corresponden al atributo name de la clase Operation que representa el tipo de objeto que se está sintetizando. Para cada objeto de alto nivel, la lista de plugins proporcionados se prueba en secuencia hasta que uno de ellos tiene éxito (en el ejemplo anterior, cada lista contiene un único plugin).

Además de especificar un plugin por su nombre, también puedes pasar una tupla (name, options), donde el segundo elemento de la tupla es un diccionario que contiene opciones para el plugin. La documentación del método de síntesis debe explicar las opciones que admite. Consulta esta lista para ver enlaces a la documentación de los plugins de síntesis de alto nivel integrados.

Una vez que hayas creado el objeto HLSConfig, pásalo como argumento 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 síntesis de alto nivel se usa en las etapas init, translation y optimization del administrador de pases por etapas devuelto por generate_preset_pass_manager o utilizado en transpile. Consulta Etapas del transpilador para una descripción de estas etapas.

Próximos pasos

Recomendación