Backend Quimb TEBD
qiskit_addon_mpf.backends.quimb_tebd
A quimb-basado en TEBD.
Este backend sólo está disponible si se han instalado las dependencias opcionales:
pip install "qiskit-addon-mpf[quimb]"TEBDEvolver | Un algoritmo TEBD para evolucionar un MPO interno. |
MPOState | Un MPO aplicando el gálibo Vidal. |
Método subyacente
Este módulo proporciona un backend de evolución temporal para calcular coeficientes MPF dinámicos basados en el algoritmo de decimación en bloque con evolución temporal (TEBD) [1] implementado en la biblioteca de redes tensoriales quimb biblioteca de redes tensoriales.
Las clases que proporciona este módulo tienen dos finalidades:
- Conectando
quimba la interfaz establecida porqiskit_addon_mpf.backends. - Ampliación de
quimbpara manejar un estado MPO interno (en lugar de MPS) (véase tambiénStatepara más detalles).
En el sentido más simple, este módulo proporciona una extensión directa del algoritmo TEBD para evolucionar un estado MPO interno. Por lo tanto, si desea utilizar este backend para su algoritmo MPF dinámico, debe codificar el Hamiltoniano que desea evolucionar en el tiempo, en una forma nativa quimb-forma nativa. Para ser más concretos, la clase TEBDEvolver (que es una subclase de quimb.tensor.TEBD) trabaja con un Hamiltoniano en forma de quimb.tensor.LocalHam1D. Quimb proporciona un número de métodos convenientes para construir tales Hamiltonianos en su módulo quimb.tensor.tensor_builder módulo. Si ninguno de ellos satisface tus necesidades, puedes considerar el uso de la clase LayerModel que implementa algunos métodos de conversión de objetos nativos de Qiskit.
Ejemplo de código
Esta sección muestra un ejemplo sencillo para empezar a utilizar este backend. El ejemplo muestra cómo crear las tres funciones de fábrica necesarias para la función setup_dynamic_lse().
En primer lugar, creamos la dirección identity_factory que tiene que coincidir con el IdentityStateFactory protocolo. Para ello, basta con utilizar la función quimb.tensor.MPO_identity() y envolviendo la función quimb.tensor.MatrixProductOperator con nuestra interfaz MPOState personalizada.
>>> 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))A continuación, antes de poder definir los ExactEvolverFactory y ApproxEvolverFactory debemos definir el Hamiltoniano que queremos hacer evolucionar en el tiempo. En este caso, simplemente elegimos uno de los métodos quimb.
>>> from quimb.tensor import ham_1d_heis
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)Ahora podemos construir las fábricas de instancias de evolución temporal exactas y aproximadas. Para ello, basta con utilizar functools.partial() para enlazar los valores predefinidos del inicializador TEBDEvolver inicializador, reduciéndolo a la interfaz correcta, tal y como esperan los parámetros ExactEvolverFactory y ApproxEvolverFactory respectivamente.
>>> 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,
... )Obsérvese cómo hemos fijado el valor dt en un paso de tiempo pequeño y hemos utilizado una descomposición Suzuki-Trotter de orden superior para imitar la evolución temporal exacta anterior.
A continuación, no fijamos el valor dt y utilizamos únicamente una fórmula de Suzuki-Trotter de segundo orden para la evolución temporal aproximada. Además, también especificamos algunos ajustes de truncamiento.
>>> approx_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... order=2,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )Por supuesto, usted no está limitado a los ejemplos que se muestran aquí, y le animamos a jugar con los otros ajustes proporcionados por la aplicación quimb.tensor.TEBD implementación.
Limitaciones
Por último, señalamos algunas limitaciones conocidas sobre qué tipo de Hamiltonianos pueden ser tratados por este backend:
- todas las interacciones deben ser unidimensionales
- las interacciones deben ser acílicas
Recursos
[1]: https://en.wikipedia.org/wiki/Time-evolving _block_decimation