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)
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, in [1] und [2] ) und den Überlappungsvektor (LSE.b, in [1] und [2] ) für die angegebenen Zeit-Evolutionsparameter.
Die Elemente der Gram-Matrix und des Überlappungsvektors sind definiert als
wobei der exakte Zeitentwicklungszustand zum Zeitpunkt und der durch Trotter-Schritte approximierte Zeitentwicklungszustand ist.
Die Berechnung der dynamischen (d.h. zeitabhängigen) MPF-Koeffizienten aus und 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 ( ), 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 und 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 [1] bzw. 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 und 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 partialZunä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 verwendet wird (d. h. sie sollte den exakten Zeitentwicklungszustand erzeugen, ).
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, , erzeugt, wobei durch den gewählten Zeitschritt, dt, bestimmt wird. Daher werden diese Instanzen für die Berechnung der RHS von sowie für beide Seiten der Elemente von 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
Stateobjekt zu erzeugen. - exact_evolver_factory (ExactEvolverFactory) – eine Funktion zur Initialisierung der
Evolverinstanz, die den exakten Zeitentwicklungszustand erzeugt, . - approx_evolver_factory (ApproxEvolverFactory) – eine Funktion zur Initialisierung der
Evolverinstanz, die den ungefähren Zeitentwicklungszustand, , für verschiedene Werte von in Abhängigkeit von dem angegebenen Zeitschritt,dt, erzeugt. - initial_state (Any) – den Ausgangszustand ( oder ), in Bezug auf den die Elemente von
LSE.Aund vonLSE.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
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).
Fabrikprotokolle
In den folgenden Protokollen werden die Funktionssignaturen für die verschiedenen Objektfabrikargumente definiert.
IdentityStateFactory
class IdentityStateFactory(*args, **kwargs)
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)
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 den exakten Zeit-Evolutions-Zustand, , erzeugen.
ApproxEvolverFactory
class ApproxEvolverFactory(*args, **kwargs)
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 oder beider Seiten (DynamicMPF.lhs und DynamicMPF.rhs) bei der Berechnung der Elemente . Da diese angenäherten Zeitentwicklungszustände vom Trotter-Schritt ( ) abhängen, benötigt diese Funktion den Zeitschritt der Zeitentwicklung als Schlüsselwortargument namens dt.
Kernalgorithmus
DynamicMPF
class DynamicMPF(evolution_state, lhs, rhs)
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 und 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)
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)
Berechnen Sie die Überschneidung von DynamicMPF.evolution_state mit dem angegebenen Zustand.
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
rhs
Die RHS-Zeitfaltungsmaschine.