Quimb TEBD backend (qiskit_addon_mpf.backends.quimb_tebd
)¶
A quimb
-based TEBD backend.
Warning
This backend is only available if the optional dependencies have been installed:
pip install "qiskit-addon-mpf[quimb]"
A TEBD algorithm for evolving an internal MPO. |
|
An MPO enforcing the Vidal gauge. |
Underlying method¶
This module provides a time-evolution backend for computing dynamic MPF coefficients based on the
time-evolving block decimation (TEBD) algorithm [1] implemented in the quimb
tensor
network library.
The classes provided by this module serve two purposes:
Connecting
quimb
’s implementation to the interface set out byqiskit_addon_mpf.backends
.Extending
quimb
’s TEBD implementation to handle an internal MPO (rather than MPS) state (see alsoState
for more details).
In the simplest sense, this module provides a straight-forward extension of the TEBD algorithm to
evolve an internal MPO state.
As such, if you wish to use this backend for your dynamic MPF algorithm, you must encode the
Hamiltonian that you wish to time-evolve, in a quimb
-native form. To be more
concrete, the TEBDEvolver
class (which is a subclass
of quimb.tensor.TEBD
) works with a Hamiltonian in the form of a
quimb.tensor.LocalHam1D
. Quimb provides a number of convenience methods for
constructing such Hamiltonians in its quimb.tensor.tensor_builder
module.
If none of those fulfill your needs, you can consider using the
LayerModel
class which implements some conversion
methods from Qiskit-native objects.
Code example¶
This section shows a simple example to get you started with using this backend. The example shows
how to create the three factory functions required for the setup_dynamic_lse()
.
First, we create the identity_factory
which has to match the IdentityStateFactory
protocol. We do so simply by using the quimb.tensor.MPO_identity()
function and
wrapping the resulting quimb.tensor.MatrixProductOperator
with our custom
MPOState
interface.
>>> 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))
Next, before being able to define the ExactEvolverFactory
and
ApproxEvolverFactory
protocols, we must define the Hamiltonian which we would like to
time-evolve. Here, we simply choose one of quimb
’s convenience methods.
>>> from quimb.tensor import ham_1d_heis
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)
We can now construct the exact and approximate time-evolution instance factories. To do so, we can
simply use functools.partial()
to bind the pre-defined values of the
TEBDEvolver
initializer, reducing it to the correct
interface as expected by the ExactEvolverFactory
and ApproxEvolverFactory
protocols, respectively.
>>> 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,
... )
Notice, how we have fixed the dt
value to a small time step and have used a higher-order
Suzuki-Trotter decomposition to mimic the exact time evolution above.
Below, we do not fix the dt
value and use only a second-order Suzuki-Trotter formula for the
approximate time evolution. Additionally, we also specify some truncation settings.
>>> approx_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... order=2,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )
Of course, you are not limited to the examples shown here, and we encourage you to play around with
the other settings provided by the quimb.tensor.TEBD
implementation.
Limitations¶
Finally, we point out a few known limitations on what kind of Hamiltonians can be treated by this backend:
all interactions must be 1-dimensional
the interactions must be acylic
Resources¶
[1]: https://en.wikipedia.org/wiki/Time-evolving_block_decimation