Skip to main content
IBM Quantum Platform

MPF dynamiques

qiskit_addon_mpf.dynamic

Coefficients MPF dynamiques.

Ce module fournit la fonction génératrice du système linéaire d'équations (LSE) pour le calcul des coefficients MPF dynamiques (c'est-à-dire dépendant du temps).

setup_dynamic_lse

setup_dynamic_lse(trotter_steps, time, identity_factory, exact_evolver_factory, approx_evolver_factory, initial_state)

GitHub

Renvoie le système d'équations linéaires pour le calcul des coefficients MPF dynamiques.

Cette fonction utilise l'algorithme DynamicMPF pour calculer les composantes de la matrice de Gram (LSE.AMM en [1] et [2] ) et du vecteur de recouvrement (LSE.bLL en [1] et [2] ) pour les paramètres d'évolution temporelle fournis.

Les éléments de la matrice de Gram, MijM_{ij}, et le vecteur de chevauchement, LiL_i, sont définis comme suit

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}

ρ(t)\rho(t) est l'état exact de l'évolution temporelle au moment tt et ρki(t)\rho_{k_i}(t) est l'état de l'évolution temporelle approximé à l'aide de kik_i étapes de Trotter.

Le calcul des coefficients MPF dynamiques (c'est-à-dire dépendant du temps) à partir de MM et LL revient à trouver une solution à l'équation LSE (de manière similaire à la façon dont les coefficients static MPF sont calculés) tout en appliquant la contrainte selon laquelle la somme de tous les coefficients doit être égale à 1 ( ixi=1\sum_i x_i = 1 ), qui n'est pas appliquée dans le cadre de ce LSE (contrairement au cas statique). Les problèmes d'optimisation qui incluent cette contrainte supplémentaire sont documentés dans le module costs module. Celle suggérée par les [points 1] et [2] est la setup_frobenius_problem().

L'évaluation de chaque élément MijM_{ij} et LiL_i nécessite le calcul du chevauchement entre deux états d'évolution temporelle. L'algorithme DynamicMPF le fait au moyen de calculs de réseaux tensoriels, fournis par l'une des dépendances optionnelles. Les backends disponibles sont listés et expliqués plus en détail dans le module backends module.

Nous présentons ci-dessous un exemple utilisant le quimb_tebd backend. Nous expliquons brièvement chaque élément.

Tout d'abord, nous initialisons un simple hamiltonien d'Heisenberg que nous souhaitons faire évoluer dans le temps. Étant donné que nous utilisons un time-evolver basé sur la bibliothèque quimbnous initialisons également le hamiltonien à l'aide de cette bibliothèque.

>>> from quimb.tensor import ham_1d_heis
>>> num_qubits = 10
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)

Ensuite, nous définissons le nombre de pas de Trotter pour constituer notre MPF, le temps d'évolution visé ainsi que l'état initial ( ψin\psi_{in} en [1] et ψ0\psi_0 en [2], resp.) par rapport à laquelle nous calculons le chevauchement entre les états d'évolution temporelle. Ici, nous utilisons simplement l'état Néel que nous construisons également à l'aide de quimb:

>>> trotter_steps = [3, 4]
>>> time = 0.9
>>> from quimb.tensor import MPS_neel_state
>>> initial_state = MPS_neel_state(num_qubits)

Puisque nous devons exécuter l'algorithme complet DynamicMPF pour calculer chaque élément de MijM_{ij} et LiL_i, nous devons fournir des méthodes d'usine pour initialiser les arguments d'entrée des instances DynamicMPF instances. Pour ce faire, nous devons assurer trois fonctions. Pour les construire, nous utiliserons la fonction functools.partial() fonction.

>>> from functools import partial

Tout d'abord, nous avons besoin d'une fonction pour initialiser un état d'évolution temporelle vide (voir aussi DynamicMPF.evolution_state pour plus de détails). Cette fonction de construction ne peut pas prendre d'arguments positionnels ou de mots-clés et doit renvoyer un State objet.

>>> from qiskit_addon_mpf.backends.quimb_tebd import MPOState
>>> from quimb.tensor import MPO_identity
>>> identity_factory = lambda: MPOState(MPO_identity(num_qubits))

