Skip to main content
IBM Quantum Platform

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)

GitHub

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, MM in [1] e [2] ) e del vettore di sovrapposizione (LSE.b, LL in [1] e [2] ) per i parametri di evoluzione temporale forniti.

Gli elementi della matrice di Gram, MijM_{ij}, e del vettore di sovrapposizione, LiL_i, sono definiti come

Mij=Tr(ρki(t)ρkj(t)),Li=Tr(ρ(t)ρki(t)),\begin{split}M_{ij} &= \text{Tr}(\rho_{k_i}(t)\rho_{k_j}(t)) \, , \\ L_i &= \text{Tr}(\rho(t)\rho_{k_i}(t)) \, ,\end{split}

dove ρ(t)\rho(t) è lo stato di evoluzione temporale esatto al tempo tt e ρki(t)\rho_{k_i}(t) è lo stato di evoluzione temporale approssimato utilizzando kik_i passi di Trotter.

Calcolare i coefficienti MPF dinamici (cioè dipendenti dal tempo) da MM e LL 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 ( ixi=1\sum_i x_i = 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 MijM_{ij} e LiL_i 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\psi_{in} in [1] e ψ0\psi_0 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 MijM_{ij} e LiL_i, 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 partial

Per 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 LiL_i (cioè dovrebbe produrre lo stato esatto dell'evoluzione temporale, ρ(t)\rho(t) ).

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, ρki(t)\rho_{k_i}(t), dove kik_i è determinato dal passo temporale scelto, dt. Di conseguenza, queste istanze saranno utilizzate per calcolare l'RHS di LiL_i ed entrambi i lati degli elementi di MijM_{ij}.

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 State oggetto vuoto.
  • exact_evolver_factory (ExactEvolverFactory) – una funzione per inizializzare l'istanza Evolver che produce lo stato di evoluzione temporale esatto, ρ(t)\rho(t).
  • approx_evolver_factory (ApproxEvolverFactory) – una funzione per inizializzare l'istanza Evolver che produce lo stato approssimativo dell'evoluzione temporale, ρki(t)\rho_{k_i}(t), per diversi valori di kik_i a seconda del passo temporale fornito, dt.
  • initial_state (Any) – lo stato iniziale ( ψin\psi_{in} o ψ0\psi_0 ) rispetto al quale calcolare gli elementi MijM_{ij} di LSE.A e LiL_i di LSE.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

LSE

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).

https://arxiv.org/abs/2407.17405v2


Protocolli di fabbrica

I protocolli seguenti definiscono le firme delle funzioni per i vari argomenti della fabbrica di oggetti.

IdentityStateFactory

class IdentityStateFactory(*args, **kwargs)

GitHub

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)

GitHub

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, ρ(t)\rho(t), quando si calcolano gli elementi LiL_i.

ApproxEvolverFactory

class ApproxEvolverFactory(*args, **kwargs)

GitHub

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 LiL_i o entrambi i lati (DynamicMPF.lhs e DynamicMPF.rhs) quando si calcolano gli elementi MijM_{ij}. Poiché questi stati di evoluzione temporale approssimata dipendono dal passo di Trotter ( ρki(t)\rho_{k_i}(t) ), 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)

GitHub

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 MijM_{ij} e LiL_i 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)

GitHub

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)

GitHub

Calcolare la sovrapposizione di DynamicMPF.evolution_state con lo stato fornito.

Avvertenza

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

complesso

rhs

Il motore di evoluzione temporale RHS.

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.