Complementos de síntesis
qiskit.transpiler.passes.synthesis.plugin
Este módulo define las interfaces de plugin para los pases del transpilador de síntesis en Qiskit. Proporcionan un punto de enganche para que los paquetes python externos implementen sus propias técnicas de síntesis y las expongan sin problemas como opciones opcionales a los usuarios cuando ejecutan transpile().
Las interfaces de plugin se construyen utilizando puntos de entrada setuptools que permiten a los paquetes externos a qiskit anunciar que incluyen un plugin de síntesis.
Consulte qiskit.transpiler.preset_passmanagers.plugin para más detalles sobre cómo escribir plugins para las etapas del transpilador.
API del complemento Synthesis
API del complemento de síntesis unitaria
Columna « 1 » | Columna « 2 » |
|---|---|
UnitarySynthesisPlugin() | Clase plugin de síntesis unitaria abstracta |
UnitarySynthesisPluginManager() | Clase de gestor de plugins de síntesis unitaria |
unitary_synthesis_plugin_names() | Devuelve una lista con los nombres de los plugins de síntesis unitaria instalados |
API del complemento de síntesis de alto nivel
Columna « 1 » | Columna « 2 » |
|---|---|
HighLevelSynthesisPlugin() | Clase abstracta de complemento de síntesis de alto nivel. |
HighLevelSynthesisPluginManager() | Clase que rastrea los plugins de síntesis de alto nivel instalados. |
high_level_synthesis_plugin_names(nombre_operación) | Devuelve una lista de nombres de plugins instalados para un nombre de objeto de alto nivel dado |
Escribir complementos
Complementos de síntesis unitaria
Para escribir un complemento de síntesis unitaria hay que seguir dos pasos principales. El primer paso consiste en crear una subclase de la clase abstracta del complemento: UnitarySynthesisPlugin. La clase «plugin» define la interfaz y el contrato para los complementos de síntesis unitaria. El método principal es run() el que admite un único argumento posicional, una matriz unitaria en forma de matriz numpy, y se espera que devuelva un DAGCircuit objeto que represente el circuito sintetizado a partir de dicha matriz unitaria. A continuación, para indicar al transpilador de Qiskit qué información es necesaria para la pasada, hay varios métodos de propiedad obligatorios que deben implementarse, como supports_basis_gates y supports_coupling_map , dependiendo de si el complemento admite y/o requiere esa entrada para realizar la síntesis. Para obtener información detallada, consulta la UnitarySynthesisPlugin documentación sobre todos los campos obligatorios. Una clase de complemento de ejemplo tendría un aspecto similar al siguiente:
from qiskit.transpiler.passes.synthesis import plugin
from qiskit_plugin_pkg.synthesis import generate_dag_circuit_from_matrix
class SpecialUnitarySynthesis(plugin.UnitarySynthesisPlugin):
@property
def supports_basis_gates(self):
return True
@property
def supports_coupling_map(self):
return False
@property
def supports_natural_direction(self):
return False
@property
def supports_pulse_optimize(self):
return False
@property
def supports_gate_lengths(self):
return False
@property
def supports_gate_errors(self):
return False
@property
def supports_gate_lengths_by_qubit(self):
return False
@property
def supports_gate_errors_by_qubit(self):
return False
@property
def min_qubits(self):
return None
@property
def max_qubits(self):
return None
@property
def supported_bases(self):
return None
def run(self, unitary, **options):
basis_gates = options['basis_gates']
dag_circuit = generate_dag_circuit_from_matrix(unitary, basis_gates)
return dag_circuitSi, por cualquier motivo, los parámetros disponibles para el run() método son insuficientes, abre una incidencia y podremos estudiar la posibilidad de ampliar la interfaz del complemento con nuevos parámetros opcionales que puedan añadirse de forma compatible con versiones anteriores en futuras actualizaciones. No obstante, ten en cuenta que la interfaz de este complemento se considera estable y se garantiza que no sufrirá cambios que provoquen incompatibilidades. Si fuera necesario realizar cambios (por ejemplo, para ampliar las opciones de entrada opcionales disponibles), se harán de tal forma que no sea necesario modificar los complementos existentes.
Todos los métodos prefijados con supports_ están reservados en una clase derivada de UnitarySynthesisPlugin para parte de la interfaz. No debe definir ningún método personalizado supports_* en una subclase que no esté definido en la clase abstracta.
El segundo paso consiste en indicar el UnitarySynthesisPlugin como punto de entrada de setuptools en los metadatos del paquete. Para ello, basta con añadir una entry-points tabla en pyproject.toml para el paquete del complemento con los puntos de entrada necesarios bajo el qiskit.unitary_synthesis espacio de nombres. Por ejemplo:
[project.entry-points."qiskit.unitary_synthesis"]
"special" = "qiskit_plugin_pkg.module.plugin:SpecialUnitarySynthesis"No hay límite en el número de plugins que puede incluir un mismo paquete, siempre que cada plugin tenga un nombre único. Así, un solo paquete puede exponer varios plugins si es necesario. El nombre default es utilizado por el propio Qiskit y no puede ser utilizado en un plugin.
Configuración del complemento de síntesis unitaria
Para algunos plugins de síntesis unitaria que exponen múltiples opciones y sintonizables, la interfaz del plugin tiene una opción para que los usuarios proporcionen un diccionario de configuración de forma libre. Esto se pasará al método run() como el kwarg options . Si su plugin tiene estas opciones de configuración, debe documentar claramente cómo un usuario debe especificar estas opciones de configuración y cómo se utilizan, ya que es un campo de formulario libre.
Complementos de síntesis de alto nivel
Escribir un complemento de síntesis de alto nivel es, en términos conceptuales, similar a escribir un complemento de síntesis unitaria. El primer paso consiste en crear una subclase de la clase abstracta de complementos: HighLevelSynthesisPlugin, que define la interfaz y el contrato para los complementos de síntesis de alto nivel. El método principal es run(). El argumento high_level_object posicional especifica el «objeto de nivel superior» que se va a sintetizar, que puede ser cualquier objeto de tipo Operation (incluidos, por ejemplo, LinearFunction o Clifford). El argumento target «keyword» especifica el backend de destino, lo que permite al complemento acceder a toda la información específica de dicho destino, como el mapa de acoplamiento, el conjunto de puertas admitidas, etc. El argumento coupling_map «keyword» solo especifica el mapa de acoplamiento y solo se utiliza cuando target no se especifica. El argumento qubits de palabra clave especifica la lista de qubits sobre los que se define el objeto de nivel superior, en caso de que la síntesis se realice en el circuito físico. El valor de None indica que aún no se ha elegido la disposición y que aún no se han determinado los qubits físicos del mapa de destino o de acoplamiento sobre el que actúa esta operación. Además, las opciones y los parámetros de ajuste específicos de cada complemento se pueden especificar mediante options, que es un diccionario de configuración de formato libre. Si tu plugin cuenta con estas opciones de configuración, deberías documentar claramente cómo debe especificarlas el usuario y cómo se utilizan, ya que se trata de un campo de formato libre. Se espera que el método run() devuelva un QuantumCircuit objeto que represente el circuito sintetizado a partir de ese objeto de nivel superior. También está permitido devolver None un valor que indique que el método de síntesis no puede sintetizar el objeto de nivel superior dado. La síntesis propiamente dicha de los objetos de nivel superior la lleva a cabo la fase del HighLevelSynthesis transpilador. Para obtener información detallada, consulta la HighLevelSynthesisPlugin documentación sobre todos los campos obligatorios. Una clase de complemento de ejemplo tendría un aspecto similar al siguiente:
from qiskit.transpiler.passes.synthesis.plugin import HighLevelSynthesisPlugin
from qiskit.synthesis.clifford import synth_clifford_bm
class SpecialSynthesisClifford(HighLevelSynthesisPlugin):
def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
if higher_level_object.num_qubits <= 3:
return synth_clifford_bm(high_level_object)
else:
return NoneEl ejemplo anterior crea un complemento para sintetizar objetos de tipo Clifford que tengan como máximo 3 qubits, utilizando el método synth_clifford_bm.
El segundo paso consiste en indicar el HighLevelSynthesisPlugin como punto de entrada de setuptools en los metadatos del paquete. Para ello, se añade una entry-points tabla en pyproject.toml para el paquete del complemento con los puntos de entrada necesarios bajo el qiskit.synthesis espacio de nombres. Por ejemplo:
[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"El name consta de dos partes separadas por un punto «.»: el nombre del tipo al Operation que se aplica el complemento de síntesis (clifford), y el nombre del complemento (special). No hay ningún límite en cuanto al número de complementos que puede incluir un mismo paquete, siempre y cuando cada complemento tenga un nombre único.
Uso de complementos
Complementos de síntesis unitaria
Para utilizar un plugin basta con instalar el paquete que incluye un plugin de síntesis. Entonces Qiskit descubrirá automáticamente los plugins instalados y los expondrá como opciones válidas para los constructores transpile() kwargs y constructores pass. Si hay algún plugin instalado que no se pueda cargar/importar, se registrará en Python logging.
Para obtener la lista de los complementos de síntesis unitaria instalados, puedes utilizar la qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() función.
Complementos de síntesis de alto nivel
Para utilizar un complemento de síntesis de alto nivel, primero hay que crear una instancia HLSConfig de para almacenar los nombres de los complementos que se van a utilizar para diversos objetos de alto nivel. Por ejemplo:
HLSConfig(permutation=["acg"], clifford=["layers"], linear_function=["pmh"])crea una configuración de síntesis de alto nivel que utiliza el acg complemento para sintetizar PermutationGate objetos, el layers complemento para sintetizar Clifford objetos y el pmh complemento para sintetizar LinearFunction objetos. Los argumentos de palabra clave son los Operation.name campos de los objetos correspondientes. Por ejemplo, todas Clifford las operaciones tienen el nameclifford , por lo que este se utiliza como argumento clave. Aquí puedes especificar cualquier argumento de palabra clave que puedan gestionar los complementos que tengas instalados, incluidos los objetos de usuario personalizados, si tienes complementos instalados para ellos. Consulta HLSConfig para obtener más detalles sobre los formatos alternativos para configurar los complementos dentro de cada argumento.
Para cada objeto de alto nivel, la lista de plugins dados se prueba en secuencia hasta que uno de ellos tiene éxito (en el ejemplo anterior, cada lista sólo contiene un único plugin). Además de especificar un plugin por su nombre, puede pasar una tupla (name, options) , donde el segundo elemento de la tupla es un diccionario que contiene opciones para el plugin.
Una vez creado, debes pasar este HLSConfig objeto como argumento hls_config a transpile() o generate_preset_pass_manager() , que utilizarán los complementos especificados como parte del flujo de trabajo de compilación general.
Operation.namePara obtener una lista de los complementos de síntesis de alto nivel instalados para cualquier sistema dado, puedes utilizar la high_level_synthesis_plugin_names() función, pasando el sistema deseado name como argumento:
high_level_synthesis_plugin_names("clifford")devolverá una lista de todos los plugins de síntesis Clifford instalados.
Plugins disponibles
A continuación se muestran las clases de plugins de síntesis disponibles en Qiskit. Estas clases no deben utilizarse directamente, sino a través de la interfaz de complementos documentada anteriormente. Las clases se enumeran aquí para facilitar la búsqueda de la documentación de cada uno de los plugins incluidos y para facilitar la comparación entre diferentes métodos de síntesis para un objeto determinado.
Complementos de síntesis unitaria
Complemento de síntesis AQC
Columna « 1 » | Columna « 2 » |
|---|---|
AQCSynthesisPlugin() | Un plugin de síntesis unitaria Qiskit basado en AQC. |
Complemento de síntesis Solovay-Kitaev
Columna « 1 » | Columna « 2 » |
|---|---|
SolovayKitaevSynthesis() | Un plugin de síntesis unitaria Solovay-Kitaev Qiskit. |
Complemento de síntesis Ross-Selinger
Columna « 1 » | Columna « 2 » |
|---|---|
RossSelingerSynthesis() | Un complemento de síntesis unitaria Qiskit de Ross-Selinger. |
Complemento Clifford Unitary Synthesis
Columna « 1 » | Columna « 2 » |
|---|---|
CliffordUnitarySynthesis() | Un plugin de síntesis unitaria Clifford. |
Complemento de síntesis unitaria predeterminado
El complemento de síntesis unitaria predeterminado define el algoritmo predeterminado que utiliza la pasada del UnitarySynthesis transpilador para sintetizar las puertas unitarias del circuito. Su comportamiento depende del número de qubits en el operador unitario de destino y de la base de destino.
Conjuntos de bases continuas
Cuando la base objetivo es continua (es decir, no Clifford+T), el complemento utiliza las siguientes descomposiciones:
- Puertas de 1 qubit: descomposiciones en ángulos de Euler (véase
OneQubitEulerDecomposer). - Puertas de 2 qubits: descomposiciones de KAK/Cartan (véase
TwoQubitBasisDecomposer,TwoQubitControlledUDecomposer,XXDecomposer). - Puertas de 3+ qubits: Descomposición cuántica de Shannon, véase
qs_decomposition().
Para puertas de 1 y 2 qubits, el complemento utiliza la información de error básico del objetivo para seleccionar la descomposición que maximiza la fidelidad esperada.
Conjuntos de bases Clifford+T
Cuando la base de destino es Clifford+T, el complemento utiliza el algoritmo de Solovay-Kitaev (véase SolovayKitaevDecomposition) para aproximar operadores unitarios de 1 qubit. Los parámetros utilizados para crear aproximaciones básicas son basis_gates=["h", "t", "tdg"], depth=12 y recursion_degree=5, y se eligieron de forma empírica para encontrar un equilibrio entre la calidad de la aproximación y el coste computacional. Para utilizar Solovay-Kitaev con parámetros personalizados, o para evitar tener que volver a calcular las aproximaciones en el caso de circuitos múltiples, puedes utilizar SolovayKitaevSynthesis el complemento de síntesis unitaria en lugar de este complemento predeterminado.
En la actualidad, Qiskit no incluye algoritmos para aproximar unidades de 2+ qubits directamente en el conjunto de bases Clifford+T. Por lo tanto, el gestor de pases preestablecido primero descompone dichas puertas en ["cx", "u"] base y, a continuación, aplica Solovay-Kitaev a las puertas unitarias de 1 qubit resultantes.
Columna « 1 » | Columna « 2 » |
|---|---|
DefaultUnitarySynthesis() | El complemento de síntesis unitaria predeterminado. |
Síntesis de alto nivel
Entre los complementos de síntesis de alto nivel disponibles directamente en Qiskit se incluyen los destinados a sintetizar Clifford objetos, LinearFunction objetos y PermutationGate objetos. Algunos de estos complementos están diseñados implícitamente para la conectividad «todos con todos». Esto no supone una limitación práctica, ya que HighLevelSynthesis normalmente se ejecuta antes del diseño de la disposición y el enrutamiento, lo que garantiza que el circuito final se ajuste a la conectividad del dispositivo mediante la inserción de puertas SWAP adicionales. Un buen ejemplo es el plugin ACGSynthesisPermutation de síntesis por permutación, que puede sintetizar cualquier permutación con un máximo de dos capas de puertas SWAP. Por otro lado, algunos complementos se centran implícitamente en la conectividad lineal. Por lo general, los circuitos de síntesis tienen mayor profundidad y un mayor número de puertas; sin embargo, no se insertarían puertas SWAP adicionales si en la siguiente pasada de diseño se eligiera una línea consecutiva de qubits dentro de la topología del dispositivo. nUn buen ejemplo de ello es el complemento KMSSynthesisPermutation de síntesis por permutación, que puede sintetizar cualquier permutación de n qubits en profundidad. Por lo general, resulta difícil saber de antemano cuál de los dos enfoques —sintetizar circuitos para una conectividad «todos con todos» e insertar puertas SWAP, frente a sintetizar circuitos para una conectividad lineal e insertar menos puertas SWAP o ninguna— da lugar a un circuito final mejor, por lo que probablemente lo más sensato sea probar ambos y ver cuál ofrece mejores resultados. Por último, algunos complementos pueden estar destinados a un tipo de conexión concreto, por lo que deben ejecutarse una vez que se haya establecido el diseño. En este caso, el circuito sintetizado se adapta automáticamente a la topología del dispositivo. Un buen ejemplo de ello es el complemento TokenSwapperSynthesisPermutation de síntesis por permutación, que es capaz de sintetizar permutaciones arbitrarias con respecto a mapas de acoplamiento arbitrarios. Para obtener más información, consulta la descripción de cada complemento.
Para cada objeto de alto nivel, ofrecemos una tabla en la que se enumeran todos los complementos disponibles directamente en Qiskit. Incluimos el nombre del complemento, la clase del complemento, el mapa de conectividad al que va dirigido y, opcionalmente, información adicional. HLSConfigRecuerda que los complementos deben utilizarse mediante el método descrito anteriormente; por ejemplo:
HLSConfig(permutation=["kms"])crea una configuración de síntesis de alto nivel que utiliza el kms complemento para sintetizar PermutationGate objetos, es decir, aquellos con name = "permutation". En este caso, el nombre del complemento es «kms» y la clase del complemento es KMSSynthesisPermutation. Este algoritmo de síntesis concreto creó un circuito que se ajusta a la conectividad lineal de «vecino más cercano».
Complementos de síntesis de alto nivel
Síntesis de Clifford
Nombre de plugin | Clase de plugin | Conectividad específica | Descripción |
|---|---|---|---|
"ag" | AGSynthesisClifford | todo a todo | optimiza ávidamente el recuento de CX |
"bm" | BMSynthesisClifford | todo a todo | Número óptimo para ; utilizado en "default" |
"greedy" | GreedySynthesisClifford | todo a todo | Optimiza de forma agresiva el recuento de CX; se utiliza "default" en |
"layers" | LayerSynthesisClifford | todo a todo | |
"lnn" | LayerLnnSynthesisClifford | Lineal | muchas puertas CX, pero garantiza una profundidad CX de como máximo |
"default" | DefaultSynthesisClifford | todo a todo | suele ser la mejor opción para optimizar el recuento de CX (y el recuento óptimo de CX para ) |
Columna « 1 » | Columna « 2 » |
|---|---|
AGSynthesisClifford() | Plugin de síntesis Clifford basado en el método Aaronson-Gottesman. |
BMSynthesisClifford() | Plugin de síntesis Clifford basado en el método Bravyi-Maslov. |
GreedySynthesisClifford() | Plugin de síntesis Clifford basado en el método greedy synthesis Bravyi-Hu-Maslov-Shaydulin. |
LayerSynthesisClifford() | Plugin de síntesis de Clifford basado en el método Bravyi-Maslov para sintetizar Cliffords en capas. |
LayerLnnSynthesisClifford() | Plugin de síntesis Clifford basado en el método Bravyi-Maslov para sintetizar Cliffords en capas, con cada capa sintetizada adhiriéndose a la conectividad LNN. |
DefaultSynthesisClifford() | El plugin de síntesis clifford por defecto. |
Síntesis de funciones lineales
Nombre de plugin | Clase de plugin | Conectividad específica | Descripción |
|---|---|---|---|
"kms" | KMSSynthesisLinearFunction | Lineal | muchas puertas CX, pero garantiza una profundidad CX de como máximo |
"pmh" | PMHSynthesisLinearFunction | todo a todo | optimiza ávidamente CX-count; se utiliza en "default" |
"default" | DefaultSynthesisLinearFunction | todo a todo | lo mejor para optimizar CX-count |
Columna « 1 » | Columna « 2 » |
|---|---|
KMSSynthesisLinearFunction() | Plugin de síntesis de funciones lineales basado en el método Kutin-Moulton-Smithline. |
PMHSynthesisLinearFunction() | Plugin de síntesis de funciones lineales basado en el método Patel-Markov-Hayes. |
DefaultSynthesisLinearFunction() | El plugin de síntesis de funciones lineales por defecto. |
Síntesis por permutación
Nombre de plugin | Clase de plugin | Conectividad específica | Descripción |
|---|---|---|---|
"basic" | BasicSynthesisPermutation | todo a todo | sWAP-count óptimo; utilizado en "default" |
"acg" | ACGSynthesisPermutation | todo a todo | garantiza que la profundidad del SWAP no supere los |
"kms" | KMSSynthesisPermutation | Lineal | muchas puertas SWAP, pero garantiza una profundidad de SWAP de como máximo |
"token_swapper" | TokenSwapperSynthesisPermutation | cualquier | optimiza ávidamente el recuento SWAP para una conectividad arbitraria |
"default" | BasicSynthesisPermutation | todo a todo | lo mejor para optimizar el SWAP-count |
Columna « 1 » | Columna « 2 » |
|---|---|
BasicSynthesisPermutation() | El plugin de síntesis de permutaciones basado en la clasificación. |
ACGSynthesisPermutation() | El plugin de síntesis de permutación basado en el método de Alon, Chung, Graham. |
KMSSynthesisPermutation() | El plugin de síntesis de permutación basado en el método Kutin, Moulton, Smithline. |
TokenSwapperSynthesisPermutation() | El plugin de síntesis de permutaciones se basa en el algoritmo de intercambio de fichas. |
Síntesis QFT
Nombre de plugin | Clase de plugin | Conectividad específica |
|---|---|---|
"full" | QFTSynthesisFull | todo a todo |
"line" | QFTSynthesisLine | Lineal |
"default" | QFTSynthesisFull | todo a todo |
Columna « 1 » | Columna « 2 » |
|---|---|
QFTSynthesisFull() | Plugin de síntesis para puertas QFT que utilizan conectividad todo-a-todo. |
QFTSynthesisLine() | Plugin de síntesis para puertas QFT utilizando conectividad lineal. |
Síntesis MCX
En la siguiente tabla se enumeran los complementos de síntesis disponibles para una MCXGate puerta con k qubits de control. Si el número disponible de qubits auxiliares «limpios» o «sucios» no es suficiente, el método de síntesis correspondiente devolverá None.
Nombre de plugin | Clase de plugin | Número de ancillas limpias | Número de ancillas sucias | Descripción |
|---|---|---|---|---|
"gray_code" | MCXSynthesisGrayCode | 0 | 0 | un número exponencial de puertas CX; utilízalas únicamente para valores pequeños de |
"noaux_v24" | MCXSynthesisNoAuxV24 | número cuadrático de puertas CX | ||
"noaux_hp24" | MCXSynthesisNoAuxHP24 | número lineal de puertas CX; utilízalo en lugar de o "noaux_v24" "gray_code" para | ||
"n_clean_m15" | MCXSynthesisNCleanM15 | puertas CX como máximo | ||
"n_dirty_i15" | MCXSynthesisNDirtyI15 | puertas CX como máximo | ||
"2_clean_kg24" | MCXSynthesis2CleanKG24 | puertas CX como máximo | ||
"2_dirty_kg24" | MCXSynthesis2DirtyKG24 | 0 | 2 | puertas CX como máximo |
"1_clean_kg24" | MCXSynthesis1CleanKG24 | 1 | 0 | puertas CX como máximo |
"1_dirty_kg24" | MCXSynthesis1DirtyKG24 | puertas CX como máximo | ||
"1_clean_b95" | MCXSynthesis1CleanB95 | puertas CX como máximo | ||
"default" | MCXSynthesisDefault | cualquier | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
Columna « 1 » | Columna « 2 » |
|---|---|
MCXSynthesisGrayCode() | Plugin de síntesis para una puerta X multicontrolada basada en el código Gray. |
MCXSynthesisNoAuxV24() | Plugin de síntesis para una puerta X multicontrolada basado en la implementación para MCPhaseGate, que a su vez se basa en el artículo de Vale et al. (2024). |
MCXSynthesisNoAuxHP24() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Huang y Palsberg. |
MCXSynthesisNCleanM15() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Maslov (2016). |
MCXSynthesisNDirtyI15() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Iten et al. (2016). |
MCXSynthesis2CleanKG24() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Khattar y Gidney (2024). |
MCXSynthesis2DirtyKG24() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Khattar y Gidney (2024). |
MCXSynthesis1CleanKG24() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Khattar y Gidney (2024). |
MCXSynthesis1DirtyKG24() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Khattar y Gidney (2024). |
MCXSynthesis1CleanB95() | Plugin de síntesis para una puerta X multicontrolada basado en el artículo de Barenco et al. (1995). |
MCXSynthesisDefault() | El plugin de síntesis por defecto para una puerta X multicontrolada. |
Síntesis MCMT
Nombre de plugin | Clase de plugin | Número de ancillas limpias | Número de ancillas sucias | Descripción |
|---|---|---|---|---|
"vchain" | MCMTSynthesisVChain | utiliza un número lineal de puertas de Toffoli | ||
"noaux" | MCMTSynthesisNoAux | utiliza el mecanismo de control estándar de Qiskit | ||
"xgate" | MCMTSynthesisXGate | utiliza un número lineal de puertas de Toffoli | ||
"default" | MCMTSynthesisDefault | cualquier | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
Columna « 1 » | Columna « 2 » |
|---|---|
MCMTSynthesisVChain() | Síntesis basada en cadenas en V para MCMTGate. |
MCMTSynthesisNoAux() | Síntesis basada en cadenas en V para MCMTGate. |
MCMTSynthesisXGate() | Una síntesis para MCMTGate con la puerta X como puerta base. |
MCMTSynthesisDefault() | Una descomposición por defecto para las puertas MCMT. |
Comparadores de enteros
Nombre de plugin | Clase de plugin | Descripción | Qubits auxiliares |
|---|---|---|---|
"twos" | IntComparatorSynthesis2s | utilizar la adición con complemento a dos | limpio |
"noaux" | IntComparatorSynthesisNoAux | voltear el objetivo controlado en todos los valores enteros permitidos | ninguno |
"default" | IntComparatorSynthesisDefault | utilizar el mejor algoritmo en función de los qubits auxiliares disponibles | cualquier |
Columna « 1 » | Columna « 2 » |
|---|---|
IntComparatorSynthesis2s() | Una comparación de enteros basada en 2s complement. |
IntComparatorSynthesisNoAux() | Una comparación potencialmente exponencialmente cara sin qubits auxiliares. |
IntComparatorSynthesisDefault() | La síntesis por defecto para IntegerComparatorGate. |
Sumas
Nombre de plugin | Clase de plugin | Descripción | Qubits auxiliares |
|---|---|---|---|
"default" | WeightedSumSynthesisDefault | utilizar una síntesis basada en la cadena en V | dada una suma de qubits de tipo « », se han utilizado qubits auxiliares « » limpios |
Columna « 1 » | Columna « 2 » |
|---|---|
WeightedSumSynthesisDefault() | Sintetiza un WeightedSumGate utilizando el algoritmo de síntesis predeterminado. |
Síntesis de la evolución de Pauli
Nombre de plugin | Clase de plugin | Descripción | Conectividad específica |
|---|---|---|---|
"rustiq" | PauliEvolutionSynthesisRustiq | utilizar el método de síntesis de la biblioteca de síntesis de circuitos Rustiq | todo a todo |
"default" | PauliEvolutionSynthesisDefault | utilizan un término diagonalizador de Clifford por Pauli | todo a todo |
Columna « 1 » | Columna « 2 » |
|---|---|
PauliEvolutionSynthesisDefault() | Sintetiza un PauliEvolutionGate utilizando el algoritmo de síntesis predeterminado. |
PauliEvolutionSynthesisRustiq() | Sintetiza un PauliEvolutionGate utilizando Rustiq. |
Síntesis modular de sumadores
Nombre de plugin | Clase de plugin | Número de ancillas limpias | Descripción |
|---|---|---|---|
"modular_v17" | ModularAdderSynthesisV17 | un sumador modular sin qubits auxiliares | |
"ripple_cdkm" | ModularAdderSynthesisC04 | un sumador de rizado | |
"ripple_vbe" | ModularAdderSynthesisV95 | para -bit numbers | un sumador de rizado |
"qft" | ModularAdderSynthesisD00 | un sumador basado en QFT | |
"default" | ModularAdderSynthesisDefault | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
Columna « 1 » | Columna « 2 » |
|---|---|
ModularAdderSynthesisV17() | Sumador modular (módulo ) sin qubits auxiliares. |
ModularAdderSynthesisC04() | Sumador de rizado, módulo . |
ModularAdderSynthesisD00() | Sumador basado en QFT, módulo . |
ModularAdderSynthesisV95() | Sumador de rizado, módulo . |
ModularAdderSynthesisDefault() | La síntesis del sumador modular por defecto (sin carry in, sin carry out qubit). |
Síntesis del sumador de medio
Nombre de plugin | Clase de plugin | Número de ancillas limpias | Descripción |
|---|---|---|---|
"ripple_cdkm" | HalfAdderSynthesisC04 | un sumador de rizado | |
"ripple_r25" | HalfAdderSynthesisR25 | un sumador de rizado sin auxiliares | |
"ripple_vbe" | HalfAdderSynthesisV95 | para -bit numbers | un sumador de rizado |
"qft" | HalfAdderSynthesisD00 | un sumador basado en QFT | |
"default" | HalfAdderSynthesisDefault | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
Columna « 1 » | Columna « 2 » |
|---|---|
HalfAdderSynthesisC04() | Sumador de rizado con un bit de salida. |
HalfAdderSynthesisD00() | Sumador basado en QFT con un bit de entrada y otro de salida. |
HalfAdderSynthesisV95() | Sumador de rizado con un bit de salida. |
HalfAdderSynthesisR25() | Sumador de rizado con un bit de salida sin qubits auxiliares. |
HalfAdderSynthesisDefault() | La síntesis de media escalera por defecto (sin carry in, pero con un qubit carry out). |
Síntesis de sumador completo
Nombre de plugin | Clase de plugin | Número de ancillas limpias | Descripción |
|---|---|---|---|
"ripple_cdkm" | FullAdderSynthesisC04 | un sumador de rizado | |
"ripple_vbe" | FullAdderSynthesisV95 | para -bit numbers | un sumador de rizado |
"default" | FullAdderSynthesisDefault | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
Columna « 1 » | Columna « 2 » |
|---|---|
FullAdderSynthesisC04() | Sumador de rizado con un bit de entrada y otro de salida. |
FullAdderSynthesisV95() | Sumador de rizado con un bit de entrada y otro de salida. |
FullAdderSynthesisDefault() | Sumador de rizado con un bit de entrada y otro de salida. |
Síntesis multiplicadora
Nombre de plugin | Clase de plugin | Número de ancillas limpias | Descripción |
|---|---|---|---|
"cumulative" | MultiplierSynthesisH18 | en función del AdderGate utilizado | sumador acumulativo basado en sumadores controlados |
"qft" | MultiplierSynthesisR17 | un multiplicador basado en QFT | |
"default" | MultiplierSynthesisDefault | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
Columna « 1 » | Columna « 2 » |
|---|---|
MultiplierSynthesisH18() | Un multiplicador acumulativo basado en sumadores controlados. |
MultiplierSynthesisR17() | Un multiplicador basado en QFT. |
MultiplierSynthesisDefault() | El plugin multiplicador por defecto. |