Plugin di sintesi
qiskit.transpiler.passes.synthesis.plugin
Questo modulo definisce le interfacce dei plugin per i passaggi del transpiler di sintesi in Qiskit. Questi forniscono un punto di aggancio per i pacchetti python esterni per implementare le proprie tecniche di sintesi e per esporle senza problemi come opzioni opt-in agli utenti quando si esegue transpile().
Le interfacce dei plugin sono costruite utilizzando i punti di ingresso di setuptools che consentono ai pacchetti esterni a qiskit di pubblicizzare l'inclusione di un plugin di sintesi.
Per i dettagli su come scrivere plugin per gli stadi del transpiler, vedere qiskit.transpiler.preset_passmanagers.plugin per i dettagli su come scrivere plugin per gli stadi del transpiler.
API del plugin Synthesis
API plugin di sintesi unitaria
UnitarySynthesisPlugin() | Classe di plugin per la sintesi unitaria astratta |
UnitarySynthesisPluginManager() | Classe di gestione dei plugin di Sintesi Unitaria |
unitary_synthesis_plugin_names() | Restituisce un elenco dei nomi dei plugin di sintesi unitaria installati |
API plugin per sintesi ad alto livello
HighLevelSynthesisPlugin() | Classe astratta di plugin di sintesi di alto livello. |
HighLevelSynthesisPluginManager() | Classe che tiene traccia dei plugin di sintesi di alto livello installati. |
high_level_synthesis_plugin_names(op_name) | Restituisce un elenco di nomi di plugin installati per un dato nome di oggetto di alto livello |
Scrittura dei plugin
Plugin di sintesi unitaria
Per scrivere un plugin di sintesi unitaria occorre seguire due passaggi principali. Il primo passo consiste nel creare una sottoclasse della classe astratta del plugin: UnitarySynthesisPlugin. La classe del plugin definisce l'interfaccia e il contratto per i plugin di sintesi unitaria. Il metodo principale è run() che accetta un unico argomento posizionale, una matrice unitaria sotto forma di array NumPy, e dovrebbe restituire un DAGCircuit oggetto che rappresenta il circuito sintetizzato a partire da tale matrice unitaria. Per comunicare al transpiler di Qiskit quali informazioni sono necessarie per il passaggio, occorre implementare diversi metodi di proprietà obbligatori, quali supports_basis_gates e supports_coupling_map , a seconda che il plugin supporti e/o richieda tale input per eseguire la sintesi. Per i dettagli completi, consultare la UnitarySynthesisPlugin documentazione relativa a tutti i campi obbligatori. Una classe di plugin di esempio potrebbe essere simile alla seguente:
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, per qualche motivo, i parametri disponibili per il run() metodo non fossero sufficienti, ti preghiamo di aprire un ticket, così potremo discutere dell'opportunità di ampliare l'interfaccia del plugin con nuovi parametri opzionali che possano essere aggiunti in modo retrocompatibile nelle versioni future. Si noti tuttavia che l'interfaccia di questo plugin è considerata stabile e garantita come non soggetta a modifiche che ne compromettano la compatibilità. Se dovessero rendersi necessarie delle modifiche (ad esempio per ampliare le opzioni di input opzionali disponibili), queste saranno apportate in modo tale da non richiedere modifiche ai plugin esistenti.
Tutti i metodi con prefisso supports_ sono riservati a una classe derivata da UnitarySynthesisPlugin per una parte dell'interfaccia. Non si devono definire metodi supports_* personalizzati su una sottoclasse che non siano definiti nella classe astratta.
Il secondo passo consiste nell'indicare il UnitarySynthesisPlugin come punto di accesso di setuptools nei metadati del pacchetto. Per farlo basta aggiungere una entry-points tabella nel pyproject.toml pacchetto del plugin con i punti di ingresso necessari all'interno dello qiskit.unitary_synthesis spazio dei nomi. Ad esempio:
[project.entry-points."qiskit.unitary_synthesis"]
"special" = "qiskit_plugin_pkg.module.plugin:SpecialUnitarySynthesis"Non c'è limite al numero di plugin che un singolo pacchetto può includere, purché ogni plugin abbia un nome unico. Quindi un singolo pacchetto può esporre più plugin, se necessario. Il nome default è utilizzato da Qiskit stesso e non può essere utilizzato in un plugin.
Configurazione del plugin di sintesi unitaria
Per alcuni plugin di sintesi unitaria che espongono più opzioni e regolatori, l'interfaccia del plugin ha un'opzione che consente agli utenti di fornire un dizionario di configurazione libero. Questo verrà passato al metodo run() come kwarg di options . Se il vostro plugin ha queste opzioni di configurazione, dovreste documentare chiaramente come l'utente deve specificare queste opzioni di configurazione e come vengono utilizzate, dato che si tratta di un campo a forma libera.
Plugin di sintesi di alto livello
La scrittura di un plugin di sintesi di alto livello è concettualmente simile alla scrittura di un plugin di sintesi unitaria. Il primo passo consiste nel creare una sottoclasse della classe astratta del plugin: HighLevelSynthesisPlugin, che definisce l'interfaccia e il contratto per i plugin di sintesi di alto livello. Il metodo principale è run(). L'argomento high_level_object posizionale specifica l'«oggetto di livello superiore» da sintetizzare, ovvero qualsiasi oggetto di tipo Operation (compresi, ad esempio, LinearFunction o Clifford). L'argomento target "keyword" specifica il backend di destinazione, consentendo al plugin di accedere a tutte le informazioni specifiche di tale backend, quali la mappa di accoppiamento, l'insieme di gate supportati e così via. L'argomento coupling_map chiave specifica solo la mappa di accoppiamento e viene utilizzato solo quando target non viene specificato. L'argomento qubits chiave specifica l'elenco dei qubit su cui è definito l'oggetto di livello superiore, nel caso in cui la sintesi venga eseguita sul circuito fisico. Il valore di None indica che il layout non è stato ancora scelto e che i qubit fisici nella mappa di destinazione o di accoppiamento su cui agisce questa operazione non sono stati ancora determinati. Inoltre, è possibile specificare opzioni e parametri di regolazione specifici del plugin tramite options, che è un dizionario di configurazione in formato libero. Se il tuo plugin dispone di queste opzioni di configurazione, dovresti documentare chiaramente come l'utente debba specificarle e come vengano utilizzate, dato che si tratta di un campo libero. Il metodo run() dovrebbe restituire un QuantumCircuit oggetto che rappresenta il circuito sintetizzato a partire da quell'oggetto di livello superiore. È inoltre consentito restituire None un valore che indichi che il metodo di sintesi non è in grado di sintetizzare l'oggetto di livello superiore specificato. La sintesi vera e propria degli oggetti di livello superiore viene eseguita dal HighLevelSynthesis passaggio del transpiler. Per i dettagli completi, consultare la HighLevelSynthesisPlugin documentazione relativa a tutti i campi obbligatori. Una classe di plugin di esempio potrebbe essere simile alla seguente:
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 NoneL'esempio sopra riportato crea un plugin per sintetizzare oggetti di tipo Clifford che hanno al massimo 3 qubit, utilizzando il metodo synth_clifford_bm.
Il secondo passo consiste nell'indicare il HighLevelSynthesisPlugin come punto di accesso di setuptools nei metadati del pacchetto. Ciò avviene aggiungendo una entry-points tabella in pyproject.toml per il pacchetto del plugin con i punti di ingresso necessari all'interno dello qiskit.synthesis spazio dei nomi. Ad esempio:
[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"Il name è composto da due parti separate da un punto “.”: il nome del tipo a Operation cui si applica il plugin di sintesi (clifford), e il nome del plugin stesso (special). Non vi è alcun limite al numero di plugin che un singolo pacchetto può includere, purché ogni plugin abbia un nome univoco.
Utilizzo dei plugin
Plugin di sintesi unitaria
Per utilizzare un plugin è sufficiente installare il pacchetto che include il plugin di sintesi. Quindi Qiskit scoprirà automaticamente i plugin installati e li esporrà come opzioni valide per gli appropriati costruttori transpile() kwarg e ai costruttori di passaggi. Se ci sono plugin installati che non possono essere caricati/importati, questo verrà registrato in Python.
Per ottenere l'elenco dei plugin di sintesi unitaria installati, è possibile utilizzare la qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() funzione.
Plugin di sintesi di alto livello
Per utilizzare un plugin di sintesi di alto livello, occorre innanzitutto istanziare un HLSConfig in cui memorizzare i nomi dei plugin da utilizzare per i vari oggetti di alto livello. Ad esempio:
HLSConfig(permutation=["acg"], clifford=["layers"], linear_function=["pmh"])crea una configurazione di sintesi di alto livello che utilizza il acg plugin per la sintesi PermutationGate di oggetti, il layers plugin per la sintesi Clifford di oggetti e il pmh plugin per la sintesi LinearFunction di oggetti. Gli argomenti chiave sono i Operation.name campi degli oggetti in questione. Ad esempio, tutte Clifford le operazioni hanno il nameclifford , quindi questo viene utilizzato come argomento chiave. Qui puoi specificare qualsiasi argomento chiave gestito dai plugin che hai installato, compresi gli oggetti utente personalizzati, se hai installato plugin appositi per essi. Per ulteriori dettagli sui formati alternativi per la configurazione dei plugin all'interno di ciascun argomento, consultare HLSConfig [...].
Per ogni oggetto di alto livello, l'elenco dei plugin dati viene provato in sequenza, finché uno di essi non ha successo (nell'esempio precedente, ogni elenco contiene solo un singolo plugin). Oltre a specificare un plugin con il suo nome, è possibile passare una tupla (name, options) , dove il secondo elemento della tupla è un dizionario contenente le opzioni del plugin.
Una volta creato, questo HLSConfig oggetto va passato come argomento hls_config a transpile() o generate_preset_pass_manager() , che utilizzeranno i plugin specificati nell'ambito del flusso di lavoro di compilazione più ampio.
Operation.namePer ottenere un elenco dei plugin di sintesi di alto livello installati per un dato sistema, è possibile utilizzare la high_level_synthesis_plugin_names() funzione, passando come argomento il sistema desiderato name :
high_level_synthesis_plugin_names("clifford")restituirà un elenco di tutti i plugin di sintesi Clifford installati.
Plugin disponibili
Di seguito sono riportate le classi di plugin di sintesi disponibili in Qiskit. Queste classi non devono essere usate direttamente, ma devono essere utilizzate attraverso l'interfaccia del plugin documentata sopra. Le classi sono elencate qui per facilitare la ricerca della documentazione di ciascun plugin incluso e per facilitare il confronto tra i diversi metodi di sintesi per un dato oggetto.
Plugin di sintesi unitaria
Plugin di sintesi AQC
AQCSynthesisPlugin() | Un plugin di sintesi unitaria Qiskit basato su AQC. |
Plugin di sintesi Solovay-Kitaev
SolovayKitaevSynthesis() | Un plugin di sintesi unitaria Solovay-Kitaev Qiskit. |
Plugin di sintesi Ross-Selinger
RossSelingerSynthesis() | Plugin di sintesi unitaria Ross-Selinger Qiskit. |
Plugin Clifford Unitary Synthesis
CliffordUnitarySynthesis() | Un plugin di sintesi unitaria Clifford. |
Plugin di sintesi unitaria predefinito
Il plugin di sintesi unitaria predefinito definisce l'algoritmo predefinito utilizzato dal UnitarySynthesis passaggio del transpiler per sintetizzare le porte unitarie nel circuito. Il suo comportamento dipende dal numero di qubit nell'operatore unitario di destinazione e dalla base di destinazione.
Insiemi di base continui
Quando la base target è continua (cioè non Clifford+T), il plugin utilizza le seguenti decomposizioni:
- Gate a 1 qubit: scomposezioni in angoli di Eulero (vedi
OneQubitEulerDecomposer). - Gate a 2 qubit: decomposizioni di KAK/Cartan (vedi
TwoQubitBasisDecomposer,TwoQubitControlledUDecomposer,XXDecomposer). - Gate a 3+ qubit: decomposizione quantistica di Shannon, vedi
qs_decomposition().
Per i gate a 1 e 2 qubit, il plugin utilizza le informazioni di errore di base dal target per selezionare la decomposizione che massimizza la fedeltà prevista.
Insiemi di basi Clifford+T
Quando la base di destinazione è Clifford+, il plugin utilizza l'algoritmo di Solovay-Kitaev (vedi SolovayKitaevDecomposition) per approssimare le operazioni unitarie su 1 qubit. I parametri utilizzati per creare approssimazioni di base sono basis_gates=["h", "t", "tdg"], depth=12 e recursion_degree=5, e sono stati scelti empiricamente per trovare un equilibrio tra la qualità dell'approssimazione e il costo computazionale. Per utilizzare Solovay-Kitaev con parametri personalizzati, oppure per evitare di ricalcolare le approssimazioni per più circuiti, è possibile utilizzare SolovayKitaevSynthesis il plugin di sintesi unitaria al posto di questo plugin predefinito.
Al momento, Qiskit non include algoritmi per approssimare direttamente le unitarie a 2+ qubit nel set di basi Clifford+T. Pertanto, il gestore dei passaggi preimpostati scompone innanzitutto tali porte in ["cx", "u"] base, quindi applica Solovay-Kitaev alle porte unitarie a 1 qubit risultanti.
DefaultUnitarySynthesis() | Il plugin di sintesi unitario predefinito. |
Sintesi di alto livello
Tra i plugin di sintesi di alto livello disponibili direttamente in Qiskit figurano quelli per la sintesi Clifford di oggetti, LinearFunction oggetti e PermutationGate oggetti. Alcuni di questi plugin prevedono implicitamente una connettività “tutti con tutti”. Non si tratta di una limitazione pratica, poiché HighLevelSynthesis questa fase viene in genere eseguita prima del layout e del routing, il che garantisce che il circuito finale rispetti la connettività del dispositivo grazie all’inserimento di ulteriori porte SWAP. Un buon esempio è il plugin ACGSynthesisPermutation di sintesi per permutazioni, in grado di sintetizzare qualsiasi permutazione con al massimo 2 livelli di porte SWAP. D'altra parte, alcuni plugin presuppongono implicitamente una connettività lineare. In genere, i circuiti di sintesi presentano una profondità maggiore e un numero più elevato di porte; tuttavia, non verrebbero inserite porte SWAP aggiuntive se, nella fase successiva di layout, venisse scelta una linea consecutiva di qubit all’interno della topologia del dispositivo. nUn buon esempio è il plugin KMSSynthesisPermutation di sintesi per permutazione, in grado di sintetizzare qualsiasi permutazione di n qubit in profondità. In genere, è difficile stabilire in anticipo quale dei due approcci — la sintesi di circuiti per una connettività "all-to-all" e l'inserimento di porte SWAP, oppure la sintesi di circuiti per una connettività lineare e l'inserimento di un numero minore o nullo di porte SWAP — porti a un circuito finale migliore; pertanto, è probabilmente opportuno provarli entrambi e verificare quale offra risultati migliori. Infine, alcuni plugin possono essere destinati a una determinata modalità di connessione e, pertanto, dovrebbero essere eseguiti dopo che il layout è stato impostato. In questo caso, il circuito sintetizzato si adatta automaticamente alla topologia del dispositivo. Un buon esempio è il plugin TokenSwapperSynthesisPermutation di sintesi per permutazioni, in grado di sintetizzare permutazioni arbitrarie rispetto a mappe di accoppiamento arbitrarie. Per ulteriori dettagli, si prega di consultare la descrizione di ciascun plugin.
Per ogni oggetto di alto livello forniamo una tabella che elenca tutti i plugin disponibili direttamente in Qiskit. Includiamo il nome del plugin, la classe del plugin, la mappa di connettività di destinazione e, facoltativamente, ulteriori informazioni. HLSConfigSi ricorda che i plugin devono essere utilizzati tramite il metodo descritto in precedenza, ad esempio:
HLSConfig(permutation=["kms"])crea una configurazione di sintesi di alto livello che utilizza il kms plugin per la sintesi PermutationGate degli oggetti – ovvero quelli con name = "permutation". In questo caso, il nome del plugin è “kms”, mentre la classe del plugin è KMSSynthesisPermutation. Questo specifico algoritmo di sintesi ha generato un circuito che rispetta la connettività lineare “next-nearest-neighbor”.
Plugin di sintesi ad alto livello
Sintesi di Clifford
Nome del plugin | Classe plugin | Connettività mirata | Descrizione |
|---|---|---|---|
"ag" | AGSynthesisClifford | da tutti a tutti | ottimizza avidamente il numero di CX |
"bm" | BMSynthesisClifford | da tutti a tutti | numero ottimale per ; utilizzato in "default" per |
"greedy" | GreedySynthesisClifford | da tutti a tutti | ottimizza in modo aggressivo il conteggio CX; utilizzato in "default" |
"layers" | LayerSynthesisClifford | da tutti a tutti | |
"lnn" | LayerLnnSynthesisClifford | lineare | molti CX-gate, ma garantisce una profondità CX pari al massimo a |
"default" | DefaultSynthesisClifford | da tutti a tutti | di solito è la soluzione migliore per ottimizzare il numero di CX (e il numero ottimale di CX per ) |
AGSynthesisClifford() | Plugin di sintesi Clifford basato sul metodo Aaronson-Gottesman. |
BMSynthesisClifford() | Plugin di sintesi Clifford basato sul metodo Bravyi-Maslov. |
GreedySynthesisClifford() | Plugin di sintesi Clifford basato sul metodo di sintesi greedy Bravyi-Hu-Maslov-Shaydulin. |
LayerSynthesisClifford() | Plugin di sintesi Clifford basato sul metodo Bravyi-Maslov per sintetizzare i Clifford in strati. |
LayerLnnSynthesisClifford() | Il plugin di sintesi Clifford si basa sul metodo Bravyi-Maslov per sintetizzare i Clifford in strati, con ogni strato sintetizzato che aderisce alla connettività LNN. |
DefaultSynthesisClifford() | Il plugin di sintesi clifford predefinito. |
Sintesi di funzioni lineari
Nome del plugin | Classe plugin | Connettività mirata | Descrizione |
|---|---|---|---|
"kms" | KMSSynthesisLinearFunction | lineare | molti CX-gate, ma garantisce una profondità CX pari al massimo a |
"pmh" | PMHSynthesisLinearFunction | da tutti a tutti | ottimizza avidamente il numero di CX; usato in "default" |
"default" | DefaultSynthesisLinearFunction | da tutti a tutti | migliori per l'ottimizzazione del conteggio CX |
KMSSynthesisLinearFunction() | Plugin per la sintesi di funzioni lineari basato sul metodo Kutin-Moulton-Smithline. |
PMHSynthesisLinearFunction() | Plugin di sintesi di funzioni lineari basato sul metodo Patel-Markov-Hayes. |
DefaultSynthesisLinearFunction() | Il plugin predefinito per la sintesi di funzioni lineari. |
Sintesi di permutazione
Nome del plugin | Classe plugin | Connettività mirata | Descrizione |
|---|---|---|---|
"basic" | BasicSynthesisPermutation | da tutti a tutti | ottimale del conteggio SWAP; utilizzato in "default" |
"acg" | ACGSynthesisPermutation | da tutti a tutti | garantisce una profondità SWAP pari al massimo a |
"kms" | KMSSynthesisPermutation | lineare | molti SWAP-gate, ma garantisce una profondità SWAP pari al massimo a |
"token_swapper" | TokenSwapperSynthesisPermutation | qualsiasi | ottimizza avidamente il conteggio SWAP per una connettività arbitraria |
"default" | BasicSynthesisPermutation | da tutti a tutti | migliore per ottimizzare il conteggio SWAP |
BasicSynthesisPermutation() | Il plugin di sintesi delle permutazioni si basa sull'ordinamento. |
ACGSynthesisPermutation() | Il plugin di sintesi permutativa si basa sul metodo di Alon, Chung e Graham. |
KMSSynthesisPermutation() | Il plugin di sintesi permutativa si basa sul metodo di Kutin, Moulton, Smithline. |
TokenSwapperSynthesisPermutation() | Il plugin di sintesi delle permutazioni si basa sull'algoritmo token swapper. |
Sintesi QFT
Nome del plugin | Classe plugin | Connettività mirata |
|---|---|---|
"full" | QFTSynthesisFull | da tutti a tutti |
"line" | QFTSynthesisLine | lineare |
"default" | QFTSynthesisFull | da tutti a tutti |
QFTSynthesisFull() | Plugin di sintesi per porte QFT che utilizzano la connettività all-to-all. |
QFTSynthesisLine() | Plugin di sintesi per porte QFT che utilizzano la connettività lineare. |
Sintesi MCX
La tabella seguente elenca i plugin di sintesi disponibili per un MCXGate gate con k qubit di controllo. Se il numero disponibile di qubit ausiliari puliti/sporchi non è sufficiente, il metodo di sintesi corrispondente restituirà None.
Nome del plugin | Classe plugin | Numero di accessori puliti | Numero di ancille sporche | Descrizione |
|---|---|---|---|---|
"gray_code" | MCXSynthesisGrayCode | 0 | 0 | un numero esponenziale di porte CX; da utilizzare solo per valori ridotti di |
"noaux_v24" | MCXSynthesisNoAuxV24 | numero quadratico di porte CX | ||
"noaux_hp24" | MCXSynthesisNoAuxHP24 | numero lineare di porte CX; da utilizzare al posto di o "noaux_v24" "gray_code" per | ||
"n_clean_m15" | MCXSynthesisNCleanM15 | al massimo varchi CX | ||
"n_dirty_i15" | MCXSynthesisNDirtyI15 | al massimo varchi CX | ||
"2_clean_kg24" | MCXSynthesis2CleanKG24 | al massimo varchi CX | ||
"2_dirty_kg24" | MCXSynthesis2DirtyKG24 | 0 | 2 | al massimo varchi CX |
"1_clean_kg24" | MCXSynthesis1CleanKG24 | 1 | 0 | al massimo varchi CX |
"1_dirty_kg24" | MCXSynthesis1DirtyKG24 | al massimo varchi CX | ||
"1_clean_b95" | MCXSynthesis1CleanB95 | al massimo varchi CX | ||
"default" | MCXSynthesisDefault | qualsiasi | qualsiasi | sceglie l'algoritmo migliore in base agli accessori disponibili |
MCXSynthesisGrayCode() | Plugin di sintesi per un gate X multicontrollato basato sul codice Gray. |
MCXSynthesisNoAuxV24() | Plugin di sintesi per una porta X multicontrollata basato sull'implementazione di MCPhaseGate,, a sua volta basata sul lavoro di Vale et al. (2024). |
MCXSynthesisNoAuxHP24() | Plugin di sintesi per un gate X multicontrollato basato sull'articolo di Huang e Palsberg. |
MCXSynthesisNCleanM15() | Plugin di sintesi per un gate X multicontrollato basato sull'articolo di Maslov (2016). |
MCXSynthesisNDirtyI15() | Plugin di sintesi per un gate X multicontrollato basato sull'articolo di Iten et al. (2016). |
MCXSynthesis2CleanKG24() | Plugin di sintesi per una porta X multicontrollata basato sull'articolo di Khattar e Gidney (2024). |
MCXSynthesis2DirtyKG24() | Plugin di sintesi per una porta X multicontrollata basato sull'articolo di Khattar e Gidney (2024). |
MCXSynthesis1CleanKG24() | Plugin di sintesi per una porta X multicontrollata basato sull'articolo di Khattar e Gidney (2024). |
MCXSynthesis1DirtyKG24() | Plugin di sintesi per una porta X multicontrollata basato sull'articolo di Khattar e Gidney (2024). |
MCXSynthesis1CleanB95() | Plugin di sintesi per un gate X multicontrollato basato sull'articolo di Barenco et al. (1995). |
MCXSynthesisDefault() | Il plugin di sintesi predefinito per un gate X multicontrollato. |
Sintesi MCMT
Nome del plugin | Classe plugin | Numero di accessori puliti | Numero di ancille sporche | Descrizione |
|---|---|---|---|---|
"vchain" | MCMTSynthesisVChain | utilizza un numero lineare di porte di Toffoli | ||
"noaux" | MCMTSynthesisNoAux | utilizza il meccanismo di controllo standard di Qiskit | ||
"xgate" | MCMTSynthesisXGate | utilizza un numero lineare di porte di Toffoli | ||
"default" | MCMTSynthesisDefault | qualsiasi | qualsiasi | sceglie l'algoritmo migliore in base agli accessori disponibili |
MCMTSynthesisVChain() | Una sintesi basata sulla catena V per MCMTGate. |
MCMTSynthesisNoAux() | Una sintesi basata sulla catena V per MCMTGate. |
MCMTSynthesisXGate() | Una sintesi per MCMTGate con il gate X come gate di base. |
MCMTSynthesisDefault() | Una decomposizione predefinita per le porte MCMT. |
Comparatori di numeri interi
Nome del plugin | Classe plugin | Descrizione | Qubit ausiliari |
|---|---|---|---|
"twos" | IntComparatorSynthesis2s | utilizzare l'addizione con il complemento a due | pulito |
"noaux" | IntComparatorSynthesisNoAux | capovolgere il target controllato su tutti i valori interi consentiti | Nessuna |
"default" | IntComparatorSynthesisDefault | utilizzare l'algoritmo migliore in base ai qubit ausiliari disponibili | qualsiasi |
IntComparatorSynthesis2s() | Un confronto tra numeri interi basato sul complemento 2s. |
IntComparatorSynthesisNoAux() | Un confronto potenzialmente costoso senza qubit ausiliari. |
IntComparatorSynthesisDefault() | La sintesi predefinita per IntegerComparatorGate. |
Somme
Nome del plugin | Classe plugin | Descrizione | Qubit ausiliari |
|---|---|---|---|
"default" | WeightedSumSynthesisDefault | utilizzare una sintesi basata sulla catena V | dato un numero di qubit di som , sono stati utilizzati qubit ausiliari puliti |
WeightedSumSynthesisDefault() | Sintetizza un WeightedSumGate utilizzando l'algoritmo di sintesi predefinito. |
Sintesi dell'evoluzione di Pauli
Nome del plugin | Classe plugin | Descrizione | Connettività mirata |
|---|---|---|---|
"rustiq" | PauliEvolutionSynthesisRustiq | utilizzare il metodo di sintesi della libreria di sintesi dei circuiti Rustiq | da tutti a tutti |
"default" | PauliEvolutionSynthesisDefault | utilizzare un termine di Clifford diagonalizzante per Pauli | da tutti a tutti |
PauliEvolutionSynthesisDefault() | Sintetizza un PauliEvolutionGate utilizzando l'algoritmo di sintesi predefinito. |
PauliEvolutionSynthesisRustiq() | Sintetizza un PauliEvolutionGate utilizzando Rustiq. |
Sintesi modulare dell'addizionatore
Nome del plugin | Classe plugin | Numero di accessori puliti | Descrizione |
|---|---|---|---|
"modular_v17" | ModularAdderSynthesisV17 | un sommatore modulare senza qubit ancillari | |
"ripple_cdkm" | ModularAdderSynthesisC04 | un sommatore a ripple-carry | |
"ripple_vbe" | ModularAdderSynthesisV95 | , per numeri a bit | un sommatore a ripple-carry |
"qft" | ModularAdderSynthesisD00 | un sommatore basato su QFT | |
"default" | ModularAdderSynthesisDefault | qualsiasi | sceglie l'algoritmo migliore in base agli accessori disponibili |
ModularAdderSynthesisV17() | Un sommatore modulare (modulo ) senza qubit ausiliari. |
ModularAdderSynthesisC04() | Un sommatore a ripple-carry, modulo . |
ModularAdderSynthesisD00() | Un sommatore basato su QFT, modulo . |
ModularAdderSynthesisV95() | Un sommatore a ripple-carry, modulo . |
ModularAdderSynthesisDefault() | La sintesi dell'addizionatore modulare predefinito (nessun qubit di carry in, nessun qubit di carry out). |
Sintesi del mezzo sommatore
Nome del plugin | Classe plugin | Numero di accessori puliti | Descrizione |
|---|---|---|---|
"ripple_cdkm" | HalfAdderSynthesisC04 | un sommatore a ripple-carry | |
"ripple_r25" | HalfAdderSynthesisR25 | un sommatore a ripple-carry senza ancillas | |
"ripple_vbe" | HalfAdderSynthesisV95 | , per numeri a bit | un sommatore a ripple-carry |
"qft" | HalfAdderSynthesisD00 | un sommatore basato su QFT | |
"default" | HalfAdderSynthesisDefault | qualsiasi | sceglie l'algoritmo migliore in base agli accessori disponibili |
HalfAdderSynthesisC04() | Un sommatore a ripple-carry con un bit di riporto. |
HalfAdderSynthesisD00() | Un sommatore basato su QFT con un bit di carry-in e uno di carry-out. |
HalfAdderSynthesisV95() | Un sommatore a ripple-carry con un bit di riporto. |
HalfAdderSynthesisR25() | Un sommatore a ripple-carry con un bit di riporto senza qubit ausiliari. |
HalfAdderSynthesisDefault() | La sintesi half-adder predefinita (nessun carry in, ma un qubit carry out). |
Sintesi dell'addizionatore completo
Nome del plugin | Classe plugin | Numero di accessori puliti | Descrizione |
|---|---|---|---|
"ripple_cdkm" | FullAdderSynthesisC04 | un sommatore a ripple-carry | |
"ripple_vbe" | FullAdderSynthesisV95 | , per numeri a bit | un sommatore a ripple-carry |
"default" | FullAdderSynthesisDefault | qualsiasi | sceglie l'algoritmo migliore in base agli accessori disponibili |
FullAdderSynthesisC04() | Un sommatore a ripple-carry con un bit di carry-in e uno di carry-out. |
FullAdderSynthesisV95() | Un sommatore a ripple-carry con un bit di carry-in e uno di carry-out. |
FullAdderSynthesisDefault() | Un sommatore a ripple-carry con un bit di carry-in e uno di carry-out. |
Sintesi moltiplicatrice
Nome del plugin | Classe plugin | Numero di accessori puliti | Descrizione |
|---|---|---|---|
"cumulative" | MultiplierSynthesisH18 | a seconda del sito AdderGate utilizzato | un sommatore cumulativo basato su sommatori controllati |
"qft" | MultiplierSynthesisR17 | un moltiplicatore basato sulla QFT | |
"default" | MultiplierSynthesisDefault | qualsiasi | sceglie l'algoritmo migliore in base agli accessori disponibili |
MultiplierSynthesisH18() | Un moltiplicatore cumulativo basato su sommatori controllati. |
MultiplierSynthesisR17() | Un moltiplicatore basato sulla QFT. |
MultiplierSynthesisDefault() | Il plugin moltiplicatore predefinito. |