Plug-ins de síntese
qiskit.transpiler.passes.synthesis.plugin
Esse módulo define as interfaces de plug-in para as passagens do transpilador de síntese no Qiskit. Eles fornecem um ponto de conexão para que os pacotes python externos implementem suas próprias técnicas de síntese e as exponham perfeitamente como opções opcionais aos usuários quando eles executam o transpile().
As interfaces de plug-in são criadas usando pontos de entrada de setuptools que permitem que pacotes externos ao qiskit anunciem que incluem um plug-in de síntese.
Consulte qiskit.transpiler.preset_passmanagers.plugin para obter detalhes sobre como escrever plug-ins para estágios do transpilador.
API do plug-in Synthesis
API do plug-in de síntese unitária
UnitarySynthesisPlugin() | Classe abstrata de plug-in de síntese unitária |
UnitarySynthesisPluginManager() | Classe de gerenciador de plug-in de síntese unitária |
unitary_synthesis_plugin_names() | Retorna uma lista de nomes de plug-ins de síntese unitária instalados |
API do plug-in de síntese de alto nível
HighLevelSynthesisPlugin() | Classe abstrata de plug-in de síntese de alto nível. |
HighLevelSynthesisPluginManager() | Classe que rastreia os plug-ins de síntese de alto nível instalados. |
high_level_synthesis_plugin_names(op_name) | Retorna uma lista de nomes de plug-ins instalados para um determinado nome de objeto de alto nível |
Escrevendo Plugins
Plug-ins de síntese unitária
Para escrever um plug-in de síntese unitária, há duas etapas principais. A primeira etapa é criar uma subclasse da classe abstrata do plug-in: UnitarySynthesisPlugin. A classe de plug-in define a interface e o contrato para plug-ins de síntese unitária. O método principal é o run() que recebe um único argumento posicional, uma matriz unitária como uma matriz numpy, e espera-se que retorne um objeto DAGCircuit que representa o circuito sintetizado a partir dessa matriz unitária. Em seguida, para informar o transpilador do Qiskit sobre quais informações são necessárias para a passagem, há vários métodos de propriedade obrigatórios que precisam ser implementados, como supports_basis_gates e supports_coupling_map , dependendo do fato de o plug-in suportar e/ou exigir essa entrada para realizar a síntese. Para obter todos os detalhes, consulte a UnitarySynthesisPlugin documentação de todos os campos obrigatórios. Um exemplo de classe de plug-in seria algo parecido com:
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_circuitSe, por algum motivo, as entradas disponíveis para o método run() forem insuficientes, abra um problema e poderemos discutir a expansão da interface do plug-in com novas entradas opt-in que podem ser adicionadas de maneira compatível com versões anteriores para versões futuras. Observe, porém, que essa interface de plug-in é considerada estável e garantida para não ser alterada de forma prejudicial. Se forem necessárias alterações (por exemplo, para expandir as opções de entrada opcionais disponíveis), elas serão feitas de forma a não exigir alterações nos plug-ins existentes.
Todos os métodos prefixados com supports_ são reservados em uma classe derivada de UnitarySynthesisPlugin para parte da interface. Você não deve definir nenhum método supports_* personalizado em uma subclasse que não esteja definido na classe abstrata.
A segunda etapa é expor o UnitarySynthesisPlugin como um ponto de entrada do setuptools nos metadados do pacote. Isso é feito simplesmente adicionando uma tabela entry-points em pyproject.toml para o pacote de plug-ins com os pontos de entrada necessários no namespace qiskit.unitary_synthesis . Por exemplo:
[project.entry-points."qiskit.unitary_synthesis"]
"special" = "qiskit_plugin_pkg.module.plugin:SpecialUnitarySynthesis"Não há um limite para o número de plug-ins que um único pacote pode incluir, desde que cada plug-in tenha um nome exclusivo. Portanto, um único pacote pode expor vários plug-ins, se necessário. O nome default é usado pelo próprio Qiskit e não pode ser usado em um plug-in.
Configuração do plugin de síntese unitária
Para alguns plug-ins de síntese unitária que expõem várias opções e ajustes, a interface do plug-in tem uma opção para que os usuários forneçam um dicionário de configuração de forma livre. Isso será passado para o método run() como o kwarg options . Se o seu plug-in tiver essas opções de configuração, você deverá documentar claramente como um usuário deve especificar essas opções de configuração e como elas são usadas, já que se trata de um campo de formulário livre.
Plug-ins de síntese de alto nível
Escrever um plug-in de síntese de alto nível é conceitualmente semelhante a escrever um plug-in de síntese unitária. A primeira etapa é criar uma subclasse da classe abstrata de plug-in: HighLevelSynthesisPluginque define a interface e o contrato para plug-ins de síntese de alto nível. O método principal é run(). O argumento posicional high_level_object especifica o "objeto de nível superior" a ser sintetizado, que é qualquer objeto do tipo Operation (incluindo, por exemplo, LinearFunction ou Clifford). O argumento de palavra-chave target especifica o backend de destino, permitindo que o plug-in acesse todas as informações específicas do destino, como o mapa de acoplamento, o conjunto de portas suportado e assim por diante. O argumento de palavra-chave coupling_map especifica apenas o mapa de acoplamento e só é usado quando target não é especificado. O argumento da palavra-chave qubits especifica a lista de qubits sobre os quais o objeto de nível superior é definido, caso a síntese seja feita no circuito físico. O valor de None indica que o layout ainda não foi escolhido e que os qubits físicos no alvo ou no mapa de acoplamento em que essa operação está operando ainda não foram determinados. Além disso, as opções e os ajustes específicos do plug-in podem ser especificados em options, que é um dicionário de configuração de forma livre. Se o seu plug-in tiver essas opções de configuração, você deverá documentar claramente como um usuário deve especificar essas opções de configuração e como elas são usadas, já que se trata de um campo de formulário livre. O método run() deve retornar um objeto QuantumCircuit que representa o circuito sintetizado a partir desse objeto de nível superior. Também é permitido retornar None representando que o método de síntese não consegue sintetizar o objeto de nível superior fornecido. A síntese real de objetos de nível superior é realizada pelo HighLevelSynthesis passagem do transpilador. Para obter todos os detalhes, consulte a HighLevelSynthesisPlugin documentação de todos os campos obrigatórios. Um exemplo de classe de plug-in seria algo parecido com:
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 NoneO exemplo acima cria um plug-in para sintetizar objetos do tipo Clifford que têm no máximo 3 qubits, usando o método synth_clifford_bm.
A segunda etapa é expor o HighLevelSynthesisPlugin como um ponto de entrada do setuptools nos metadados do pacote. Isso é feito adicionando uma tabela entry-points em pyproject.toml para o pacote de plug-ins com os pontos de entrada necessários no namespace qiskit.synthesis . Por exemplo:
[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"O site name consiste em duas partes separadas por um ponto ".": o nome do tipo de Operation ao qual o plug-in de síntese se aplica (clifford) e o nome do plug-in (special). Não há um limite para o número de plug-ins que um único pacote pode incluir, desde que cada plug-in tenha um nome exclusivo.
Usando plugins
Plug-ins de síntese unitária
Para usar um plug-in, tudo o que você precisa fazer é instalar o pacote que inclui um plug-in de síntese. Em seguida, o Qiskit descobrirá automaticamente os plug-ins instalados e os exporá como opções válidas para os transpile() kwargs e construtores de passagem apropriados. Se houver algum plug-in instalado que não possa ser carregado/importado, isso será registrado em Python logging.
Para obter a lista instalada de plug-ins de síntese unitária instalados, você pode usar a função qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() função.
Plug-ins de síntese de alto nível
Para usar um plug-in de síntese de alto nível, primeiro instancie um HLSConfig para armazenar os nomes dos plug-ins a serem usados para vários objetos de alto nível. Por exemplo:
HLSConfig(permutation=["acg"], clifford=["layers"], linear_function=["pmh"])cria uma configuração de síntese de alto nível que usa o plug-in acg para sintetizar PermutationGate o plug-in layers para sintetizar objetos Clifford e o plug-in pmh para sintetizar LinearFunction objetos. Os argumentos da palavra-chave são os Operation.name campos dos objetos relevantes. Por exemplo, todas as Clifford operações têm o name clifford portanto, ele é usado como argumento da palavra-chave. Você pode especificar aqui qualquer argumento de palavra-chave que tenha instalado plug-ins para tratar, inclusive objetos de usuário personalizados, se tiver plug-ins instalados para eles. Consulte HLSConfig para obter mais detalhes sobre formatos alternativos para configurar os plug-ins em cada argumento.
Para cada objeto de alto nível, a lista de plug-ins fornecidos é tentada em sequência até que um deles seja bem-sucedido (no exemplo acima, cada lista contém apenas um único plug-in). Além de especificar um plug-in por seu nome, você pode passar uma tupla (name, options) , em que o segundo elemento da tupla é um dicionário que contém opções para o plug-in.
Depois de criado, você passa esse objeto HLSConfig no argumento hls_config para o transpile() ou generate_preset_pass_manager() que usará os plug-ins especificados como parte do fluxo de trabalho de compilação maior.
Para obter uma lista dos plug-ins de síntese de alto nível instalados para qualquer Operation.namevocê pode usar a função high_level_synthesis_plugin_names() passando o endereço name desejado como argumento:
high_level_synthesis_plugin_names("clifford")retornará uma lista de todos os plug-ins de síntese Clifford instalados.
Plug-ins disponíveis
Abaixo estão as classes de plug-in de síntese disponíveis no Qiskit. Essas classes não devem ser usadas diretamente, mas, em vez disso, devem ser usadas por meio da interface de plug-in documentada acima. As classes estão listadas aqui para facilitar a localização da documentação de cada um dos plug-ins incluídos e para facilitar a comparação entre diferentes métodos de síntese de um determinado objeto.
Plug-ins de síntese unitária
Plugin de síntese AQC
AQCSynthesisPlugin() | Um plug-in de síntese unitária Qiskit baseado em AQC. |
Plugin de síntese Solovay-Kitaev
SolovayKitaevSynthesis() | Um plug-in de síntese unitária Solovay-Kitaev Qiskit. |
Plugin de síntese Ross-Selinger
RossSelingerSynthesis() | Um plugin de síntese unitária Ross-Selinger Qiskit. |
Plugin Clifford Unitary Synthesis
CliffordUnitarySynthesis() | Um plugin de síntese unitária Clifford. |
Plugin de síntese unitária padrão
O plug-in de síntese unitária padrão define o algoritmo padrão usado pela passagem UnitarySynthesis do transpiler para sintetizar portas unitárias no circuito. Seu comportamento depende do número de qubits na unidade alvo e na base alvo.
Conjuntos de bases contínuas
Quando a base alvo é contínua (ou seja, não é Clifford+T), o plug-in usa as seguintes decomposições:
- Portas de 1 qubit: decomposições do ângulo de Euler (ver
OneQubitEulerDecomposer). - Portas de 2 qubits: decomposições KAK/Cartan (ver
TwoQubitBasisDecomposer,TwoQubitControlledUDecomposer,XXDecomposer). - Portas de 3+ qubits: Decomposição Quântica de Shannon, consulte
qs_decomposition().
Para portas de 1 e 2 qubits, o plug-in usa as informações de erro básico do alvo para selecionar a decomposição que maximiza a fidelidade esperada.
Conjuntos de bases Clifford+T
Quando a base alvo é Clifford+T, o plug-in usa o algoritmo Solovay-Kitaev (ver SolovayKitaevDecomposition) para aproximar unitários de 1 qubit. As configurações utilizadas para criar aproximações básicas são basis_gates=["h", "t", "tdg"], depth=12 e recursion_degree=5, e foram escolhidas empiricamente para equilibrar a qualidade da aproximação com o custo computacional. Para usar o Solovay-Kitaev com parâmetros personalizados ou para evitar o recálculo de aproximações para vários circuitos, você pode invocar o plugin de SolovayKitaevSynthesis síntese unitária em vez deste plugin padrão.
Atualmente, o Qiskit não inclui algoritmos para aproximar unidades de 2+ qubits diretamente no conjunto de bases Clifford+T. Portanto, o gerenciador de passagem predefinido primeiro decompõe esses portões em ["cx", "u"] base e, em seguida, aplica Solovay-Kitaev aos portões unitários de 1 qubit resultantes.
DefaultUnitarySynthesis() | O plugin de síntese unitária padrão. |
Síntese de alto nível
Os plug-ins de síntese de alto nível que estão diretamente disponíveis no Qiskit incluem plug-ins para sintetizar Clifford objetos, LinearFunction objetos e PermutationGate objetos. Alguns desses plug-ins visam implicitamente a conectividade de todos para todos. Essa não é uma limitação prática, pois o HighLevelSynthesis normalmente é executado antes do layout e do roteamento, o que garantirá que o circuito final seja compatível com a conectividade do dispositivo, inserindo portas SWAP adicionais. Um bom exemplo é o plug-in de síntese de permutação ACGSynthesisPermutation , que pode sintetizar qualquer permutação com no máximo 2 camadas de portas SWAP. Por outro lado, alguns plug-ins visam implicitamente a conectividade linear. Normalmente, os circuitos de síntese têm maior profundidade e número de portas, mas nenhuma porta SWAP adicional seria inserida se a passagem de layout a seguir escolhesse uma linha consecutiva de qubits dentro da topologia do dispositivo. Um bom exemplo disso é o plug-in de síntese de permutação KMSSynthesisPermutation , que pode sintetizar qualquer permutação de n qubits em profundidade n. Normalmente, é difícil saber de antemão qual das duas abordagens: sintetizar circuitos para conectividade total e inserir portas SWAP versus sintetizar circuitos para conectividade linear e inserir menos ou nenhuma porta SWAP resultará em um circuito final melhor, portanto, provavelmente faz sentido tentar as duas abordagens e ver qual delas oferece melhores resultados. Por fim, alguns plug-ins podem ter como alvo uma determinada conectividade e, portanto, devem ser executados depois que o layout for definido. Nesse caso, o circuito sintetizado adere automaticamente à topologia do dispositivo. Um bom exemplo disso é o plug-in de síntese de permutação TokenSwapperSynthesisPermutation , que é capaz de sintetizar permutações arbitrárias com relação a mapas de acoplamento arbitrários. Para obter mais detalhes, consulte a descrição de cada plug-in individual.
Para cada objeto de alto nível, fornecemos uma tabela que lista todos os seus plug-ins disponíveis diretamente no Qiskit. Incluímos o nome do plug-in, a classe do plug-in, o mapa de conectividade direcionado e, opcionalmente, informações adicionais. Lembre-se de que os plug-ins devem ser usados por meio do procedimento descrito anteriormente HLSConfigdescrito anteriormente, por exemplo:
HLSConfig(permutation=["kms"])cria uma configuração de síntese de alto nível que usa o plug-in kms para sintetizar PermutationGate ou seja, aqueles com name = "permutation". Nesse caso, o nome do plug-in é "kms" e a classe do plug-in é KMSSynthesisPermutation. Esse algoritmo de síntese específico criou um circuito que adere à conectividade linear do vizinho mais próximo.
Plug-ins de síntese de alto nível
Síntese de Clifford
Nome do plug-in | Classe do plug-in | Conectividade direcionada | Descrição |
|---|---|---|---|
"ag" | AGSynthesisClifford | todos para todos | otimiza avidamente a contagem de CX |
"bm" | BMSynthesisClifford | todos para todos | contagem ideal para n=2,3; usado em "default" para n=2,3 |
"greedy" | GreedySynthesisClifford | todos para todos | otimiza avidamente o CX-count; usado em "default" para n>=4 |
"layers" | LayerSynthesisClifford | todos para todos | |
"lnn" | LayerLnnSynthesisClifford | lineares | muitos CX-gates, mas garante uma profundidade de CX de, no máximo 7*n+2 |
"default" | DefaultSynthesisClifford | todos para todos | geralmente é o melhor para otimizar o CX-count (e o CX-count ideal para n=2,3 ) |
AGSynthesisClifford() | Plug-in de síntese de Clifford com base no método Aaronson-Gottesman. |
BMSynthesisClifford() | Plug-in de síntese de Clifford baseado no método Bravyi-Maslov. |
GreedySynthesisClifford() | Plug-in de síntese de Clifford com base no método de síntese de Bravyi-Hu-Maslov-Shaydulin. |
LayerSynthesisClifford() | Plug-in de síntese de Clifford baseado no método Bravyi-Maslov para sintetizar Cliffords em camadas. |
LayerLnnSynthesisClifford() | Plug-in de síntese de Clifford baseado no método Bravyi-Maslov para sintetizar Cliffords em camadas, com cada camada sintetizada aderindo à conectividade LNN. |
DefaultSynthesisClifford() | O plug-in padrão de síntese de clifford. |
Síntese de Função Linear
Nome do plug-in | Classe do plug-in | Conectividade direcionada | Descrição |
|---|---|---|---|
"kms" | KMSSynthesisLinearFunction | lineares | muitos CX-gates, mas garante uma profundidade de CX de, no máximo 5*n |
"pmh" | PMHSynthesisLinearFunction | todos para todos | otimiza avidamente o CX-count; usado em "default" |
"default" | DefaultSynthesisLinearFunction | todos para todos | melhor para otimizar o CX-count |
KMSSynthesisLinearFunction() | Plug-in de síntese de função linear baseado no método Kutin-Moulton-Smithline. |
PMHSynthesisLinearFunction() | Plug-in de síntese de função linear baseado no método Patel-Markov-Hayes. |
DefaultSynthesisLinearFunction() | O plug-in padrão de síntese de função linear. |
Síntese de Permutações
Nome do plug-in | Classe do plug-in | Conectividade direcionada | Descrição |
|---|---|---|---|
"basic" | BasicSynthesisPermutation | todos para todos | contagem ideal de SWAP; usado em "default" |
"acg" | ACGSynthesisPermutation | todos para todos | garante uma profundidade SWAP de no máximo 2 |
"kms" | KMSSynthesisPermutation | lineares | muitas portas SWAP, mas garante uma profundidade SWAP de no máximo n |
"token_swapper" | TokenSwapperSynthesisPermutation | qualquer | otimiza avidamente a contagem de SWAP para conectividade arbitrária |
"default" | BasicSynthesisPermutation | todos para todos | melhor para otimizar a contagem de SWAP |
BasicSynthesisPermutation() | O plug-in de síntese de permutação é baseado na classificação. |
ACGSynthesisPermutation() | O plug-in de síntese de permutação é baseado no método de Alon, Chung e Graham. |
KMSSynthesisPermutation() | O plug-in de síntese de permutação é baseado no método Kutin, Moulton e Smithline. |
TokenSwapperSynthesisPermutation() | O plug-in de síntese de permutação é baseado no algoritmo de troca de tokens. |
Síntese QFT
Nome do plug-in | Classe do plug-in | Conectividade direcionada |
|---|---|---|
"full" | QFTSynthesisFull | todos para todos |
"line" | QFTSynthesisLine | lineares |
"default" | QFTSynthesisFull | todos para todos |
QFTSynthesisFull() | Plug-in de síntese para portas QFT usando conectividade tudo-para-todos. |
QFTSynthesisLine() | Plug-in de síntese para portas QFT usando conectividade linear. |
Síntese MCX
A tabela a seguir lista os plug-ins de síntese disponíveis para um MCXGate porta com k qubits de controle. Se o número disponível de qubits auxiliares limpos/sujos não for suficiente, o método de síntese correspondente retornará None.
Nome do plug-in | Classe do plug-in | Número de acessórios limpos | Número de auxiliares sujos | Descrição |
|---|---|---|---|---|
"gray_code" | MCXSynthesisGrayCode | 0 | 0 | exponencialmente muitas portas CX; use apenas para valores pequenos de k |
"noaux_v24" | MCXSynthesisNoAuxV24 | 0 | 0 | número quadrático de portas CX |
"noaux_hp24" | MCXSynthesisNoAuxHP24 | 0 | 0 | número linear de portas CX; use em vez de "noaux_v24" ou "gray_code" para k>5 |
"n_clean_m15" | MCXSynthesisNCleanM15 | k-2 | 0 | no máximo 6*k-6 CX gates |
"n_dirty_i15" | MCXSynthesisNDirtyI15 | 0 | k-2 | no máximo 8*k-6 CX gates |
"2_clean_kg24" | MCXSynthesis2CleanKG24 | 2 | 0 | no máximo 6*k-6 CX gates |
"2_dirty_kg24" | MCXSynthesis2DirtyKG24 | 0 | 2 | no máximo 12*k-18 CX gates |
"1_clean_kg24" | MCXSynthesis1CleanKG24 | 1 | 0 | no máximo 6*k-6 CX gates |
"1_dirty_kg24" | MCXSynthesis1DirtyKG24 | 0 | 1 | no máximo 12*k-18 CX gates |
"1_clean_b95" | MCXSynthesis1CleanB95 | 1 | 0 | no máximo 16*k-8 CX gates |
"default" | MCXSynthesisDefault | qualquer | qualquer | escolhe o melhor algoritmo com base nos recursos disponíveis |
MCXSynthesisGrayCode() | Plug-in de síntese para uma porta X multicontrolada com base no código Gray. |
MCXSynthesisNoAuxV24() | Plug-in de síntese para uma porta X multicontrolada com base na implementação para MCPhaseGate, que, por sua vez, é baseada no artigo de Vale et al. (2024). |
MCXSynthesisNoAuxHP24() | Plug-in de síntese para uma porta X multicontrolada com base no artigo de Huang e Palsberg. |
MCXSynthesisNCleanM15() | Plug-in de síntese para uma porta X multicontrolada com base no artigo de Maslov (2016). |
MCXSynthesisNDirtyI15() | Plug-in de síntese para uma porta X multicontrolada com base no artigo de Iten et al. (2016). |
MCXSynthesis2CleanKG24() | Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024). |
MCXSynthesis2DirtyKG24() | Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024). |
MCXSynthesis1CleanKG24() | Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024). |
MCXSynthesis1DirtyKG24() | Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024). |
MCXSynthesis1CleanB95() | Plugin de síntese para uma porta X multicontrolada com base no artigo de Barenco et al. (1995). |
MCXSynthesisDefault() | O plug-in de síntese padrão para uma porta X multicontrolada. |
Síntese MCMT
Nome do plug-in | Classe do plug-in | Número de acessórios limpos | Número de auxiliares sujos | Descrição |
|---|---|---|---|---|
"vchain" | MCMTSynthesisVChain | k-1 | 0 | usa um número linear de portas de Toffoli |
"noaux" | MCMTSynthesisNoAux | 0 | 0 | usa o mecanismo de controle padrão do Qiskit |
"xgate" | MCMTSynthesisXGate | 0 | 0 | usa um número linear de portas de Toffoli |
"default" | MCMTSynthesisDefault | qualquer | qualquer | escolhe o melhor algoritmo com base nos recursos disponíveis |
MCMTSynthesisVChain() | Uma síntese baseada na cadeia V para MCMTGate. |
MCMTSynthesisNoAux() | Uma síntese baseada na cadeia V para MCMTGate. |
MCMTSynthesisXGate() | Uma síntese para MCMTGate com a porta X como porta base. |
MCMTSynthesisDefault() | Uma decomposição padrão para portas MCMT. |
Comparadores de inteiros
Nome do plug-in | Classe do plug-in | Descrição | Qubits auxiliares |
|---|---|---|---|
"twos" | IntComparatorSynthesis2s | usar adição com complemento de dois | n - 1 Limpar |
"noaux" | IntComparatorSynthesisNoAux | inverter o alvo controlado em todos os valores inteiros permitidos | Nenhum |
"default" | IntComparatorSynthesisDefault | usar o melhor algoritmo, dependendo dos qubits auxiliares disponíveis | qualquer |
IntComparatorSynthesis2s() | Uma comparação de números inteiros baseada no complemento 2s. |
IntComparatorSynthesisNoAux() | Uma comparação potencialmente exponencialmente cara sem qubits auxiliares. |
IntComparatorSynthesisDefault() | A síntese padrão para IntegerComparatorGate. |
Somas
Nome do plug-in | Classe do plug-in | Descrição | Qubits auxiliares |
|---|---|---|---|
"default" | WeightedSumSynthesisDefault | usar uma síntese baseada em cadeia V | dado s soma qubits, usado s - 1 + int(s > 2) limpa qubits auxiliares |
WeightedSumSynthesisDefault() | Sintetizar um WeightedSumGate usando o algoritmo de síntese padrão. |
Síntese da evolução de Pauli
Nome do plug-in | Classe do plug-in | Descrição | Conectividade direcionada |
|---|---|---|---|
"rustiq" | PauliEvolutionSynthesisRustiq | usar o método de síntese da biblioteca de síntese de circuitos Rustiq | todos para todos |
"default" | PauliEvolutionSynthesisDefault | usam um termo de Clifford por Pauli diagonalizado | todos para todos |
PauliEvolutionSynthesisDefault() | Sintetizar um PauliEvolutionGate usando o algoritmo de síntese padrão. |
PauliEvolutionSynthesisRustiq() | Sintetize um PauliEvolutionGate usando o Rustiq. |
Síntese modular de somadores
Nome do plug-in | Classe do plug-in | Número de acessórios limpos | Descrição |
|---|---|---|---|
"modular_v17" | ModularAdderSynthesisV17 | 0 | um somador modular sem nenhum qubits auxiliar |
"ripple_cdkm" | ModularAdderSynthesisC04 | 1 | um somador de transporte de ondulação |
"ripple_vbe" | ModularAdderSynthesisV95 | , para -bit numbers | um somador de transporte de ondulação |
"qft" | ModularAdderSynthesisD00 | 0 | um somador baseado em QFT |
"default" | ModularAdderSynthesisDefault | qualquer | escolhe o melhor algoritmo com base nos recursos disponíveis |
ModularAdderSynthesisV17() | Um somador modular (módulo ) sem nenhum qubits auxiliar. |
ModularAdderSynthesisC04() | Um somador de transporte de ondulação, módulo . |
ModularAdderSynthesisD00() | Um somador baseado em QFT, módulo . |
ModularAdderSynthesisV95() | Um somador de transporte de ondulação, módulo . |
ModularAdderSynthesisDefault() | A síntese padrão do somador modular (nenhum carry in, nenhum carry out qubit). |
Síntese do somador parcial
Nome do plug-in | Classe do plug-in | Número de acessórios limpos | Descrição |
|---|---|---|---|
"ripple_cdkm" | HalfAdderSynthesisC04 | 1 | um somador de transporte de ondulação |
"ripple_r25" | HalfAdderSynthesisR25 | 0 | um somador de ripple-carry sem auxiliares |
"ripple_vbe" | HalfAdderSynthesisV95 | , para -bit numbers | um somador de transporte de ondulação |
"qft" | HalfAdderSynthesisD00 | 0 | um somador baseado em QFT |
"default" | HalfAdderSynthesisDefault | qualquer | escolhe o melhor algoritmo com base nos recursos disponíveis |
HalfAdderSynthesisC04() | Um somador ripple-carry com um bit de carry-out. |
HalfAdderSynthesisD00() | Um somador baseado em QFT com um bit de carry-in e um bit de carry-out. |
HalfAdderSynthesisV95() | Um somador ripple-carry com um bit de carry-out. |
HalfAdderSynthesisR25() | Um somador ripple-carry com um bit de transporte sem qubits auxiliares. |
HalfAdderSynthesisDefault() | A síntese padrão de meio-somador (sem carry in, mas com um qubit de carry out). |
Síntese do somador completo
Nome do plug-in | Classe do plug-in | Número de acessórios limpos | Descrição |
|---|---|---|---|
"ripple_cdkm" | FullAdderSynthesisC04 | 0 | um somador de transporte de ondulação |
"ripple_vbe" | FullAdderSynthesisV95 | , para -bit numbers | um somador de transporte de ondulação |
"default" | FullAdderSynthesisDefault | qualquer | escolhe o melhor algoritmo com base nos recursos disponíveis |
FullAdderSynthesisC04() | Um somador ripple-carry com um bit de carry-in e um bit de carry-out. |
FullAdderSynthesisV95() | Um somador ripple-carry com um bit de carry-in e um bit de carry-out. |
FullAdderSynthesisDefault() | Um somador ripple-carry com um bit de carry-in e um bit de carry-out. |
Síntese multiplicadora
Nome do plug-in | Classe do plug-in | Número de acessórios limpos | Descrição |
|---|---|---|---|
"cumulative" | MultiplierSynthesisH18 | dependendo do site AdderGate usado | um somador cumulativo baseado em somadores controlados |
"qft" | MultiplierSynthesisR17 | 0 | um multiplicador baseado em QFT |
"default" | MultiplierSynthesisDefault | qualquer | escolhe o melhor algoritmo com base nos recursos disponíveis |
MultiplierSynthesisH18() | Um multiplicador cumulativo baseado em somadores controlados. |
MultiplierSynthesisR17() | Um multiplicador baseado em QFT. |
MultiplierSynthesisDefault() | O plug-in multiplicador padrão. |