Skip to main content
IBM Quantum Platform

TeNPy Backend TEBD

qiskit_addon_mpf.backends.tenpy_tebd

A tenpy-basé sur le TEBD.

Attention

La dépendance optionnelle TeNPy était auparavant proposée sous une licence GPLv3. Depuis la publication de v1.0.4 le 2 octobre 2024, il est proposé sous la licence Apache v2. La licence de ce paquet n'est compatible qu'avec les versions de TeNPy sous licence Apache.

Avertissement

Ce backend n'est disponible que si les dépendances optionnelles ont été installées :

pip install "qiskit-addon-mpf[tenpy]"
TEBDEvolverUn algorithme TEBD pour l'évolution d'un MPO interne.
MPOStateUne classe médiatrice pour que TeNPy's MPO corresponde à l'interface State l'interface.
MPS_neel_stateConstruit l'état Néel comme un MPS.

Méthode sous-jacente

Ce module fournit un backend à évolution temporelle pour calculer les coefficients MPF dynamiques basés sur l'algorithme de décimation par blocs à évolution temporelle (TEBD) [1] mis en œuvre dans la bibliothèque du réseau tensoriel tenpy bibliothèque de réseau tensoriel.

Les classes fournies par ce module ont deux objectifs :

  1. La mise en relation tenpyà l'interface définie par qiskit_addon_mpf.backends.
  2. Étendre l'implémentation de la TEBD de tenpypour gérer un état MPO interne (plutôt que MPS) (voir aussi State pour plus de détails).

Dans le sens le plus simple, ce module fournit une extension directe de l'algorithme TEBD pour faire évoluer un état MPO interne. Ainsi, si vous souhaitez utiliser ce backend pour votre algorithme MPF dynamique, vous devez encoder l'hamiltonien que vous souhaitez faire évoluer dans le temps, sous une forme native tenpy-forme native. Pour être plus concret, la classe TEBDEvolver (qui est une sous-classe de tenpy.algorithms.tebd.TEBDEngine) travaille avec un hamiltonien sous la forme d'un Model. TeNPy fournit un certain nombre de méthodes pratiques pour construire de tels hamiltoniens dans son module tenpy.models module. Si aucune de ces méthodes ne répond à vos besoins, vous pouvez envisager d'utiliser la classe LayerModel qui implémente certaines méthodes de conversion d'objets natifs de Qiskit.


Exemple de code

Cette section présente un exemple simple qui vous permettra de commencer à utiliser ce backend. L'exemple montre comment créer les trois fonctions d'usine nécessaires à la fonction setup_dynamic_lse().

Tout d'abord, nous définissons l'hamiltonien que nous souhaitons faire évoluer dans le temps. Ici, nous choisissons simplement l'une des méthodes de commodité de tenpyde la société.

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

Ensuite, nous pouvons créer le site identity_factory qui doit correspondre au IdentityStateFactory protocole. Pour ce faire, nous utilisons la méthode de commodité initialize_from_lattice() qui prend comme seule entrée le treillis sous-jacent à l'hamiltonien que nous venons de définir.

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

Nous pouvons maintenant construire les ExactEvolverFactory et ApproxEvolverFactory d'évolution temporelle. Pour ce faire, nous pouvons simplement lier les valeurs prédéfinies de l'initialisateur TEBDEvolver en le réduisant à l'interface correcte attendue par les protocoles des fonctions respectives.

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

Remarquez que nous avons fixé la valeur de dt à un petit pas de temps et que nous avons utilisé une décomposition de Suzuki-Trotter d'ordre supérieur pour imiter l'évolution temporelle exacte ci-dessus.

Ci-dessous, nous ne fixons pas la valeur de dt et n'utilisons qu'une formule de Suzuki-Trotter du second ordre pour l'évolution approximative du temps. En outre, nous spécifions également certains paramètres de troncature.

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

Bien entendu, vous n'êtes pas limité aux exemples présentés ici, et nous vous encourageons à jouer avec les autres paramètres fournis par l'implémentation TeNPy’s TEBDEngine l'implémentation.


Limites

Enfin, nous soulignons quelques limitations connues sur le type d'hamiltoniens qui peuvent être traités par ce backend :

  • toutes les interactions doivent être unidimensionnelles
  • les interactions doivent utiliser des conditions limites finies

Ressources

[1] : https://en.wikipedia.org/wiki/Time-evolving \Nblock\Ndecimation

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.