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
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
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(op_nombre) | 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 plugin de síntesis unitaria hay 2 pasos principales. El primer paso es crear una subclase de la clase abstracta plugin: UnitarySynthesisPlugin. La clase plugin define la interfaz y el contrato para los plugins de síntesis unitaria. El método principal es run() que toma un único argumento posicional, una matriz unitaria como un array numpy, y se espera que devuelva un objeto DAGCircuit que representa el circuito sintetizado a partir de esa matriz unitaria. Entonces para informar al transpilador Qiskit sobre qué información es necesaria para el pase hay varios métodos de propiedades requeridas que necesitan ser implementados como supports_basis_gates y supports_coupling_map dependiendo de si el plugin soporta y/o requiere esa entrada para realizar la síntesis. Para más información, consulte la UnitarySynthesisPlugin para todos los campos obligatorios. Una clase de plugin de ejemplo sería algo así
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 alguna razón las entradas disponibles para el método run() son insuficientes, por favor, abra un problema y podemos discutir la ampliación de la interfaz del plugin con nuevas entradas opt-in que se pueden añadir de una manera compatible con versiones anteriores para futuras versiones. Tenga en cuenta, sin embargo, que la interfaz de este plugin se considera estable y se garantiza que no cambiará de forma brusca. Si es necesario realizar cambios (por ejemplo, para ampliar las opciones de entrada opcionales disponibles), se hará de forma que no sea necesario modificar los plugins 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 es exponer el UnitarySynthesisPlugin como punto de entrada de setuptools en los metadatos del paquete. Para ello, basta con añadir una tabla entry-points en pyproject.toml para el paquete de complementos con los puntos de entrada necesarios en el espacio de nombres qiskit.unitary_synthesis . 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 plugin de síntesis de alto nivel es conceptualmente similar a escribir un plugin de síntesis unitaria. El primer paso es crear una subclase de la clase abstracta plugin HighLevelSynthesisPluginque define la interfaz y el contrato para los plugins de síntesis de alto nivel. El método principal es run(). El argumento posicional high_level_object especifica el "objeto de nivel superior" que se va a sintetizar, que es cualquier objeto de tipo Operation (incluyendo, por ejemplo LinearFunction o Clifford). El argumento de palabra clave target especifica el backend de destino, permitiendo que el plugin acceda a toda la información específica del destino, como el mapa de acoplamiento, el conjunto de puertas soportado, etc. El argumento de palabra clave coupling_map sólo especifica el mapa de acoplamiento, y sólo se utiliza cuando no se especifica target . El argumento de palabra clave qubits especifica la lista de qubits sobre la que se define el objeto de nivel superior, en caso de que la síntesis se realice sobre 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 los que opera esta operación. Además, se pueden especificar opciones y ajustes específicos de los plugins a través de options, que es un diccionario de configuración de forma libre. 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. El método run() debe devolver un objeto QuantumCircuit que representa el circuito sintetizado a partir de ese objeto de nivel superior. También se permite devolver None que representa que el método de síntesis es incapaz de sintetizar el objeto de nivel superior dado. La síntesis real de objetos de nivel superior se realiza mediante HighLevelSynthesis paso del transpilador. Para más información, consulte la HighLevelSynthesisPlugin para todos los campos obligatorios. Una clase de plugin de ejemplo sería algo así
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 plugin para sintetizar objetos de tipo Clifford que tengan como máximo 3 qubits, utilizando el método synth_clifford_bm.
El segundo paso es exponer el HighLevelSynthesisPlugin como punto de entrada de setuptools en los metadatos del paquete. Esto se hace añadiendo una tabla entry-points en pyproject.toml para el paquete plugin con los puntos de entrada necesarios bajo el espacio de nombres qiskit.synthesis . Por ejemplo:
[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"La dirección name consta de dos partes separadas por un punto ".": el nombre del tipo de Operation al que se aplica el plugin de síntesis (clifford), y el nombre del plugin (special). No hay límite en el número de plugins que puede incluir un mismo paquete, siempre que cada plugin 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 plugins de síntesis unitaria instalados puede utilizar la función qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() función
Complementos de síntesis de alto nivel
Para utilizar un plugin de síntesis de alto nivel, primero hay que instanciar un archivo HLSConfig para almacenar los nombres de los plugins que se utilizarán para varios 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 plugin acg para sintetizar PermutationGate el plugin layers para sintetizar objetos Clifford y el plugin pmh para sintetizar objetos LinearFunction objetos. Los argumentos de las palabras clave son los Operation.name campos de los objetos correspondientes. Por ejemplo, todas las Clifford tienen el símbolo name clifford por lo que se utiliza como argumento de la palabra clave. Puede especificar aquí cualquier argumento de palabra clave que haya instalado plugins para manejar, incluyendo objetos de usuario personalizados si tiene plugins instalados para ellos. Consulte HLSConfig para más detalles sobre formatos alternativos para configurar los plugins 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, se pasa este objeto HLSConfig al argumento hls_config de transpile() o generate_preset_pass_manager() que utilizará los plugins especificados como parte del flujo de trabajo de compilación más amplio.
Para obtener una lista de los plugins de síntesis de alto nivel instalados para cualquier Operation.namepuede utilizar la función high_level_synthesis_plugin_names() pasando como argumento el name deseado:
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
AQCSynthesisPlugin() | Un plugin de síntesis unitaria Qiskit basado en AQC. |
Complemento de síntesis Solovay-Kitaev
SolovayKitaevSynthesis() | Un plugin de síntesis unitaria Solovay-Kitaev Qiskit. |
Complemento de síntesis Ross-Selinger
RossSelingerSynthesis() | Un complemento de síntesis unitaria Qiskit de Ross-Selinger. |
Complemento Clifford Unitary Synthesis
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 utilizado por la pasada UnitarySynthesis del transpilador para sintetizar puertas unitarias en el circuito. Su comportamiento depende del número de qubits en la unidad objetivo y la base objetivo.
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 de ángulos de Euler (véase
OneQubitEulerDecomposer). - Puertas de 2 qubits: descomposiciones 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 objetivo es Clifford+T, el complemento utiliza el algoritmo de Solovay-Kitaev (véase SolovayKitaevDecomposition) para aproximar unitarios de 1 qubit. Los ajustes utilizados para crear aproximaciones básicas son basis_gates=["h", "t", "tdg"], depth=12 y recursion_degree=5, y se eligieron empíricamente para equilibrar la calidad de la aproximación con el coste computacional. Para utilizar Solovay-Kitaev con parámetros personalizados, o para evitar volver a calcular aproximaciones para múltiples circuitos, puede invocar el SolovayKitaevSynthesis 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.
DefaultUnitarySynthesis() | El complemento de síntesis unitaria predeterminado. |
Síntesis de alto nivel
Los plugins de síntesis de alto nivel que están directamente disponibles en Qiskit incluyen plugins para sintetizar Clifford objetos, LinearFunction objetos, y PermutationGate objetos. Algunos de estos plugins apuntan implícitamente a la conectividad omnicanal. No se trata de una limitación práctica, ya que HighLevelSynthesis normalmente se ejecuta antes del diseño y el enrutamiento, lo que garantizará que el circuito final se adhiere a la conectividad del dispositivo mediante la inserción de puertas SWAP adicionales. Un buen ejemplo es el complemento de síntesis de permutaciones ACGSynthesisPermutation , que puede sintetizar cualquier permutación con un máximo de 2 capas de puertas SWAP. Por otra parte, algunos plugins apuntan implícitamente a la conectividad lineal. Típicamente, los circuitos sintetizadores tienen mayor profundidad y número de puertas, sin embargo no se insertarían puertas SWAP adicionales si en el siguiente pase de diseño se eligiera una línea consecutiva de qubits dentro de la topología del dispositivo. Un buen ejemplo de ello es el complemento de síntesis de permutaciones KMSSynthesisPermutation , que puede sintetizar cualquier permutación de n qubits en profundidad n. Normalmente, es difícil saber de antemano cuál de los dos enfoques: sintetizar circuitos para conectividad todo a todo e insertar puertas SWAP frente a sintetizar circuitos para conectividad lineal e insertar menos o ninguna puerta SWAP conduce a un circuito final mejor, por lo que probablemente tenga sentido probar ambos y ver cuál da mejores resultados. Por último, algunos plugins pueden tener como objetivo una determinada conectividad y, por tanto, deben ejecutarse después de establecer la distribución. En este caso, el circuito sintetizado se ajusta automáticamente a la topología del dispositivo. Un buen ejemplo de ello es el complemento de síntesis de permutaciones TokenSwapperSynthesisPermutation , capaz de sintetizar permutaciones arbitrarias con respecto a mapas de acoplamiento arbitrarios. Para más detalles, consulte la descripción de cada plugin.
Para cada objeto de alto nivel damos una tabla que enumera todos sus plugins disponibles directamente en Qiskit. Incluimos el nombre del plugin, la clase del plugin, el mapa de conectividad objetivo y, opcionalmente, información adicional. Recordemos que los plugins deben ser utilizados a través de la descrita anteriormente HLSConfigpor ejemplo:
HLSConfig(permutation=["kms"])crea una configuración de síntesis de alto nivel que utiliza el plugin kms para sintetizar PermutationGate es decir, los que tienen name = "permutation". En este caso, el nombre del plugin es "kms", la clase del plugin es KMSSynthesisPermutation. Este algoritmo de síntesis en particular creó un circuito que se adhiere 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 | recuento óptimo para n=2,3; utilizado en "default" para n=2,3 |
"greedy" | GreedySynthesisClifford | todo a todo | optimiza ávidamente el recuento de CX; se utiliza en "default" para n>=4 |
"layers" | LayerSynthesisClifford | todo a todo | |
"lnn" | LayerLnnSynthesisClifford | Lineal | muchas puertas CX pero garantiza una profundidad CX de como máximo 7*n+2 |
"default" | DefaultSynthesisClifford | todo a todo | normalmente lo mejor para optimizar el recuento de CX (y el recuento óptimo de CX para n=2,3 ) |
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 5*n |
"pmh" | PMHSynthesisLinearFunction | todo a todo | optimiza ávidamente CX-count; se utiliza en "default" |
"default" | DefaultSynthesisLinearFunction | todo a todo | lo mejor para optimizar CX-count |
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 una profundidad SWAP de 2 como máximo |
"kms" | KMSSynthesisPermutation | Lineal | muchas puertas SWAP, pero garantiza una profundidad SWAP de como máximo n |
"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 |
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 |
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
La siguiente tabla enumera los plugins de síntesis disponibles para una MCXGate con k qubits de control. Si el número disponible de qubits auxiliares limpios/sucios no es suficiente, el método de síntesis correspondiente devolverá Ninguno.
Nombre de plugin | Clase de plugin | Número de ancillas limpias | Número de ancillas sucias | Descripción |
|---|---|---|---|---|
"gray_code" | MCXSynthesisGrayCode | 0 | 0 | exponencialmente muchas puertas CX; utilizar sólo para valores pequeños de k |
"noaux_v24" | MCXSynthesisNoAuxV24 | 0 | 0 | número cuadrático de puertas CX |
"noaux_hp24" | MCXSynthesisNoAuxHP24 | 0 | 0 | número lineal de puertas CX; utilizar en lugar de "noaux_v24" o "gray_code" para k>5 |
"n_clean_m15" | MCXSynthesisNCleanM15 | k-2 | 0 | como máximo 6*k-6 puertas CX |
"n_dirty_i15" | MCXSynthesisNDirtyI15 | 0 | k-2 | como máximo 8*k-6 puertas CX |
"2_clean_kg24" | MCXSynthesis2CleanKG24 | 2 | 0 | como máximo 6*k-6 puertas CX |
"2_dirty_kg24" | MCXSynthesis2DirtyKG24 | 0 | 2 | como máximo 12*k-18 puertas CX |
"1_clean_kg24" | MCXSynthesis1CleanKG24 | 1 | 0 | como máximo 6*k-6 puertas CX |
"1_dirty_kg24" | MCXSynthesis1DirtyKG24 | 0 | 1 | como máximo 12*k-18 puertas CX |
"1_clean_b95" | MCXSynthesis1CleanB95 | 1 | 0 | como máximo 16*k-8 puertas CX |
"default" | MCXSynthesisDefault | cualquier | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
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 | k-1 | 0 | utiliza un número lineal de puertas de Toffoli |
"noaux" | MCMTSynthesisNoAux | 0 | 0 | utiliza el mecanismo de control estándar de Qiskit |
"xgate" | MCMTSynthesisXGate | 0 | 0 | utiliza un número lineal de puertas de Toffoli |
"default" | MCMTSynthesisDefault | cualquier | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
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 | n - 1 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 |
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 | dado s suma qubits, usado s - 1 + int(s > 2) limpia qubits auxiliares |
WeightedSumSynthesisDefault() | Sintetiza un WeightedSumGate utilizando el algoritmo de síntesis por defecto. |
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 |
PauliEvolutionSynthesisDefault() | Sintetiza un PauliEvolutionGate utilizando el algoritmo de síntesis por defecto. |
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 | 0 | un sumador modular sin qubits auxiliares |
"ripple_cdkm" | ModularAdderSynthesisC04 | 1 | un sumador de rizado |
"ripple_vbe" | ModularAdderSynthesisV95 | para -bit numbers | un sumador de rizado |
"qft" | ModularAdderSynthesisD00 | 0 | un sumador basado en QFT |
"default" | ModularAdderSynthesisDefault | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
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 | 1 | un sumador de rizado |
"ripple_r25" | HalfAdderSynthesisR25 | 0 | un sumador de rizado sin auxiliares |
"ripple_vbe" | HalfAdderSynthesisV95 | para -bit numbers | un sumador de rizado |
"qft" | HalfAdderSynthesisD00 | 0 | un sumador basado en QFT |
"default" | HalfAdderSynthesisDefault | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
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 | 0 | 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 |
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 | 0 | un multiplicador basado en QFT |
"default" | MultiplierSynthesisDefault | cualquier | elige el mejor algoritmo en función de las ancillas disponibles |
MultiplierSynthesisH18() | Un multiplicador acumulativo basado en sumadores controlados. |
MultiplierSynthesisR17() | Un multiplicador basado en QFT. |
MultiplierSynthesisDefault() | El plugin multiplicador por defecto. |