Skip to main content
IBM Quantum Platform

Dynamische MPFs

qiskit_addon_mpf.dynamic

Dynamische MPF-Koeffizienten.

Dieses Modul stellt die Generatorfunktion für das lineare Gleichungssystem (LSE) zur Berechnung der dynamischen (d.h. zeitabhängigen) MPF-Koeffizienten.

setup_dynamic_lse

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

GitHub

Rückgabe des linearen Gleichungssystems zur Berechnung der dynamischen MPF-Koeffizienten.

Diese Funktion verwendet den DynamicMPF algorithmus zur Berechnung der Komponenten der Gram-Matrix (LSE.A, MM in [1] und [2] ) und den Überlappungsvektor (LSE.b, LL in [1] und [2] ) für die angegebenen Zeit-Evolutionsparameter.

Die Elemente der Gram-Matrix MijM_{ij} und des Überlappungsvektors LiL_i sind definiert als

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}

wobei ρ(t)\rho(t) der exakte Zeitentwicklungszustand zum Zeitpunkt tt und ρki(t)\rho_{k_i}(t) der durch kik_i Trotter-Schritte approximierte Zeitentwicklungszustand ist.

Die Berechnung der dynamischen (d.h. zeitabhängigen) MPF-Koeffizienten aus MM und LL läuft darauf hinaus, eine Lösung für die Frage LSE (ähnlich wie bei der Berechnung der static MPF-Koeffizienten berechnet werden), wobei die Bedingung gilt, dass alle Koeffizienten die Summe 1 ergeben müssen ( ∑ixi=1\sum_i x_i = 1 ), was im Rahmen dieser LSE (anders als im statischen Fall) nicht der Fall ist. Optimierungsprobleme, die diese zusätzliche Randbedingung enthalten, sind im costs modul dokumentiert. Die von [1] und [2] vorgeschlagene Variante ist die setup_frobenius_problem().

Die Auswertung jedes Elements MijM_{ij} und LiL_i erfordert die Berechnung der Überlappung zwischen zwei Zeitentwicklungszuständen. Der DynamicMPF algorithmus tut dies mit Hilfe von Tensornetzberechnungen, die durch eine der optionalen Abhängigkeiten bereitgestellt werden. Die verfügbaren Backends werden im Modul backends modul.

Im Folgenden finden Sie ein Beispiel, das das quimb_tebd backend. Wir erläutern kurz jedes Element.

Zunächst initialisieren wir einen einfachen Heisenberg-Hamiltonschen, den wir zeitlich entwickeln möchten. Da wir einen Zeit-Evolver verwenden, der auf quimbverwenden, initialisieren wir auch den Hamiltonian mit dieser Bibliothek.

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

Als Nächstes definieren wir die Anzahl der Trotter-Schritte, aus denen sich unser MPF zusammensetzt, die angestrebte Entwicklungszeit sowie den Ausgangszustand ( ψin\psi_{in} in [1] bzw. ψ0\psi_0 in [2] ) in Bezug auf die wir die Überlappung zwischen den Zeitentwicklungszuständen berechnen. Hier verwenden wir einfach den Néel-Zustand, den wir auch mit quimb:

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

Da wir den gesamten DynamicMPF algorithmus ausführen müssen, um jedes Element von MijM_{ij} und LiL_i zu berechnen, müssen wir Factory-Methoden für die Initialisierung der Eingangsargumente der DynamicMPF instanzen bereitstellen. Zu diesem Zweck müssen wir drei Funktionen bereitstellen. Um diese zu konstruieren, werden wir die functools.partial() funktion.

>>> from functools import partial

Zunächst benötigen wir eine Funktion, um einen leeren Zeitentwicklungszustand zu initialisieren (siehe auch DynamicMPF.evolution_state für weitere Details). Diese Konstruktorfunktion darf keine Positions- oder Schlüsselwortargumente annehmen und muss ein State objekt zurückgeben.

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

Die zweite und die dritte Funktion müssen die linke und die rechte Seite der Zeitentwicklungsmaschine konstruieren (siehe auch DynamicMPF.lhs und DynamicMPF.rhs für weitere Einzelheiten). Diese Funktionen sollten auf die ExactEvolverFactory und ApproxEvolverFactory protokollen folgen.

