Skip to main content
IBM Quantum Platform

Plugins de synthèse

qiskit.transpiler.passes.synthesis.plugin

Ce module définit les interfaces des plugins pour les passes du transpilateur de synthèse dans Qiskit. Ceux-ci fournissent un point d'accroche pour les paquets python externes afin d'implémenter leurs propres techniques de synthèse et de les exposer de manière transparente en tant qu'options opt-in pour les utilisateurs lorsqu'ils lancent le programme transpile().

Les interfaces des plugins sont construites à l'aide de points d'entrée setuptools qui permettent aux paquets externes à qiskit d'annoncer qu'ils incluent un plugin de synthèse.

Voir qiskit.transpiler.preset_passmanagers.plugin pour plus de détails sur la façon d'écrire des plugins pour les étapes du transpilateur.


API du plugin Synthesis

API du plugin de synthèse unitaire

UnitarySynthesisPlugin()Classe de plugin de synthèse unitaire abstraite
UnitarySynthesisPluginManager()Classe de gestion du plugin de synthèse unitaire
unitary_synthesis_plugin_names()Renvoi d'une liste de noms de plugins de synthèse unitaire installés

API du plugin de synthèse de haut niveau

HighLevelSynthesisPlugin()Classe abstraite de plugin de synthèse de haut niveau.
HighLevelSynthesisPluginManager()Classe de suivi des plugins de synthèse de haut niveau installés.
high_level_synthesis_plugin_names(op_name)Retourne une liste de noms de plugins installés pour un nom d'objet de haut niveau donné

Écriture de plugins

Plugins de synthèse unitaire

Pour écrire un plugin de synthèse unitaire, il y a deux étapes principales. La première étape consiste à créer une sous-classe de la classe abstraite du plugin : UnitarySynthesisPlugin. La classe de plugin définit l'interface et le contrat des plugins de synthèse unitaire. La méthode principale est run() qui prend un seul argument de position, une matrice unitaire sous forme de tableau NumPy, et qui doit renvoyer un DAGCircuit objet représentant le circuit synthétisé à partir de cette matrice unitaire. Ensuite, pour indiquer au transpileur Qiskit quelles informations sont nécessaires pour cette passe, il faut implémenter plusieurs méthodes de propriété obligatoires, telles que supports_basis_gates et supports_coupling_map , selon que le plugin prend en charge et/ou nécessite cette entrée pour effectuer la synthèse. Pour plus de détails, consultez la UnitarySynthesisPlugin documentation concernant tous les champs obligatoires. Voici à quoi pourrait ressembler une classe de plugin :

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, pour une raison quelconque, les paramètres disponibles pour cette run() méthode s'avéraient insuffisants, merci de créer un ticket afin que nous puissions discuter de l'extension de l'interface du plugin avec de nouveaux paramètres optionnels, qui pourraient être ajoutés de manière rétrocompatible pour les prochaines versions. Notez toutefois que l'interface de ce plugin est considérée comme stable et qu'il est garanti qu'elle ne subira aucune modification susceptible de causer des incompatibilités. Si des modifications s'avèrent nécessaires (par exemple pour élargir la gamme d'options de saisie disponibles), celles-ci seront apportées de manière à ne pas nécessiter de modifications des plugins existants.

Remarque

Toutes les méthodes préfixées par supports_ sont réservées à une classe dérivée UnitarySynthesisPlugin pour une partie de l'interface. Vous ne devez pas définir de méthodes supports_* personnalisées sur une sous-classe qui ne sont pas définies dans la classe abstraite.

La deuxième étape consiste à définir le UnitarySynthesisPlugin comme point d'entrée setuptools dans les métadonnées du paquet. Pour ce faire, il suffit d'ajouter une entry-points table dans pyproject.toml le paquet du plugin, contenant les points d'entrée nécessaires sous l'espace qiskit.unitary_synthesis de noms. Par exemple :

[project.entry-points."qiskit.unitary_synthesis"]
"special" = "qiskit_plugin_pkg.module.plugin:SpecialUnitarySynthesis"

Il n'y a pas de limite au nombre de plugins qu'un seul paquet peut inclure, tant que chaque plugin a un nom unique. Ainsi, un seul paquet peut exposer plusieurs plugins si nécessaire. Le nom default est utilisé par Qiskit lui-même et ne peut pas être utilisé dans un plugin.

Configuration du plugin de synthèse unitaire