Les deuxième et troisième fonctions doivent construire les moteurs d'évolution temporelle des côtés gauche et droit (voir également DynamicMPF.lhs et DynamicMPF.rhs pour plus de détails). Ces fonctions doivent respecter les règles ExactEvolverFactory et ApproxEvolverFactory respectivement.

La fonction ExactEvolverFactory doit prendre un objet State comme seul argument positionnel et doit renvoyer un objet Evolver qui sera utilisé pour calculer la LHS des éléments de LiL_i (c'est-à-dire qu'il doit produire l'état exact de l'évolution temporelle, ρ(t)\rho(t) ).

Ici, nous approximons l'état temporel exact avec une formule de Suzuki-Trotter du quatrième ordre en utilisant un petit pas de temps de 0.05. Nous spécifions également certaines options de troncature quimb-pour limiter la dimension maximale des liaisons du réseau tensoriel sous-jacent ainsi que les valeurs singulières minimales des liaisons du réseau tensoriel divisé.

>>> 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 fonction ApproxEvolverFactory doit également prendre un objet State comme seul argument de position et, en outre, un mot-clé appelé dt pour spécifier le pas de temps de l'évolution temporelle. Il doit également renvoyer un objet Evolver qui produit les états d'évolution temporelle approximatifs, ρki(t)\rho_{k_i}(t), où kik_i est déterminé par le pas de temps choisi, dt. En tant que telles, ces instances seront utilisées pour calculer le RHS de LiL_i ainsi que les deux côtés des éléments de MijM_{ij}.

Nous utilisons ici une formule de Suzuki-Trotter du second ordre avec les mêmes paramètres de troncature que précédemment.

>>> approx_evolver_factory = partial(
...     TEBDEvolver,
...     H=hamil,
...     order=2,
...     split_opts={"max_bond": 10, "cutoff": 1e-5},
... )

Enfin, nous pouvons initialiser et exécuter la fonction setup_dynamic_lse() pour obtenir la fonction LSE décrite en haut de page.

>>> 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]

Paramètres

  • trotter_steps (list[int]) – la séquence de pas de trotteurs à utiliser.
  • time (float) – le temps total d'évolution de la cible.
  • identity_factory (IdentityStateFactory) – une fonction permettant de générer un objet State vide.
  • exact_evolver_factory (ExactEvolverFactory) – une fonction pour initialiser l'instance Evolver qui produit l'état exact de l'évolution temporelle, ρ(t)\rho(t).
  • approx_evolver_factory (ApproxEvolverFactory) – une fonction pour initialiser l'instance Evolver qui produit l'état approximatif de l'évolution temporelle, ρki(t)\rho_{k_i}(t), pour différentes valeurs de kik_i en fonction du pas de temps fourni, dt.
  • initial_state (Any) – l'état initial ( ψin\psi_{in} ou ψ0\psi_0 ) par rapport auquel calculer les éléments MijM_{ij} de LSE.A et LiL_i de LSE.b. Le type de cet objet doit correspondre au réseau tensoriel choisi pour les arguments précédents.

Retours

Le LSE pour trouver les coefficients dynamiques de la MPF comme décrit ci-dessus.

Type de retour

LSE

Références

[1] : S. Zhuk et al, Physique. 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


Protocoles d'usine

Les protocoles suivants définissent les signatures des fonctions pour les différents arguments de la fabrique d'objets.

IdentityStateFactory

class IdentityStateFactory(*args, **kwargs)

GitHub

Bases : Protocol

Le protocole de la fonction d'usine pour la construction d'une instance d'identité State d'identité.

Comme expliqué plus en détail dans setup_dynamic_lse()cette fonction d'usine est appelée pour initialiser l'élément DynamicMPF.evolution_state avec une identité ou un état vide. Cette fonction ne doit pas prendre d'arguments et doit renvoyer une State instance.

ExactEvolverFactory

class ExactEvolverFactory(*args, **kwargs)

GitHub

Bases : Protocol

Le protocole de la fonction d'usine pour la construction d'une instance exacte Evolver exacte.