Die Funktion ExactEvolverFactory funktion sollte ein State objekt als ihr einziges Positionsargument nehmen und ein Evolver objekt zurückgeben, das für die Berechnung der LHS der Elemente von LiL_i verwendet wird (d. h. sie sollte den exakten Zeitentwicklungszustand erzeugen, ρ(t)\rho(t) ).

Hier approximieren wir den exakten zeitlich entwickelten Zustand mit einer Suzuki-Trotter-Formel vierter Ordnung mit einem kleinen Zeitschritt von 0.05. Wir spezifizieren auch einige quimb-spezifische Trunkierungsoptionen, um die maximale Bindungsdimension des zugrundeliegenden Tensornetzwerks sowie die minimalen Singulärwerte der gespaltenen Tensornetzwerkbindungen zu begrenzen.

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

Die Funktion ApproxEvolverFactory funktion sollte ebenfalls ein State objekt als einziges Positionsargument und zusätzlich ein Schlüsselwortargument namens dt , um den Zeitschritt der Zeitentwicklung anzugeben. Es sollte auch ein Evolver objekt zurückgeben, das die approximativen Zeitentwicklungszustände, ρki(t)\rho_{k_i}(t), erzeugt, wobei kik_i durch den gewählten Zeitschritt, dt, bestimmt wird. Daher werden diese Instanzen für die Berechnung der RHS von LiL_i sowie für beide Seiten der Elemente von MijM_{ij} verwendet.

Hier verwenden wir eine Suzuki-Trotter-Formel zweiter Ordnung mit den gleichen Trunkierungseinstellungen wie zuvor.

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

Schließlich können wir die Funktion initialisieren und ausführen setup_dynamic_lse() funktion initialisieren und ausführen, um die LSE wie oben beschrieben.

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

Parameter

  • trotter_steps (list[int]) – die Reihenfolge der zu verwendenden Trabschritte.
  • time (float) – die gesamte Zielentwicklungszeit.
  • identity_factory (IdentityStateFactory) – eine Funktion zur Erzeugung eines leeren State objekt zu erzeugen.
  • exact_evolver_factory (ExactEvolverFactory) – eine Funktion zur Initialisierung der Evolver instanz, die den exakten Zeitentwicklungszustand erzeugt, ρ(t)\rho(t).
  • approx_evolver_factory (ApproxEvolverFactory) – eine Funktion zur Initialisierung der Evolver instanz, die den ungefähren Zeitentwicklungszustand, ρki(t)\rho_{k_i}(t), für verschiedene Werte von kik_i in Abhängigkeit von dem angegebenen Zeitschritt, dt, erzeugt.
  • initial_state (Any) – den Ausgangszustand ( ψin\psi_{in} oder ψ0\psi_0 ), in Bezug auf den die Elemente MijM_{ij} von LSE.A und LiL_i von LSE.b. Der Typ dieses Objekts muss mit dem für die vorherigen Argumente gewählten Tensornetzwerk-Backend übereinstimmen.

Rückgabe

Die LSE um die dynamischen MPF-Koeffizienten wie oben beschrieben zu ermitteln.

Rückgabetyp

LSE

Referenzen

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


Fabrikprotokolle

In den folgenden Protokollen werden die Funktionssignaturen für die verschiedenen Objektfabrikargumente definiert.

IdentityStateFactory

class IdentityStateFactory(*args, **kwargs)

GitHub

Basen: Protocol

Das Protokoll der Fabrikfunktion zur Erstellung einer Identitäts State instanz.

Wie im Detail in setup_dynamic_lse()erläutert, wird diese Fabrikfunktion aufgerufen, um die DynamicMPF.evolution_state mit einer Identität oder einem leeren Zustand zu initialisieren. Diese Funktion sollte keine Argumente annehmen und eine State instanz zurückgeben.

ExactEvolverFactory

class ExactEvolverFactory(*args, **kwargs)

GitHub

Basen: Protocol

Das Protokoll der Fabrikfunktion zur Erstellung einer exakten Evolver instanz.

Wie im Detail in setup_dynamic_lse()erläutert, wird diese Fabrikfunktion zur Initialisierung der DynamicMPF.lhs instanzen von Evolver zu initialisieren, die bei der Berechnung der Elemente LiL_i den exakten Zeit-Evolutions-Zustand, ρ(t)\rho(t), erzeugen.

