Evoluzione
class Evolution(num_modes, operator, time=1.0, *, synthesis=None, atomic=False)
Basi: FermionicGate
Implementa l'evoluzione temporale di un operatore.
Dato un operator fermionico e un’evoluzione time , questo gate implementa l’operatore unitario
Affinché l’ e sia unitario, l’ e deve essere ermitiano. Ciò è di responsabilità di chi chiama e non viene verificato.
La suddivisione di questo gate nello spazio fermionico (in un circuito composto da gate Evolution più piccoli) è facoltativa, ed è proprio ciò che regola l'attributo synthesis . Il gate può anche essere trasmesso direttamente alla fase “da fermione a qubit”, che lo mappa e lo sintetizza nella sua interezza, indipendentemente dal numero di termini che operator contiene. Vedi synthesis.
Quando viene scomposto (ad esempio da ) decompose(), è che ne determina synthesis le modalità. Il valore predefinito è FermionicLieTrotter, che suddivide l'evoluzione per gruppi quando a operator è groups assegnato (vedi Termini dell'operatore di gruppo: utilizzare la struttura dell'operatore ), e per termini nel caso contrario (esatto solo quando i singoli fattori commutano tra loro). Il processo di transpilazione può alterare ulteriormente la decomposizione; ad esempio QDriftTrotterization, sostituisce l’evoluzione con un campione casuale dei suoi termini. I campi che emette sono atomic, quindi non synthesis si applica più a essi.
Il percorso di simulazione del vettore di stato non passa per synthesis: eleva all’esponenziale l’intero vettore esattamente operator . La simulazione di questo gate non comporta quindi alcun errore di Trotter, mentre un circuito scomposto in genere ne presenta.
L'inizializzazione di un'istanza di questo gate può essere effettuata utilizzando gli argomenti elencati di seguito.
Parametri
- num_modes (int) – il numero di modi fermionici su cui agisce questo gate.
- operator (OperatorTrait) – l'operatore ermitiano in base al quale far evolvere nel tempo le modalità fermioniche su cui agisce.
- time (float) – il tempo di evoluzione inserendo l'esponente di . Un valore negativo fa tornare indietro il tempo.
- synthesis (FermionicEvolutionSynthesis | None) – il metodo di sintesi da fermione a fermione con cui scomporre questo gate, ammesso che possa essere scomposto. Se
None(impostazione predefinita), viene utilizzata un'istanzaFermionicLieTrotterdi. - atomic (bool) – se questo cancello sia un fattore completamente scomposto che non deve essere ulteriormente scomposto nello spazio fermionico. Vedi
atomic.
Attributi
atomic
Se questo gate sia un fattore che non deve essere scomposto ulteriormente.
A contrassegna FermionicEvolutionSynthesis i fattori che emette come atomici, poiché sono il risultato della scissione che ha scelto di effettuare: scomporli ulteriormente significherebbe rinunciare a quella scelta. L'evoluzione di un termine a operatore singolo è atomica per la ragione, ancora più valida, che non c'è più nulla da scomporre.
Un gate atomico non ha alcuna definizione, quindi lo si lascia decompose() così com'è invece di approfondirlo. A livello di fermioni-qubit, la mappatura e la sintesi avvengono ancora normalmente: è proprio lì che un fattore viene tradotto in operazioni concrete.
È di sola lettura, per lo stesso motivo di synthesis.
synthesis
Il metodo di sintesi da fermione a fermione con cui viene scomposta questa porta logica.
Si tratta di un elemento di sola lettura: la definizione del gate viene generata una volta sola e poi memorizzata nella cache, quindi un metodo di sintesi assegnato successivamente non potrebbe avere effetto. Passalo invece al costruttore.
operator
L'operatore in base al quale far evolvere nel tempo le modalità fermioniche su cui agisce.
Metodi
inverse
inverse(annotated=False)
Restituisce l'inverso di questa porta, .
Parametri
annotated (bool) – ignorato. L'inverso di questa porta è un'altra Evolution, quindi non deve mai essere un AnnotatedOperation.
Risultati
Un gate Evolution che evolve lo stesso operatore per un tempo invertito.
Tipo di restituzione
Metodi del protocollo
_apply_unitary_placed_
_apply_unitary_placed_(vec, norb, nelec, copy, freg_indices)
Si applica exp(-i * time * operator) dopo aver riassegnato l'operatore alle modalità globali.
L'operatore viene riassegnato alle sue modalità globali, convertito in un e ffsim.FermionOperator passato a ffsim.linear_operator(), quindi applicato al vettore tramite scipy.sparse.linalg.expm_multiply(). Un operatore che non sia già un FermionOperator viene prima convertito tramite il protocollo SupportsFermionOperator , in modo che qualsiasi tipo di operatore di questo pacchetto possa essere evoluto.
Parametri
- vec (np.ndarray) – il vettore di stato su cui agire.
- norb (int) – il numero di orbitali spaziali del vettore di stato globale.
- nelec (int |tuple[int, int]) – o un singolo numero intero per un sistema senza spin, oppure una coppia di numeri interi che indicano il numero di fermioni con spin alfa e beta. Un numero intero indica l'interpretazione senza spin delle modalità (le modalità
norbdell'operatore sono orbitali alfa); una coppia indica l'interpretazione(orb, spin)con spin delle modalità2 * norbdell'operatore. - copy (bool) – se copiare il vettore prima di eseguire operazioni su di esso.
- freg_indices (list[int]) – gli indici delle modalità assolute (globali) a cui si mappano le modalità locali di questo gate. L'operatore viene riassegnato dalle sue modalità locali a queste modalità globali prima di essere applicato, rispecchiando il passaggio di sintesi del transpiler.
Risultati
Il vettore trasformato.
Aumenti
- MissingOptionalLibraryError – se ffsim non è installato.
- ValueError – se l'operatore non conserva il settore
(norb, nelec). L'evoluzione sotto produce un operatore unitarioexp(-i * time * operator)solo quandooperatormappa il settore su se stesso, quindi ffsim rifiuta un operatore che non conservi né il numero di particelle né la componente z dello spin.
Tipo di restituzione
np.ndarray