QDriftTrotterization
class QDriftTrotterization(num_terms, *, filter_trivial=False, rng=None)
Basi: GenericPass[DAGCircuit, DAGCircuit]
Un passaggio di transpilazione per "Trotterizzare" i gate Evolution tramite il protocollo qDRIFT.
Questo passaggio sostituisce l'evoluzione esatta di ciascun gate Evolution con una formula di prodotto casuale: estrae num_terms campioni dai termini dell'Hamiltoniano (o groups, se assegnato), con ciascun termine campionato con una probabilità proporzionale al valore assoluto del proprio coefficiente, ed emette un Evolution gate per ogni campione. Ogni gate campionato evolve il proprio termine (di ampiezza unitaria e che conserva il segno) per lo stesso intervallo di tempo
dove sono i coefficienti dei termini/gruppi campionati. Il prodotto ordinato delle evoluzioni campionate non riproduce esattamente l' ; piuttosto, la sua aspettativa sul campionamento approssima l'evoluzione esatta, con un errore che diminuisce all'aumentare num_terms di. Poiché il risultato dipende dalle estrazioni casuali, varia da un'esecuzione all'altra, a meno che non venga rng specificato un valore fisso.
I termini diagonali nella base occupazione-numero (ovvero i prodotti di operatori numerici) non hanno alcun effetto sulle stringhe di bit campionate, pertanto la loro inclusione non fa altro che aumentare il sovraccarico di campionamento. Filtrarli filter_diagonal_terms() sull’Hamiltoniano prima di costruire il gate Evolution , anziché a ogni chiamata a run(): questa operazione viene eseguita una volta per ogni circuito transpilato, quindi filtrare a monte evita di ripetere lo stesso lavoro di filtraggio per ogni circuito generato dallo stesso Hamiltoniano.
Il protocollo “ qDRIFT ” è stato introdotto in arXiv:1811.08017.
L'inizializzazione di questo passaggio del transpiler può essere effettuata utilizzando gli argomenti elencati di seguito.
Parametri
- num_terms (int) – il numero di termini da campionare per la trotterizzazione di qDRIFT. Questo valore corrisponde al numero di porte
Evolutionemesse per ogni porta di ingresso; un valore più elevato riduce l'errore di trotterizzazione, ma comporta una maggiore profondità del circuito. - filter_trivial (bool) – Quando è impostato su
True, il ciclo di campionamento rifiuta un termine campionato a meno che non associ una modalità nota per essere occupata a una modalità nota per essere libera. Qualsiasi termine che agisca solo all’interno di uno di questi due insiemi non può modificare l’occupazione e, pertanto, non ha alcun effetto su una stringa di bit campionata; di conseguenza, il riestrazione evita di sprecare uno degli slotnum_termssu di esso. Ciò richiede che unaPrepareSlaterDeterminantporta oInitializeModespreceda leEvolutionporte soggette alla trasformata di Trotter (per inizializzare gli insiemi iniziali delle modalità occupate e non occupate); se non se ne trova nessuna, oppure se gli insiemi delle modalità inizializzati risultano interamente occupati o interamente non occupati, il filtraggio viene saltato per quella porta eUserWarningviene invece emesso un. Anche ogni gateOrbitalRotationincontrato prima o tra i gateEvolutionaggiorna questi insiemi: ogni modo su cui agisce diventa “incerto” (poiché la rotazione può mescolarlo con qualsiasi altro modo con cui entra in contatto), proprio come un modo su cui agisce un termine “ qDRIFT ” accettato. Un gatePrepareSlaterDeterminantaggiorna questi insiemi nello stesso modo in cui lo farebbero i suoiOrbitalRotationcomponenti eInitializeModesse applicati in sequenza: genera gli insiemi occupati/non occupati a partire dal suooccupation, quindi contrassegna immediatamente ogni modalità su cui agisce come “incerta” a causa della sua rotazione. Per conoscere la regola di accettazione esatta, consultare la stringarun()di documentazione. - rng (np.random.Generator | int | None) – il generatore di numeri casuali (RNG) da utilizzare. Quando si tratta di un
int, l'RNG interno verrà inizializzato connp.random.default_rng(seed=rng).
Attributi
MAX_SAMPLE_RETRIES
Valore predefinito: 1000000
Il numero massimo di campioni rifiutati consecutivi tollerati da filter_trivial prima che run() si arrenda e generi un RuntimeError. Ciò impedisce che si verifichi un ciclo infinito quando i termini rimanenti dell'Hamiltoniano non sono in grado di collegare gli insiemi di modi occupati/non occupati monitorati — ad esempio, quando entrambi gli insiemi rimangono piccoli e disgiunti (pochi modi sono stati contrassegnati come occupati o non occupati e nessuno è ancora diventato “incerto”) e il supporto di nessun termine rimanente tocca entrambi.
num_terms
Il numero di termini da includere nel modello " qDRIFT " (Trotterizzazione).
filter_trivial
Se scartare i termini campionati che non possono influire sulla stringa di bit campionata (vedere la stringa di documentazione della classe relativa all’argomento filter_trivial ).
Metodi
run
run(dag)
Esegue questo ciclo di transpilazione.
Ogni Evolution nodo viene sostituito da gate Evolution a termine singolo num_terms campionati (vedere la stringa di documentazione della classe). I nodi che non sono gate Evolution vengono copiati in uscita senza modifiche. Poiché il campionamento è casuale, il risultato varia da un'esecuzione all'altra, a meno che non rng sia stato specificato un seme.
Quando filter_trivial è impostato, questo metodo tiene traccia degli insiemi di modi che si sa essere occupati o non occupati, a partire da una o più InitializeModes porte che precedono le Evolution porte nel circuito (diverse porte di questo tipo disposte in parallelo, ad esempio una per ogni settore di spin, vengono accumulate insieme). Un termine campionato viene accettato solo se il suo supporto interseca entrambi gli insiemi, ovvero se associa una modalità nota come occupata a una nota come libera; in caso contrario viene scartato e ricampionato, poiché non può influire sulla stringa di bit campionata. Una volta accettato un termine, ogni modalità che lo supporta diventa “incerta” e viene aggiunta a entrambi gli insiemi, rendendola idonea a ricoprire entrambi i ruoli nei campioni successivi. Qualsiasi porta OrbitalRotation presente nel circuito aggiorna questi insiemi allo stesso modo: ogni modalità su cui agisce diventa a sua volta “incerta”, poiché la rotazione potrebbe mescolarla con qualsiasi altra modalità presente nel suo supporto. Una porta PrepareSlaterDeterminant logica viene considerata come la somma delle sue OrbitalRotation componenti e InitializeModes applicate in sequenza: la prima occupation determina gli insiemi occupati/non occupati, e poi ogni modalità su cui agisce viene immediatamente contrassegnata come “incerta”, poiché comporta anche una rotazione.
Parametri
dag (DAGCircuit) – il circuito di ingresso con istruzioni basate sui fermioni. Sono op supportate solo le istanze FermionicGate come quelle indicate DAGOpNode .
Risultati
Il circuito di uscita, che continua ad agire su un registro fermionico.
Aumenti
RuntimeError – se è filter_trivial True e campioni consecutivi MAX_SAMPLE_RETRIES vengono scartati senza che sia stato individuato un termine non banale da emettere.
Tipo di restituzione
Metodi ereditati
execute
execute(passmanager_ir, state, callback=None)
Esegui l'operazione di ottimizzazione per l'IR di Qiskit in ingresso.
Parametri
- passmanager_ir (IR) – Qiskit IR da ottimizzare.
- state (PassManagerState) – Stato associato all'esecuzione del flusso di lavoro da parte dello stesso gestore dei passaggi.
- callback (Callable[[Task, IR_OUT, PropertySet, float, int], None] | None) – Una funzione di callback che viene chiamata ogni volta che viene eseguita un'attività di ottimizzazione.
Risultati
IR ottimizzato di Qiskit e stato del flusso di lavoro.
Tipo di restituzione
tupla [ IR_OUT, PassManagerState ]
name
update_status
update_status(state, run_state)
Aggiornare lo stato del flusso di lavoro.
Parametri
- state (PassManagerState) – Passare lo stato del gestore per l'aggiornamento.
- run_state (RunState) – Stato di completamento dell'attività corrente.
Risultati
Stato del gestore dei pass aggiornato.
Tipo di restituzione