Backend Quimb TEBD
qiskit_addon_mpf.backends.quimb_tebd
A quimb-basé sur le TEBD.
Ce backend n'est disponible que si les dépendances optionnelles ont été installées :
pip install "qiskit-addon-mpf[quimb]"TEBDEvolver | Un algorithme TEBD pour l'évolution d'un MPO interne. |
MPOState | Un MPO appliquant le gabarit Vidal. |
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 quimb bibliothèque de réseau tensoriel.
Les classes fournies par ce module ont deux objectifs :
- La mise en relation
quimbà l'interface définie parqiskit_addon_mpf.backends. - Étendre l'implémentation de la TEBD de
quimbpour gérer un état MPO interne (plutôt que MPS) (voir aussiStatepour 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 quimb-forme native. Pour être plus concret, la classe TEBDEvolver (qui est une sous-classe de quimb.tensor.TEBD) travaille avec un hamiltonien sous la forme d'un quimb.tensor.LocalHam1D. Quimb fournit un certain nombre de méthodes pratiques pour construire de tels hamiltoniens dans son module quimb.tensor.tensor_builder 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 créons le site identity_factory qui doit correspondre au IdentityStateFactory protocole. Pour ce faire, il suffit d'utiliser la fonction quimb.tensor.MPO_identity() et en enveloppant la fonction quimb.tensor.MatrixProductOperator avec notre interface MPOState personnalisée.
>>> from qiskit_addon_mpf.backends.quimb_tebd import MPOState
>>> from quimb.tensor import MPO_identity
>>> num_qubits = 10
>>> identity_factory = lambda: MPOState(MPO_identity(num_qubits))Ensuite, avant de pouvoir définir les ExactEvolverFactory et ApproxEvolverFactory nous devons définir l'hamiltonien que nous souhaitons faire évoluer dans le temps. Ici, nous choisissons simplement l'une des méthodes de commodité de quimbde la société.
>>> from quimb.tensor import ham_1d_heis
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)Nous pouvons maintenant construire les usines d'instances d'évolution temporelle exacte et approximative. Pour ce faire, nous pouvons simplement utiliser functools.partial() pour lier les valeurs prédéfinies de l'initialisateur TEBDEvolver en le réduisant à l'interface correcte telle qu'attendue par l'initialisateur ExactEvolverFactory et ApproxEvolverFactory respectivement.
>>> from functools import partial
>>> from qiskit_addon_mpf.backends.quimb_tebd import TEBDEvolver
>>> exact_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... dt=0.05,
... order=4,
... )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,
... H=hamil,
... order=2,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )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'application quimb.tensor.TEBD et nous vous encourageons à jouer avec les autres paramètres fournis par l'implémentation de l'application.
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 être acyliques
Ressources
[1] : https://en.wikipedia.org/wiki/Time-evolving \Nblock\Ndecimation