MPF dinamici
qiskit_addon_mpf.dynamic
Coefficienti MPF dinamici.
Questo modulo fornisce la funzione generatrice per il sistema di equazioni lineari (LSE) per il calcolo dei coefficienti MPF dinamici (cioè dipendenti dal tempo).
setup_dynamic_lse
setup_dynamic_lse(trotter_steps, time, identity_factory, exact_evolver_factory, approx_evolver_factory, initial_state)
Restituisce il sistema di equazioni lineari per il calcolo dei coefficienti MPF dinamici.
Questa funzione utilizza l'algoritmo DynamicMPF per calcolare le componenti della matrice di Gram (LSE.A, in [1] e [2] ) e del vettore di sovrapposizione (LSE.b, in [1] e [2] ) per i parametri di evoluzione temporale forniti.
Gli elementi della matrice di Gram, , e del vettore di sovrapposizione, , sono definiti come
dove è lo stato di evoluzione temporale esatto al tempo e è lo stato di evoluzione temporale approssimato utilizzando passi di Trotter.
Calcolare i coefficienti MPF dinamici (cioè dipendenti dal tempo) da e equivale a trovare una soluzione alla formula LSE (analogamente a come vengono calcolati i coefficienti static MPF), rispettando il vincolo che tutti i coefficienti devono avere somma 1 ( ), che non viene applicato in questo LSE (a differenza del caso statico). I problemi di ottimizzazione che includono questo vincolo aggiuntivo sono documentati nel modulo costs modulo. Quello suggerito da [1] e [2] è il setup_frobenius_problem().
La valutazione di ogni elemento e richiede il calcolo della sovrapposizione tra due stati di evoluzione temporale. L'algoritmo DynamicMPF lo fa per mezzo di calcoli di reti tensoriali, forniti da una delle dipendenze opzionali. I backend disponibili sono elencati e spiegati in dettaglio nel modulo backends modulo.
Di seguito, viene fornito un esempio che utilizza il quimb_tebd backend. Spieghiamo brevemente ogni elemento.
Per prima cosa, inizializziamo una semplice Hamiltoniana di Heisenberg che vogliamo far evolvere nel tempo. Poiché utilizziamo un time-evolver basato su quimb, inizializziamo anche l'hamiltoniana utilizzando quella libreria.
>>> from quimb.tensor import ham_1d_heis
>>> num_qubits = 10
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)Quindi, definiamo il numero di passi di Trotter che compongono il nostro MPF, il tempo di evoluzione target e lo stato iniziale ( in [1] e in [2], rispettivamente) rispetto al quale si calcola la sovrapposizione tra gli stati dell'evoluzione temporale. In questo caso, utilizziamo semplicemente lo stato di Néel, che costruiamo anche utilizzando quimb:
>>> trotter_steps = [3, 4]
>>> time = 0.9>>> from quimb.tensor import MPS_neel_state
>>> initial_state = MPS_neel_state(num_qubits)Poiché dobbiamo eseguire l'intero DynamicMPF per calcolare ogni elemento di e , dobbiamo fornire metodi di fabbrica per inizializzare gli argomenti di ingresso delle istanze DynamicMPF istanze. A tal fine, dobbiamo fornire tre funzioni. Per costruirli, utilizzeremo la funzione functools.partial() funzione.
>>> from functools import partialPer prima cosa, abbiamo bisogno di una funzione per inizializzare uno stato di evoluzione temporale vuoto (vedere anche DynamicMPF.evolution_state per maggiori dettagli). Questa funzione costruttore non può accettare argomenti posizionali o parole chiave e deve restituire un oggetto State oggetto.
>>> from qiskit_addon_mpf.backends.quimb_tebd import MPOState
>>> from quimb.tensor import MPO_identity
>>> identity_factory = lambda: MPOState(MPO_identity(num_qubits))La seconda e la terza funzione devono costruire i motori di evoluzione temporale di sinistra e di destra (vedi anche DynamicMPF.lhs e DynamicMPF.rhs per maggiori dettagli). Queste funzioni devono seguire i parametri ExactEvolverFactory e ApproxEvolverFactory rispettivamente.
La funzione ExactEvolverFactory deve prendere un oggetto State come unico argomento posizionale e deve restituire un oggetto Evolver che sarà usato per calcolare l'LHS degli elementi di (cioè dovrebbe produrre lo stato esatto dell'evoluzione temporale, ).
Qui approssimiamo lo stato esatto evoluto nel tempo con una formula di Suzuki-Trotter del quarto ordine, utilizzando un piccolo passo temporale di 0.05. Specifichiamo inoltre alcune quimb-opzioni di troncamento specifiche per limitare la dimensione massima dei legami della rete tensoriale sottostante e i valori singolari minimi dei legami della rete tensoriale divisa.
>>> from qiskit_addon_mpf.backends.quimb_tebd import TEBDEvolver
>>> exact_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... dt=0.05,
... order=4,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )La funzione ApproxEvolverFactory deve accettare anche un oggetto State come unico argomento posizionale e in aggiunta un argomento chiave chiamato dt per specificare il passo temporale dell'evoluzione del tempo. Dovrebbe inoltre restituire un Evolver che produce gli stati approssimati dell'evoluzione temporale, , dove è determinato dal passo temporale scelto, dt. Di conseguenza, queste istanze saranno utilizzate per calcolare l'RHS di ed entrambi i lati degli elementi di .
In questo caso, utilizziamo una formula di Suzuki-Trotter del secondo ordine con le stesse impostazioni di troncamento di prima.
>>> approx_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... order=2,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )Infine, possiamo inizializzare ed eseguire la funzione setup_dynamic_lse() per ottenere il risultato LSE descritto in alto.
>>> from qiskit_addon_mpf.dynamic import setup_dynamic_lse
>>> lse = setup_dynamic_lse(
... trotter_steps,
... time,
... identity_factory,
... exact_evolver_factory,
... approx_evolver_factory,
... initial_state,
... )
>>> print(lse.A)
[[1. 0.99998513]
[0.99998513 1. ]]
>>> print(lse.b)
[1.00001585 0.99998955]Parametri
- trotter_steps (list[int]) – la sequenza di passi di trotto da utilizzare.
- time (float) – il tempo totale di evoluzione dell'obiettivo.
- identity_factory (IdentityStateFactory) – una funzione per generare un oggetto
Stateoggetto vuoto. - exact_evolver_factory (ExactEvolverFactory) – una funzione per inizializzare l'istanza
Evolverche produce lo stato di evoluzione temporale esatto, . - approx_evolver_factory (ApproxEvolverFactory) – una funzione per inizializzare l'istanza
Evolverche produce lo stato approssimativo dell'evoluzione temporale, , per diversi valori di a seconda del passo temporale fornito,dt. - initial_state (Any) – lo stato iniziale ( o ) rispetto al quale calcolare gli elementi di
LSE.Ae diLSE.b. Il tipo di questo oggetto deve corrispondere al backend della rete tensoriale scelto per gli argomenti precedenti.
Risultati
Il LSE per trovare i coefficienti MPF dinamici come descritto sopra.
Tipo di restituzione
Riferimenti
[1] : S. Zhuk et al, Fisico. Rev. Research 6, 033309 (2024).
https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309
[2] : N. Robertson et al, arXiv:2407.17405v2 (2024).
Protocolli di fabbrica
I protocolli seguenti definiscono le firme delle funzioni per i vari argomenti della fabbrica di oggetti.
IdentityStateFactory
class IdentityStateFactory(*args, **kwargs)
Basi: Protocol
Il protocollo della funzione factory per la costruzione di un'istanza di identità State istanza.
Come spiegato in dettaglio in setup_dynamic_lse()questa funzione di fabbrica viene chiamata per inizializzare l'oggetto DynamicMPF.evolution_state con un'identità o uno stato vuoto. Questa funzione non deve accettare alcun argomento e deve restituire un'istanza State istanza.
ExactEvolverFactory
class ExactEvolverFactory(*args, **kwargs)
Basi: Protocol
Il protocollo della funzione factory per la costruzione di un'istanza esatta Evolver istanza.
Come spiegato in dettaglio in setup_dynamic_lse()questa funzione factory viene chiamata per inizializzare le istanze di DynamicMPF.lhs istanze di Evolver che producono lo stato di evoluzione temporale esatto, , quando si calcolano gli elementi .
ApproxEvolverFactory
class ApproxEvolverFactory(*args, **kwargs)
Basi: Protocol
Il protocollo della funzione di fabbrica per la costruzione di un'istanza approssimativa Evolver istanza.
Come spiegato in dettaglio in setup_dynamic_lse()questa funzione factory viene chiamata per inizializzare le istanze di DynamicMPF.rhs di Evolver quando si calcolano gli elementi o entrambi i lati (DynamicMPF.lhs e DynamicMPF.rhs) quando si calcolano gli elementi . Poiché questi stati di evoluzione temporale approssimata dipendono dal passo di Trotter ( ), questa funzione richiede che il passo temporale dell'evoluzione temporale sia fornito come argomento della parola chiave dt.
Algoritmo di base
DynamicMPF
class DynamicMPF(evolution_state, lhs, rhs)
Basi: object
L'algoritmo MPF dinamico.
Istanziato con un LHS e un RHS Evolver questo algoritmo evolve() un'evoluzione condivisa State fino a un tempo di evoluzione prefissato. In seguito, il DynamicMPF.overlap() del tempo evoluto State con un certo stato iniziale può essere calcolato. Si veda setup_dynamic_lse() per una spiegazione più dettagliata di come viene utilizzato per calcolare gli elementi e che compongono i coefficienti MPF dinamici LSE dei coefficienti MPF dinamici.
Riferimenti
[1] : S. Zhuk et al, Fisico. Rev. Research 6, 033309 (2024).
https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309
[2] : N. Robertson et al, arXiv:2407.17405 (2024).
https://arxiv.org/abs/2407.17405
Costruire un DynamicMPF istanza.
Parametri
- evolution_state (State) – lo stato che deve essere condiviso dai motori di evoluzione temporale LHS e RHS.
- lhs (Evolver) – il motore di evoluzione temporale LHS.
- rhs (Evolver) – il motore di evoluzione temporale RHS.
TEMPO_DECIMALI
Tipo: int
Valore predefinito: 8
Il numero di cifre decimali utilizzate per arrotondare i tempi di evoluzione.
Durante l'evoluzione temporale del motore evolution_state, spesso si confrontano i tempi di evoluzione dei motori LHS e RHS tra loro e con il tempo di evoluzione dell'obiettivo. Questi controlli confrontano i numeri in virgola mobile e questa impostazione specifica il numero di cifre decimali a cui arrotondare.
evolution_state
Lo stato condiviso tra i motori di evoluzione temporale LHS e RHS.
evolve
evolve(time)
Evolvere l'algoritmo MPF dinamico fino al tempo previsto.
Questo esegue effettivamente l'algoritmo MPF dinamico con un'evoluzione temporale DynamicMPF.evolution_state fino al tempo specificato, utilizzando le istanze LHS e RHS Evolver istanze.
Parametri
time (float) – il tempo totale di evoluzione dell'obiettivo.
Aumenti
RuntimeError - se i tempi evoluti di LHS e RHS non sono uguali alla fine.
Tipo di restituzione
Nessuna
lhs
Il motore di evoluzione temporale LHS.
overlap
overlap(initial_state)
Calcolare la sovrapposizione di DynamicMPF.evolution_state con lo stato fornito.
Il tipo di initial_state fornito dipenderà dal backend scelto e utilizzato per i file State e Evolver fornite a questa istanza DynamicMPF istanza. In altre parole, un backend può supportare solo un tipo specifico di oggetti initial_state per il calcolo della sovrapposizione. Si vedano anche le spiegazioni dell'argomento initial_state del metodo setup_dynamic_lse() per maggiori dettagli.
Parametri
initial_state (Any) – lo stato iniziale con cui calcolare la sovrapposizione.
Aumenti
TypeError - se lo stato iniziale fornito ha un tipo incompatibile.
Risultati
La sovrapposizione di DynamicMPF.evolution_state con quello fornito.
Tipo di restituzione
rhs
Il motore di evoluzione temporale RHS.