Quimb TEBD-Backend
qiskit_addon_mpf.backends.quimb_tebd
A quimb-basierten TEBD-Backend.
Dieses Backend ist nur verfügbar, wenn die optionalen Abhängigkeiten installiert wurden:
pip install "qiskit-addon-mpf[quimb]"Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
TEBDEvolver | Ein TEBD-Algorithmus zur Entwicklung eines internen MPO. |
MPOState | Ein MPO, das die Vidal-Spurweite durchsetzt. |
Zugrunde liegende Methode
Dieses Modul bietet ein Zeitentwicklungs-Backend für die Berechnung dynamischer MPF-Koeffizienten auf der Grundlage des TEBD-Algorithmus (Time-Evolving Block Decimation) [1], der in der quimb tensornetzwerk-Bibliothek implementiert ist.
Die von diesem Modul bereitgestellten Klassen dienen zwei Zwecken:
- Die Verbindung von
quimbimplementierung der Schnittstelle, die durchqiskit_addon_mpf.backends. - Erweiterung von
quimbtEBD-Implementierung, um einen internen MPO- (statt MPS-) Zustand zu behandeln (siehe auchStatefür weitere Details).
Im einfachsten Sinne stellt dieses Modul eine unkomplizierte Erweiterung des TEBD-Algorithmus dar, um einen internen MPO-Zustand zu evolvieren. Wenn Sie also dieses Backend für Ihren dynamischen MPF-Algorithmus verwenden möchten, müssen Sie den Hamiltonian, den Sie zeitlich entwickeln möchten, in einer quimb-nativen Form kodieren. Um konkreter zu werden, wird die TEBDEvolver klasse (die eine Unterklasse von quimb.tensor.TEBD) arbeitet mit einem Hamiltonian in Form eines quimb.tensor.LocalHam1D. Quimb bietet eine Reihe von praktischen Methoden zur Konstruktion solcher Hamiltonians in seinem quimb.tensor.tensor_builder modul. Wenn keine dieser Klassen Ihre Anforderungen erfüllt, können Sie die LayerModel klasse verwenden, die einige Konvertierungsmethoden von Qiskit-nativen Objekten implementiert.
Codebeispiel
Dieser Abschnitt zeigt ein einfaches Beispiel, um Ihnen den Einstieg in die Verwendung dieses Backends zu erleichtern. Das Beispiel zeigt, wie die drei Fabrikfunktionen erstellt werden, die für die setup_dynamic_lse().
Zuerst erstellen wir die identity_factory , die mit dem IdentityStateFactory protokoll entsprechen muss. Dies geschieht einfach durch die Verwendung der quimb.tensor.MPO_identity() funktion und umhüllen die resultierende quimb.tensor.MatrixProductOperator mit unserer eigenen MPOState schnittstelle.
>>> 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))Als nächstes, bevor man die ExactEvolverFactory und ApproxEvolverFactory zu definieren, müssen wir den Hamiltonian definieren, den wir zeitlich entwickeln möchten. Hier wählen wir einfach eine der quimbkomfortmethoden aus.
>>> from quimb.tensor import ham_1d_heis
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)Wir können nun die exakten und approximativen Instanzfabriken der Zeitentwicklung konstruieren. Dazu können wir einfach mit functools.partial() verwenden, um die vordefinierten Werte des TEBDEvolver initialisierers binden und ihn auf die korrekte Schnittstelle reduzieren, wie sie von den ExactEvolverFactory und ApproxEvolverFactory protokollen erwartet wird.
>>> 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,
... )Beachten Sie, dass wir den Wert dt auf einen kleinen Zeitschritt festgelegt und eine Suzuki-Trotter-Zerlegung höherer Ordnung verwendet haben, um die obige genaue Zeitentwicklung nachzuahmen.
Im Folgenden legen wir den Wert dt nicht fest und verwenden nur eine Suzuki-Trotter-Formel zweiter Ordnung für die ungefähre Zeitentwicklung. Darüber hinaus legen wir auch einige Trunkierungseinstellungen fest.
>>> approx_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... order=2,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )Natürlich sind Sie nicht auf die hier gezeigten Beispiele beschränkt, und wir ermutigen Sie, mit den anderen Einstellungen zu spielen, die von der quimb.tensor.TEBD implementierung.
Einschränkungen
Abschließend weisen wir auf einige bekannte Einschränkungen bezüglich der Art von Hamiltonianern hin, die mit diesem Backend behandelt werden können:
- alle Interaktionen müssen 1-dimensional sein
- die Wechselwirkungen müssen acylisch sein
Ressourcen
[1]: https://en.wikipedia.org/wiki/Time-evolving _block_decimation