Pour certains plugins de synthèse unitaire qui exposent plusieurs options et paramètres, l'interface du plugin comporte une option permettant aux utilisateurs de fournir un dictionnaire de configuration de forme libre. Il sera transmis à la méthode run() en tant que kwarg options . Si votre plugin dispose de ces options de configuration, vous devez clairement documenter la manière dont l'utilisateur doit spécifier ces options de configuration et la manière dont elles sont utilisées, puisqu'il s'agit d'un champ de type "free form".

Plugins de synthèse de haut niveau

La création d'un plugin de synthèse de haut niveau est, d'un point de vue conceptuel, similaire à celle d'un plugin de synthèse unitaire. La première étape consiste à créer une sous-classe de la classe abstraite de plugin : HighLevelSynthesisPlugin, qui définit l'interface et le contrat des plugins de synthèse de haut niveau. La méthode principale est run(). L'argument high_level_object de position spécifie l'« objet de niveau supérieur » à synthétiser, qui peut être n'importe quel objet de type Operation (y compris, par exemple, LinearFunction ou Clifford). L'argument target « keyword » spécifie le backend cible, ce qui permet au plugin d'accéder à toutes les informations spécifiques à cette cible, telles que la carte de couplage, l'ensemble de portes prises en charge, etc. L'argument coupling_map « keyword » ne sert qu'à définir la carte de couplage et n'est utilisé que lorsque target n'est pas spécifié. L'argument qubits « keyword » spécifie la liste des qubits sur lesquels l'objet de niveau supérieur est défini, dans le cas où la synthèse est effectuée sur le circuit physique. La valeur de None indique que la configuration n'a pas encore été choisie et que les qubits physiques de la carte cible ou de la carte de couplage sur laquelle porte cette opération n'ont pas encore été déterminés. De plus, les options et paramètres spécifiques aux plugins peuvent être définis via options, qui est un dictionnaire de configuration au format libre. Si votre plugin dispose de ces options de configuration, vous devriez indiquer clairement comment l'utilisateur doit les définir et comment elles sont utilisées, car il s'agit d'un champ libre. La méthode run() est censée renvoyer un QuantumCircuit objet représentant le circuit synthétisé à partir de cet objet de niveau supérieur. Il est également possible de renvoyer None une valeur indiquant que la méthode de synthèse n'est pas en mesure de synthétiser l'objet de niveau supérieur donné. La synthèse proprement dite des objets de niveau supérieur est effectuée par HighLevelSynthesis le passage du transpileur. Pour plus de détails, consultez la HighLevelSynthesisPlugin documentation concernant tous les champs obligatoires. Voici à quoi pourrait ressembler une classe de plugin :

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

L'exemple ci-dessus crée un plugin permettant de synthétiser des objets de type Clifford comportant au plus 3 qubits, à l'aide de la méthode synth_clifford_bm.

La deuxième étape consiste à définir le HighLevelSynthesisPlugin comme point d'entrée setuptools dans les métadonnées du paquet. Pour ce faire, il suffit d'ajouter une entry-points table dans pyproject.toml pour le paquet du plugin, contenant les points d'entrée nécessaires sous l'espace qiskit.synthesis de noms. Par exemple :

