Skip to main content
IBM Quantum Platform

TeNPy Backend TEBD

qiskit_addon_mpf.backends.tenpy_tebd

A tenpy-basato sul backend TEBD.

Attenzione

La dipendenza opzionale TeNPy era precedentemente offerta con una licenza GPLv3. A partire dal rilascio di v1.0.4 il 2 ottobre 2024, è stato offerto con la licenza Apache v2. La licenza di questo pacchetto è compatibile solo con le versioni con licenza Apache di TeNPy.

Avvertenza

Questo backend è disponibile solo se le dipendenze opzionali sono state installate:

pip install "qiskit-addon-mpf[tenpy]"
TEBDEvolverUn algoritmo TEBD per l'evoluzione di un MPO interno.
MPOStateUna classe mediatore per far sì che TeNPy's MPO corrisponda all'interfaccia State interfaccia.
MPS_neel_stateCostruisce lo stato Néel come MPS.

Metodo sottostante

Questo modulo fornisce un backend a evoluzione temporale per il calcolo dei coefficienti MPF dinamici basato sull'algoritmo di decimazione a blocchi a evoluzione temporale (TEBD) [1] implementato nella libreria di reti tensoriali tenpy libreria di reti tensoriali.

Le classi fornite da questo modulo hanno due scopi:

  1. Collegando tenpyall'interfaccia definita da qiskit_addon_mpf.backends.
  2. Estendere l'implementazione tenpyl'implementazione di TEBD per gestire uno stato interno MPO (piuttosto che MPS) (si veda anche State per maggiori dettagli).

Nel senso più semplice, questo modulo fornisce un'estensione semplice dell'algoritmo TEBD per far evolvere uno stato interno di MPO. Pertanto, se si desidera utilizzare questo backend per il proprio algoritmo MPF dinamico, è necessario codificare l'hamiltoniana che si desidera far evolvere nel tempo, in forma tenpy-forma nativa. Per essere più concreti, la classe TEBDEvolver (che è una sottoclasse di tenpy.algorithms.tebd.TEBDEngine) lavora con un'Hamiltoniana nella forma di un Model. TeNPy fornisce una serie di metodi di convenienza per la costruzione di tali hamiltoniani nel suo modulo tenpy.models modulo. Se nessuna di queste soddisfa le vostre esigenze, potete considerare l'utilizzo della classe LayerModel che implementa alcuni metodi di conversione da oggetti nativi di Qiskit.


Esempio di codice

Questa sezione mostra un semplice esempio per iniziare a usare questo backend. L'esempio mostra come creare le tre funzioni di fabbrica necessarie per il file setup_dynamic_lse().

Innanzitutto, definiamo l'hamiltoniana che vogliamo far evolvere nel tempo. In questo caso, si sceglie semplicemente uno dei metodi tenpydi uno dei metodi di convenienza.

>>> from tenpy.models import XXZChain2
>>> hamil = XXZChain2(
...     {
...         "L": 10,
...         "Jz": 0.8,
...         "Jxx": 0.7,
...         "hz": 0.3,
...         "bc_MPS": "finite",
...         "sort_charge": False,
...     }
... )

Successivamente, possiamo creare il sito identity_factory , che deve corrispondere al protocollo IdentityStateFactory protocollo. Lo facciamo utilizzando il metodo di convenienza initialize_from_lattice() che prende come unico input il reticolo sottostante l'hamiltoniana appena definita.

>>> from functools import partial
>>> from qiskit_addon_mpf.backends.tenpy_tebd import MPOState
>>> identity_factory = partial(MPOState.initialize_from_lattice, hamil.lat),

Si possono ora costruire gli elementi ExactEvolverFactory e ApproxEvolverFactory dell'evoluzione temporale. Per fare ciò, possiamo semplicemente vincolare i valori predefiniti dell'inizializzatore TEBDEvolver riducendolo all'interfaccia corretta prevista dai rispettivi protocolli di funzione.

>>> from qiskit_addon_mpf.backends.tenpy_tebd import TEBDEvolver
>>> exact_evolver_factory = partial(
...     TEBDEvolver,
...     model=hamil,
...     dt=0.05,
...     options={
...         "order": 4,
...         "preserve_norm": False,
...     },
... )

Si noti come abbiamo fissato il valore di dt a un piccolo passo temporale e abbiamo utilizzato una decomposizione Suzuki-Trotter di ordine superiore per imitare l'esatta evoluzione temporale di cui sopra.

Di seguito, non fissiamo il valore di dt e utilizziamo solo una formula di Suzuki-Trotter del secondo ordine per l'evoluzione temporale approssimata. Inoltre, specifichiamo anche alcune impostazioni di troncamento.

>>> approx_evolver_factory = partial(
...     TEBDEvolver,
...     model=hamil,
...     options={
...         "order": 2,
...         "preserve_norm": False,
...         "trunc_params": {
...             "chi_max": 10,
...             "svd_min": 1e-5,
...             "trunc_cut": None,
...         },
...     },
... )

Naturalmente, non ci si può limitare agli esempi qui illustrati e si consiglia di giocare con le altre impostazioni fornite dall'implementazione TeNPy’s TEBDEngine implementazione.


Limitazioni

Infine, segnaliamo alcune limitazioni note sul tipo di hamiltoniani che possono essere trattati da questo backend:

  • tutte le interazioni devono essere unidimensionali
  • le interazioni devono utilizzare condizioni al contorno finite

Risorse

[1]: https://en.wikipedia.org/wiki/Time-evolving _block_decimation

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