ApproxEvolverFactory

class ApproxEvolverFactory(*args, **kwargs)

GitHub

Basen: Protocol

Das Protokoll der Fabrikfunktion zur Erstellung einer ungefähren Evolver instanz.

Wie im Detail in setup_dynamic_lse()erläutert, wird diese Fabrikfunktion aufgerufen, um entweder die DynamicMPF.rhs instanzen von Evolver bei der Berechnung der Elemente LiL_i oder beider Seiten (DynamicMPF.lhs und DynamicMPF.rhs) bei der Berechnung der Elemente MijM_{ij}. Da diese angenäherten Zeitentwicklungszustände vom Trotter-Schritt ( ρki(t)\rho_{k_i}(t) ) abhängen, benötigt diese Funktion den Zeitschritt der Zeitentwicklung als Schlüsselwortargument namens dt.


Kernalgorithmus

DynamicMPF

class DynamicMPF(evolution_state, lhs, rhs)

GitHub

Basen: object

Der dynamische MPF-Algorithmus.

Instanziiert mit einem LHS und RHS Evolver wird dieser Algorithmus evolve() eine gemeinsame State bis zu einer bestimmten Evolutionszeit. Danach wird die DynamicMPF.overlap() der zeitentwickelten State mit einem bestimmten Anfangszustand berechnet werden. Siehe setup_dynamic_lse() finden Sie eine ausführlichere Erklärung, wie dies zur Berechnung der Elemente MijM_{ij} und LiL_i verwendet wird, aus denen sich die LSE der dynamischen MPF-Koeffizienten bilden.

Referenzen

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

Konstruieren Sie eine DynamicMPF instanz.

Parameter

  • evolution_state (State) – der Zustand, der von den Zeitentwicklungsmotoren LHS und RHS gemeinsam genutzt wird.
  • lhs (Evolver) – die LHS-Zeitfindungsmaschine.
  • rhs (Evolver) – die RHS-Zeitfindungsmaschine.

ZEIT_DEKIMALZAHLEN

Typ: int

Standardwert: 8

Die Anzahl der Dezimalstellen, die für die Rundung der Entwicklungszeiten verwendet werden.

Während der zeitlichen Entwicklung des evolution_statevergleichen wir häufig die Entwicklungszeiten der LHS- und RHS-Engines miteinander sowie mit der Zielentwicklungszeit. Bei diesen Prüfungen werden Fließkommazahlen verglichen, und diese Einstellung gibt die Anzahl der Dezimalstellen an, auf die gerundet wird.

evolution_state

Der Zustand, der zwischen den Zeitentwicklungsmotoren LHS und RHS geteilt wird.

evolve

evolve(time)

GitHub

Entwickeln Sie den dynamischen MPF-Algorithmus bis zu der angegebenen Zeit.

Dabei wird der dynamische MPF-Algorithmus durch Zeitentwicklung DynamicMPF.evolution_state bis zur angegebenen Zeit unter Verwendung der LHS- und RHS Evolver instanzen.

Parameter

time (float) – die gesamte Zielentwicklungszeit.

Erhöht

RuntimeError - wenn die LHS- und RHS-Entwicklungszeiten am Ende nicht gleich sind.

Rückgabetyp

Keine

lhs

Der LHS-Zeitfaltungsmotor.

overlap

overlap(initial_state)

GitHub

Berechnen Sie die Überschneidung von DynamicMPF.evolution_state mit dem angegebenen Zustand.

Achtung

Der Typ der bereitgestellten initial_state hängt von dem gewählten Backend ab, das für die State und Evolver instanzen, die für diese DynamicMPF instanz bereitgestellt werden. Mit anderen Worten, ein Backend darf nur einen bestimmten Typ von initial_state Objekten für diese Überlappungsberechnung unterstützen. Siehe auch die Erklärungen zum initial_state Argument zum setup_dynamic_lse() für weitere Einzelheiten.

Parameter

initial_state (Any) – den Ausgangszustand, mit dem die Überlappung berechnet wird.

Erhöht

TypeError - wenn der angegebene Ausgangszustand einen inkompatiblen Typ hat.

Rückgabe

Die Überschneidung von DynamicMPF.evolution_state mit der angegebenen.

Rückgabetyp

Komplex

rhs

Die RHS-Zeitfaltungsmaschine.

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.