[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"

Le name se compose de deux parties séparées par un point «. » : le nom du type auquel s'applique le plugin de Operation synthèse (clifford), et le nom du plugin (special). Il n'y a pas de limite au nombre de plugins qu'un même paquet peut inclure, à condition que chaque plugin porte un nom unique.


Utilisation des plugins

Plugins de synthèse unitaire

Pour utiliser un plugin, il suffit d'installer le paquet qui inclut un plugin de synthèse. Qiskit découvrira alors automatiquement les plugins installés et les exposera en tant qu'options valides pour les constructeurs transpile() kwargs et constructeurs de passe appropriés. S'il y a des plugins installés qui ne peuvent pas être chargés/importés, cela sera consigné dans Python logging.

Pour obtenir la liste des plugins de synthèse unitaire installés, vous pouvez utiliser la qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() fonction.

Plugins de synthèse de haut niveau

Pour utiliser un plugin de synthèse de haut niveau, vous devez d'abord instancier un HLSConfig afin d'y stocker les noms des plugins à utiliser pour divers objets de haut niveau. Par exemple :

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

crée une configuration de synthèse de haut niveau qui utilise le acg plug-in pour la synthèse PermutationGate des objets, le layers plug-in pour la synthèse Clifford des objets et le pmh plug-in pour la synthèse LinearFunction des objets. Les arguments par mot-clé correspondent aux Operation.name champs des objets concernés. Par exemple, toutes Clifford les opérations possèdent le nameclifford , qui est donc utilisé comme argument-clé. Vous pouvez spécifier ici n'importe quel argument-clé pris en charge par les plugins que vous avez installés, y compris les objets utilisateur personnalisés si vous avez installé des plugins les prenant en charge. Consultez HLSConfig cette page pour plus de détails sur les autres formats permettant de configurer les plugins au sein de chaque argument.

Pour chaque objet de haut niveau, la liste des plugins donnés est essayée en séquence jusqu'à ce que l'un d'entre eux réussisse (dans l'exemple ci-dessus, chaque liste ne contient qu'un seul plugin). En plus de spécifier un plugin par son nom, vous pouvez transmettre un tuple (name, options) , où le deuxième élément du tuple est un dictionnaire contenant des options pour le plugin.

Une fois créé, vous transmettez cet HLSConfig objet à l'argument hls_config de transpile() ou generate_preset_pass_manager() , qui utilisera les plugins spécifiés dans le cadre du processus de compilation global.

Operation.namePour obtenir la liste des plugins de synthèse de haut niveau installés pour un système donné, vous pouvez utiliser la high_level_synthesis_plugin_names() fonction, en lui passant le système souhaité name en argument :

high_level_synthesis_plugin_names("clifford")

renvoie une liste de tous les plugins de synthèse Clifford installés.


Plug-in disponibles

Vous trouverez ci-dessous les classes de plugins de synthèse disponibles dans Qiskit. Ces classes ne doivent pas être utilisées directement, mais plutôt par l'intermédiaire de l'interface du plugin décrite ci-dessus. Les classes sont listées ici pour faciliter la recherche de la documentation pour chacun des plugins inclus et pour faciliter la comparaison entre les différentes méthodes de synthèse pour un objet donné.

Plugins de synthèse unitaire

Plugin de synthèse AQC

AQCSynthesisPlugin()Un plugin de synthèse unitaire Qiskit basé sur l'AQC.

Plugin de synthèse Solovay-Kitaev

SolovayKitaevSynthesis()Un plugin de synthèse unitaire Solovay-Kitaev Qiskit.

Plugin de synthèse Ross-Selinger

RossSelingerSynthesis()Un plugin de synthèse unitaire Ross-Selinger Qiskit.

Plugin Clifford Unitary Synthesis

CliffordUnitarySynthesis()Un plugin de synthèse unitaire Clifford.

Plugin de synthèse unitaire par défaut

Le plugin de synthèse unitaire par défaut définit l'algorithme par défaut utilisé par UnitarySynthesis le passage du transpileur pour synthétiser les portes unitaires du circuit. Son comportement dépend du nombre de qubits dans l'opérateur unitaire cible et de la base cible.

Ensembles de bases continus

Lorsque la base cible est continue (c'est-à-dire autre que Clifford+T), le plugin utilise les décompositions suivantes :

Pour les portes à 1 et 2 qubits, le plugin utilise les informations d'erreur de base provenant de la cible pour sélectionner la décomposition qui maximise la fidélité attendue.

Ensembles de bases Clifford+T

Lorsque la base cible est Clifford+T, le plugin utilise l'algorithme de Solovay-Kitaev (voir SolovayKitaevDecomposition) pour approximer les opérateurs unitaires à 1 qubit. Les paramètres utilisés pour créer des approximations de base sont basis_gates=["h", "t", "tdg"], depth=12 et recursion_degree=5, et ont été choisis de manière empirique afin de trouver un juste équilibre entre la qualité de l'approximation et le coût de calcul. Pour utiliser Solovay-Kitaev avec des paramètres personnalisés, ou pour éviter de recalculer les approximations pour plusieurs circuits, vous pouvez utiliser SolovayKitaevSynthesis le plugin de synthèse unitaire à la place de ce plugin par défaut.

À l'heure actuelle, Qiskit ne comprend pas d'algorithmes permettant d'approximer directement les unitaires à 2 qubits ou plus dans le jeu de bases Clifford+T. Par conséquent, le gestionnaire de passes prédéfinies décompose d'abord ces portes en ["cx", "u"] base, puis applique Solovay-Kitaev aux portes unitaires à 1 qubit qui en résultent.

DefaultUnitarySynthesis()Le plugin de synthèse unitaire par défaut.

Synthèse de haut niveau

Parmi les plugins de synthèse de haut niveau directement disponibles dans Qiskit, on trouve des plugins permettant de synthétiser Clifford des objets, LinearFunction des objets et PermutationGate des objets. Certains de ces plugins visent implicitement une connectivité « tous-à-tous ». Il ne s'agit pas d'une contrainte pratique, car HighLevelSynthesis cette étape s'exécute généralement avant la mise en page et le routage, ce qui garantit que le circuit final respecte la connectivité du dispositif grâce à l'insertion de portes SWAP supplémentaires. Un bon exemple est le plug-in ACGSynthesisPermutation de synthèse par permutation, qui permet de synthétiser n'importe quelle permutation à l'aide de deux couches de portes SWAP au maximum. En revanche, certains plugins visent implicitement une connectivité linéaire. En règle générale, les circuits de synthèse présentent une profondeur et un nombre de portes plus importants; toutefois, aucune porte SWAP supplémentaire ne serait insérée si, lors de la passe de disposition suivante, une ligne consécutive de qubits était choisie au sein de la topologie du dispositif. nUn bon exemple en est le plugin KMSSynthesisPermutation de synthèse par permutation, qui permet de synthétiser n'importe quelle permutation de n qubits en profondeur. En règle générale, il est difficile de savoir à l'avance laquelle des deux approches — synthétiser des circuits pour une connectivité « tous-à-tous » et insérer des portes SWAP, ou bien synthétiser des circuits pour une connectivité linéaire et insérer moins de portes SWAP, voire aucune — permet d'obtenir un meilleur circuit final; il est donc probablement judicieux d'essayer les deux et de voir laquelle donne de meilleurs résultats. Enfin, certains plugins peuvent cibler un type de connexion spécifique et doivent donc être exécutés une fois la mise en page définie. Dans ce cas, le circuit synthétisé s'adapte automatiquement à la topologie du dispositif. Un bon exemple en est le plugin TokenSwapperSynthesisPermutation de synthèse par permutation, qui permet de synthétiser des permutations arbitraires par rapport à des applications de couplage arbitraires. Pour plus de détails, veuillez consulter la description de chaque plugin.

Pour chaque objet de haut niveau, nous fournissons un tableau répertoriant tous ses plugins disponibles directement dans Qiskit. Nous indiquons le nom du plugin, sa classe, la carte de connectivité ciblée et, éventuellement, des informations supplémentaires. HLSConfigRappelons que les plugins doivent être utilisés via la méthode décrite précédemment, par exemple :

HLSConfig(permutation=["kms"])

crée une configuration de synthèse de haut niveau qui utilise le kms plugin pour synthétiser PermutationGate les objets – c'est-à-dire ceux dont le nom se termine par name = "permutation". Dans ce cas, le nom du plugin est « kms », et la classe du plugin est KMSSynthesisPermutation. Cet algorithme de synthèse particulier a permis de créer un circuit respectant la connectivité linéaire « plus proche voisin ».

Plugins de synthèse de haut niveau

Synthèse de Clifford
Nom du plug-in
Classe de plug-in
Connectivité ciblée
Description
"ag"AGSynthesisCliffordtout-à-toutoptimise avec avidité le CX-count
"bm"BMSynthesisCliffordtout-à-toutnombre optimal pour n{2,3}n \in \{2,3\}; utilisé dans "default" pour n{2,3}n \in \{2,3\}
"greedy"GreedySynthesisCliffordtout-à-toutoptimise de manière intensive le nombre de CX; utilisé dans "default" pour n4n\geq 4
"layers"LayerSynthesisCliffordtout-à-tout
"lnn"LayerLnnSynthesisCliffordLinéairede nombreuses portes CX, mais garantit une profondeur CX d'au plus 7n+27n+2
"default"DefaultSynthesisCliffordtout-à-toutc'est généralement la meilleure solution pour optimiser le nombre de CX (et obtenir un nombre de CX optimal pour n{2,3}n \in \{2,3\} )
AGSynthesisClifford()Plugin de synthèse de Clifford basé sur la méthode Aaronson-Gottesman.
BMSynthesisClifford()Plugin de synthèse de Clifford basé sur la méthode Bravyi-Maslov.
GreedySynthesisClifford()Plugin de synthèse de Clifford basé sur la méthode de synthèse avide Bravyi-Hu-Maslov-Shaydulin.
LayerSynthesisClifford()Le plugin de synthèse de Clifford est basé sur la méthode Bravyi-Maslov pour synthétiser les Cliffords en couches.
LayerLnnSynthesisClifford()Le plugin de synthèse de Clifford est basé sur la méthode Bravyi-Maslov pour synthétiser les Cliffords en couches, chaque couche synthétisée adhérant à la connectivité LNN.
DefaultSynthesisClifford()Le plugin de synthèse Clifford par défaut.
Synthèse de fonctions linéaires
Nom du plug-in
Classe de plug-in
Connectivité ciblée
Description
"kms"KMSSynthesisLinearFunctionLinéairede nombreuses portes CX, mais garantit une profondeur CX d'au plus 5n5n
"pmh"PMHSynthesisLinearFunctiontout-à-toutoptimise avec avidité le CX-count; utilisé dans "default"
"default"DefaultSynthesisLinearFunctiontout-à-toutle meilleur pour optimiser le CX-count
KMSSynthesisLinearFunction()Plugin de synthèse de fonctions linéaires basé sur la méthode Kutin-Moulton-Smithline.
PMHSynthesisLinearFunction()Plugin de synthèse de fonctions linéaires basé sur la méthode Patel-Markov-Hayes.
DefaultSynthesisLinearFunction()Le plugin de synthèse de fonctions linéaires par défaut.
Synthèse par permutation
Nom du plug-in
Classe de plug-in
Connectivité ciblée
Description
"basic"BasicSynthesisPermutationtout-à-toutcomptage SWAP optimal; utilisé dans "default"
"acg"ACGSynthesisPermutationtout-à-toutgarantit une profondeur de swap ne dépassant pas 22
"kms"KMSSynthesisPermutationLinéairede nombreux SWAP-gates, mais garantit une profondeur de SWAP ne dépassant pas nn
"token_swapper"TokenSwapperSynthesisPermutationtoutesoptimise avec avidité le nombre de SWAP pour une connectivité arbitraire
"default"BasicSynthesisPermutationtout-à-toutle meilleur pour optimiser le décompte SWAP
BasicSynthesisPermutation()Le plugin de synthèse des permutations est basé sur le tri.
ACGSynthesisPermutation()Le plugin de synthèse par permutation est basé sur la méthode Alon, Chung, Graham.
KMSSynthesisPermutation()Le plugin de synthèse des permutations est basé sur la méthode Kutin, Moulton, Smithline.
TokenSwapperSynthesisPermutation()Le plugin de synthèse des permutations est basé sur l'algorithme de permutation des jetons.
Synthèse QFT
Nom du plug-in
Classe de plug-in
Connectivité ciblée
"full"QFTSynthesisFulltout-à-tout
"line"QFTSynthesisLineLinéaire
"default"QFTSynthesisFulltout-à-tout
QFTSynthesisFull()Plugin de synthèse pour les portes QFT utilisant la connectivité tout-à-tout.
QFTSynthesisLine()Plugin de synthèse pour les portes QFT utilisant la connectivité linéaire.
Synthèse MCX

Le tableau suivant répertorie les plugins de synthèse disponibles pour une MCXGate porte comportant k qubits de contrôle. Si le nombre disponible de qubits auxiliaires « propres » ou « sales » n'est pas suffisant, la méthode de synthèse correspondante renverra « None ».

Nom du plug-in
Classe de plug-in
Nombre d'ancillas propres
Nombre d'ancillas sales
Description
"gray_code"MCXSynthesisGrayCode00un nombre exponentiel de portes CX; à n'utiliser que pour de petites valeurs d' kk
"noaux_v24"MCXSynthesisNoAuxV240000nombre quadratique de portes CX
"noaux_hp24"MCXSynthesisNoAuxHP240000nombre linéaire de portes CX; à utiliser à la place de ou "noaux_v24" pour "gray_code" l' k>5k>5
"n_clean_m15"MCXSynthesisNCleanM15k2k-2006k66k-6 s portes d'embarquement CX au maximum
"n_dirty_i15"MCXSynthesisNDirtyI1500k2k-28k68k-6 s portes d'embarquement CX au maximum
"2_clean_kg24"MCXSynthesis2CleanKG2422006k66k-6 s portes d'embarquement CX au maximum
"2_dirty_kg24"MCXSynthesis2DirtyKG240212k1812k-18 s portes d'embarquement CX au maximum
"1_clean_kg24"MCXSynthesis1CleanKG24106k66k-6 s portes d'embarquement CX au maximum
"1_dirty_kg24"MCXSynthesis1DirtyKG24001112k1812k-18 s portes d'embarquement CX au maximum
"1_clean_b95"MCXSynthesis1CleanB95110016k816k-8 s portes d'embarquement CX au maximum
"default"MCXSynthesisDefaulttoutestouteschoisit le meilleur algorithme en fonction des ancillas disponibles
MCXSynthesisGrayCode()Plugin de synthèse pour une porte X multi-contrôlée basée sur le code Gray.
MCXSynthesisNoAuxV24()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'implémentation pour MCPhaseGate, qui est à son tour basé sur l'article de Vale et al. (2024).
MCXSynthesisNoAuxHP24()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Huang et Palsberg.
MCXSynthesisNCleanM15()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Maslov (2016).
MCXSynthesisNDirtyI15()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Iten et al. (2016).
MCXSynthesis2CleanKG24()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Khattar et Gidney (2024).
MCXSynthesis2DirtyKG24()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Khattar et Gidney (2024).
MCXSynthesis1CleanKG24()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Khattar et Gidney (2024).
MCXSynthesis1DirtyKG24()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Khattar et Gidney (2024).
MCXSynthesis1CleanB95()Plugin de synthèse pour une porte X multi-contrôlée basé sur l'article de Barenco et al. (1995).
MCXSynthesisDefault()Le plugin de synthèse par défaut pour une porte X multi-contrôlée.
Synthèse MCMT
Nom du plug-in
Classe de plug-in
Nombre d'ancillas propres
Nombre d'ancillas sales
Description
"vchain"MCMTSynthesisVChaink1k-100utilise un nombre linéaire de portes de Toffoli
"noaux"MCMTSynthesisNoAux0000utilise le mécanisme de contrôle standard de Qiskit
"xgate"MCMTSynthesisXGate0000utilise un nombre linéaire de portes de Toffoli
"default"MCMTSynthesisDefaulttoutestouteschoisit le meilleur algorithme en fonction des ancillas disponibles
MCMTSynthesisVChain()Une synthèse basée sur la chaîne V pour MCMTGate.
MCMTSynthesisNoAux()Une synthèse basée sur la chaîne V pour MCMTGate.
MCMTSynthesisXGate()Une synthèse pour MCMTGate avec la porte X comme porte de base.
MCMTSynthesisDefault()Une décomposition par défaut pour les portes MCMT.
Comparateurs d'entiers
Nom du plug-in
Classe de plug-in
Description
Qubits auxiliaires
"twos"IntComparatorSynthesis2sutiliser l'addition avec complément à deuxn1n - 1 propre
"noaux"IntComparatorSynthesisNoAuxretourner la cible contrôlée sur toutes les O(2l)O(2^l) valeurs entières autoriséesaucun
"default"IntComparatorSynthesisDefaultutiliser le meilleur algorithme en fonction des qubits auxiliaires disponiblestoutes
IntComparatorSynthesis2s()Une comparaison d'entiers basée sur le complément 2s.
IntComparatorSynthesisNoAux()Une comparaison potentiellement exponentiellement coûteuse sans qubits auxiliaires.
IntComparatorSynthesisDefault()La synthèse par défaut pour IntegerComparatorGate.
Sommes
Nom du plug-in
Classe de plug-in
Description
Qubits auxiliaires
"default"WeightedSumSynthesisDefaultutiliser une synthèse basée sur la chaîne en Vcompte tenu d' ss, somme de qubits, et d' s1s2s - 1_{s \leq 2}, qubits auxiliaires propres
WeightedSumSynthesisDefault()Synthétisez un WeightedSumGate à l'aide de l'algorithme de synthèse par défaut.
Synthèse de l'évolution de Pauli
Nom du plug-in
Classe de plug-in
Description
Connectivité ciblée
"rustiq"PauliEvolutionSynthesisRustiqutiliser la méthode de synthèse de la bibliothèque de synthèse de circuits Rustiqtout-à-tout
"default"PauliEvolutionSynthesisDefaultutiliser un terme diagonalisant de Clifford par Paulitout-à-tout
PauliEvolutionSynthesisDefault()Synthétisez un PauliEvolutionGate à l'aide de l'algorithme de synthèse par défaut.
PauliEvolutionSynthesisRustiq()Synthétiser un PauliEvolutionGate à l'aide de Rustiq.
Synthèse modulaire d'additionneurs
Nom du plug-in
Classe de plug-in
Nombre d'ancillas propres
Description
"modular_v17"ModularAdderSynthesisV1700un additionneur modulaire sans qubits auxiliaires
"ripple_cdkm"ModularAdderSynthesisC0411un additionneur de type "ripple-carry
"ripple_vbe"ModularAdderSynthesisV95n1n-1 pour nn -bit numbersun additionneur de type "ripple-carry
"qft"ModularAdderSynthesisD0000un additionneur basé sur la QFT
"default"ModularAdderSynthesisDefaulttouteschoisit le meilleur algorithme en fonction des ancillas disponibles
ModularAdderSynthesisV17()Un additionneur modulaire (modulo 2n2^n ) sans qubits auxiliaires.
ModularAdderSynthesisC04()Un additionneur de type "ripple-carry", modulo 2n2^n.
ModularAdderSynthesisD00()Un additionneur basé sur la QFT, modulo 2n2^n.
ModularAdderSynthesisV95()Un additionneur de type "ripple-carry", modulo 2n2^n.
ModularAdderSynthesisDefault()Synthèse de l'additionneur modulaire par défaut (pas de qubit d'entrée, pas de qubit de sortie).
Synthèse d'un demi-additionneur
Nom du plug-in
Classe de plug-in
Nombre d'ancillas propres
Description
"ripple_cdkm"HalfAdderSynthesisC0411un additionneur de type "ripple-carry
"ripple_r25"HalfAdderSynthesisR2500un additionneur à portage ondulé sans ancillas
"ripple_vbe"HalfAdderSynthesisV95n1n-1 pour nn -bit numbersun additionneur de type "ripple-carry
"qft"HalfAdderSynthesisD0000un additionneur basé sur la QFT
"default"HalfAdderSynthesisDefaulttouteschoisit le meilleur algorithme en fonction des ancillas disponibles
HalfAdderSynthesisC04()Un additionneur à portage ondulé avec un bit de sortie.
HalfAdderSynthesisD00()Un additionneur basé sur le QFT avec un bit d'entrée et un bit de sortie.
HalfAdderSynthesisV95()Un additionneur à portage ondulé avec un bit de sortie.
HalfAdderSynthesisR25()Un additionneur à portage ondulé avec un bit de sortie sans qubits auxiliaires.
HalfAdderSynthesisDefault()La synthèse par défaut du demi-adder (pas de retenue à l'entrée, mais un qubit de retenue à la sortie).
Synthèse d'additionneur complet
Nom du plug-in
Classe de plug-in
Nombre d'ancillas propres
Description
"ripple_cdkm"FullAdderSynthesisC0400un additionneur de type "ripple-carry
"ripple_vbe"FullAdderSynthesisV95n1n-1 pour nn -bit numbersun additionneur de type "ripple-carry
"default"FullAdderSynthesisDefaulttouteschoisit le meilleur algorithme en fonction des ancillas disponibles
FullAdderSynthesisC04()Un additionneur à portage ondulatoire avec un bit d'entrée et un bit de sortie.
FullAdderSynthesisV95()Un additionneur à portage ondulatoire avec un bit d'entrée et un bit de sortie.
FullAdderSynthesisDefault()Un additionneur à portage ondulatoire avec un bit d'entrée et un bit de sortie.
Synthèse multiplicatrice
Nom du plug-in
Classe de plug-in
Nombre d'ancillas propres
Description
"cumulative"MultiplierSynthesisH18selon le site AdderGate utiliséun additionneur cumulatif basé sur des additionneurs contrôlés
"qft"MultiplierSynthesisR1700un multiplicateur basé sur la QFT
"default"MultiplierSynthesisDefaulttouteschoisit le meilleur algorithme en fonction des ancillas disponibles
MultiplierSynthesisH18()Un multiplicateur cumulatif basé sur des additionneurs contrôlés.
MultiplierSynthesisR17()Un multiplicateur basé sur la QFT.
MultiplierSynthesisDefault()Le plugin multiplicateur par défaut.
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.