Comme expliqué plus en détail dans setup_dynamic_lse()cette fonction d'usine est appelée pour initialiser les instances de DynamicMPF.lhs instances de Evolver qui produisent l'état d'évolution temporelle exact, ρ(t)\rho(t), lors du calcul des éléments LiL_i.

ApproxEvolverFactory

class ApproxEvolverFactory(*args, **kwargs)

GitHub

Bases : Protocol

Le protocole de la fonction d'usine pour la construction d'une instance approximative Evolver approximative.

Comme expliqué plus en détail dans setup_dynamic_lse()cette fonction d'usine est appelée pour initialiser soit les instances de DynamicMPF.rhs instances de Evolver lors du calcul des éléments LiL_i ou des deux côtés (DynamicMPF.lhs et DynamicMPF.rhs) lors du calcul des éléments MijM_{ij}. Étant donné que ces états d'évolution temporelle approximatifs dépendent du pas de Trotter ( ρki(t)\rho_{k_i}(t) ), cette fonction requiert que le pas de temps de l'évolution temporelle soit fourni en tant qu'argument de mot-clé appelé dt.


Algorithme central

DynamicMPF

class DynamicMPF(evolution_state, lhs, rhs)

GitHub

Bases : object

L'algorithme MPF dynamique.

Instancié avec un LHS et un RHS Evolver cet algorithme evolve() un temps d'évolution State jusqu'à un temps d'évolution cible. Ensuite, le DynamicMPF.overlap() de l'évolution temporelle State avec un état initial donné peut être calculée. Voir setup_dynamic_lse() pour une explication plus détaillée de la manière dont cela est utilisé pour calculer les éléments MijM_{ij} et LiL_i qui composent les coefficients MPF dynamiques LSE des coefficients MPF dynamiques.

Références

[1] : S. Zhuk et al, Physique. 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

Construire une DynamicMPF instance.

Paramètres

  • evolution_state (State) – l'état à partager entre les moteurs d'évolution temporelle LHS et RHS.
  • lhs (Evolver) – le moteur d'évolution temporelle LHS.
  • rhs (Evolver) – le moteur d'évolution temporelle de l'ERS.

TEMPS_DÉCIMALES

Type: int

Valeur par défaut: 8

Le nombre de décimales utilisées pour arrondir les temps d'évolution.

Au cours de l'évolution temporelle du evolution_statenous comparons souvent les temps d'évolution des moteurs LHS et RHS entre eux ainsi que le temps d'évolution de la cible. Ces contrôles comparent des nombres à virgule flottante et ce paramètre spécifie le nombre de décimales auxquelles nous arrondissons.

evolution_state

L'état partagé entre les moteurs d'évolution temporelle LHS et RHS.

evolve

evolve(time)

GitHub

Faire évoluer l'algorithme dynamique MPF jusqu'au temps imparti.

Cette opération exécute l'algorithme MPF dynamique en évoluant dans le temps jusqu'à l'heure spécifiée en utilisant les valeurs LHS et RHS DynamicMPF.evolution_state jusqu'au moment spécifié en utilisant les instances LHS et RHS Evolver et RHS.

Paramètres

time (float) – le temps total d'évolution de la cible.

Augmentations

RuntimeError - si les temps évolués LHS et RHS ne sont pas égaux à la fin.

Type de retour

Aucun

lhs

Le moteur d'évolution temporelle LHS.

overlap

overlap(initial_state)

GitHub

Calculer le chevauchement de DynamicMPF.evolution_state avec l'état fourni.

Avertissement

Le type de l'adresse initial_state fournie dépendra du backend choisi pour l'application State et Evolver fournies à cette instance DynamicMPF instance. En d'autres termes, un backend ne peut prendre en charge qu'un type spécifique d'objets initial_state pour ce calcul de chevauchement. Voir également les explications de l'argument initial_state de l'option setup_dynamic_lse() pour plus de détails.

Paramètres

initial_state (Any) – l'état initial avec lequel calculer le chevauchement.

Augmentations

TypeError - si l'état initial fourni a un type incompatible.

Retours

Le chevauchement de DynamicMPF.evolution_state avec celui fourni.

Type de retour

complexe

rhs

Le moteur d'évolution temporelle de l'ERS.

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