Skip to main content
IBM Quantum Platform

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_circuit

Si, 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.

Nota

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 None

El 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:

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"AGSynthesisCliffordtodo a todooptimiza ávidamente el recuento de CX
"bm"BMSynthesisCliffordtodo a todoNúmero óptimo para n{2,3}n \in \{2,3\}; utilizado en "default" n{2,3}n \in \{2,3\}
"greedy"GreedySynthesisCliffordtodo a todoOptimiza de forma agresiva el recuento de CX; se utiliza "default" en n4n\geq 4
"layers"LayerSynthesisCliffordtodo a todo
"lnn"LayerLnnSynthesisCliffordLinealmuchas puertas CX, pero garantiza una profundidad CX de como máximo 7n+27n+2
"default"DefaultSynthesisCliffordtodo a todosuele ser la mejor opción para optimizar el recuento de CX (y el recuento óptimo de CX para n{2,3}n \in \{2,3\} )
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"KMSSynthesisLinearFunctionLinealmuchas puertas CX, pero garantiza una profundidad CX de como máximo 5n5n
"pmh"PMHSynthesisLinearFunctiontodo a todooptimiza ávidamente CX-count; se utiliza en "default"
"default"DefaultSynthesisLinearFunctiontodo a todolo 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"BasicSynthesisPermutationtodo a todosWAP-count óptimo; utilizado en "default"
"acg"ACGSynthesisPermutationtodo a todogarantiza que la profundidad del SWAP no supere los 22
"kms"KMSSynthesisPermutationLinealmuchas puertas SWAP, pero garantiza una profundidad de SWAP de como máximo nn
"token_swapper"TokenSwapperSynthesisPermutationcualquieroptimiza ávidamente el recuento SWAP para una conectividad arbitraria
"default"BasicSynthesisPermutationtodo a todolo 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"QFTSynthesisFulltodo a todo
"line"QFTSynthesisLineLineal
"default"QFTSynthesisFulltodo 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"MCXSynthesisGrayCode00un número exponencial de puertas CX; utilízalas únicamente para valores pequeños de kk
"noaux_v24"MCXSynthesisNoAuxV240000número cuadrático de puertas CX
"noaux_hp24"MCXSynthesisNoAuxHP240000número lineal de puertas CX; utilízalo en lugar de o "noaux_v24" "gray_code" para k>5k>5
"n_clean_m15"MCXSynthesisNCleanM15k2k-2006k66k-6 puertas CX como máximo
"n_dirty_i15"MCXSynthesisNDirtyI1500k2k-28k68k-6 puertas CX como máximo
"2_clean_kg24"MCXSynthesis2CleanKG2422006k66k-6 puertas CX como máximo
"2_dirty_kg24"MCXSynthesis2DirtyKG240212k1812k-18 puertas CX como máximo
"1_clean_kg24"MCXSynthesis1CleanKG24106k66k-6 puertas CX como máximo
"1_dirty_kg24"MCXSynthesis1DirtyKG24001112k1812k-18 puertas CX como máximo
"1_clean_b95"MCXSynthesis1CleanB95110016k816k-8 puertas CX como máximo
"default"MCXSynthesisDefaultcualquiercualquierelige 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"MCMTSynthesisVChaink1k-100utiliza un número lineal de puertas de Toffoli
"noaux"MCMTSynthesisNoAux0000utiliza el mecanismo de control estándar de Qiskit
"xgate"MCMTSynthesisXGate0000utiliza un número lineal de puertas de Toffoli
"default"MCMTSynthesisDefaultcualquiercualquierelige 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"IntComparatorSynthesis2sutilizar la adición con complemento a dosn1n - 1 limpio
"noaux"IntComparatorSynthesisNoAuxvoltear el objetivo controlado en todos los O(2l)O(2^l) valores enteros permitidosninguno
"default"IntComparatorSynthesisDefaultutilizar el mejor algoritmo en función de los qubits auxiliares disponiblescualquier
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"WeightedSumSynthesisDefaultutilizar una síntesis basada en la cadena en Vdada una suma de qubits de tipo « ss », se han utilizado qubits auxiliares « s1s2s - 1_{s \leq 2} » 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"PauliEvolutionSynthesisRustiqutilizar el método de síntesis de la biblioteca de síntesis de circuitos Rustiqtodo a todo
"default"PauliEvolutionSynthesisDefaultutilizan un término diagonalizador de Clifford por Paulitodo 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"ModularAdderSynthesisV1700un sumador modular sin qubits auxiliares
"ripple_cdkm"ModularAdderSynthesisC0411un sumador de rizado
"ripple_vbe"ModularAdderSynthesisV95n1n-1 para nn -bit numbersun sumador de rizado
"qft"ModularAdderSynthesisD0000un sumador basado en QFT
"default"ModularAdderSynthesisDefaultcualquierelige el mejor algoritmo en función de las ancillas disponibles
Columna « 1 »
Columna « 2 »
ModularAdderSynthesisV17()Sumador modular (módulo 2n2^n ) sin qubits auxiliares.
ModularAdderSynthesisC04()Sumador de rizado, módulo 2n2^n.
ModularAdderSynthesisD00()Sumador basado en QFT, módulo 2n2^n.
ModularAdderSynthesisV95()Sumador de rizado, módulo 2n2^n.
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"HalfAdderSynthesisC0411un sumador de rizado
"ripple_r25"HalfAdderSynthesisR2500un sumador de rizado sin auxiliares
"ripple_vbe"HalfAdderSynthesisV95n1n-1 para nn -bit numbersun sumador de rizado
"qft"HalfAdderSynthesisD0000un sumador basado en QFT
"default"HalfAdderSynthesisDefaultcualquierelige 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"FullAdderSynthesisC0400un sumador de rizado
"ripple_vbe"FullAdderSynthesisV95n1n-1 para nn -bit numbersun sumador de rizado
"default"FullAdderSynthesisDefaultcualquierelige 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"MultiplierSynthesisH18en función del AdderGate utilizadosumador acumulativo basado en sumadores controlados
"qft"MultiplierSynthesisR1700un multiplicador basado en QFT
"default"MultiplierSynthesisDefaultcualquierelige 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.
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.