MPF dinámicos
qiskit_addon_mpf.dynamic
Coeficientes MPF dinámicos.
Este módulo proporciona la función generadora del sistema lineal de ecuaciones (LSE) para calcular los coeficientes MPF dinámicos (es decir, dependientes del tiempo).
setup_dynamic_lse
setup_dynamic_lse(trotter_steps, time, identity_factory, exact_evolver_factory, approx_evolver_factory, initial_state)
Devuelve el sistema lineal de ecuaciones para calcular los coeficientes MPF dinámicos.
Esta función utiliza el algoritmo DynamicMPF para calcular los componentes de la matriz de Gram (LSE.A, en [1] y [2] ) y el vector de solapamiento (LSE.b, en [1] y [2] ) para los parámetros de evolución temporal proporcionados.
Los elementos de la matriz de Gram, , y el vector de solapamiento, , se definen como
donde es el estado de evolución temporal exacto en el tiempo y es el estado de evolución temporal aproximado utilizando pasos de Trotter.
Calcular los coeficientes MPF dinámicos (es decir, dependientes del tiempo) a partir de y equivale a encontrar una solución a la ecuación LSE (de forma similar a como se calculan los coeficientes static MPF) mientras se aplica la restricción de que todos los coeficientes deben sumar 1 ( ), que no se aplica como parte de esta LSE (a diferencia del caso estático). Los problemas de optimización que incluyen esta restricción adicional se documentan en el módulo costs módulo. El sugerido por [1] y [2] es el setup_frobenius_problem().
La evaluación de cada elemento y requiere calcular el solapamiento entre dos estados de evolución temporal. El algoritmo DynamicMPF algoritmo lo hace mediante cálculos de redes tensoriales, proporcionados por una de las dependencias opcionales. Los backends disponibles se enumeran y explican con más detalle en el módulo backends módulo.
A continuación, ofrecemos un ejemplo utilizando el quimb_tebd backend. Explicamos brevemente cada elemento.
En primer lugar, inicializamos un Hamiltoniano de Heisenberg simple que nos gustaría hacer evolucionar en el tiempo. Como estamos utilizando un evolucionador temporal basado en quimbtambién inicializamos el Hamiltoniano utilizando esa biblioteca.
>>> from quimb.tensor import ham_1d_heis
>>> num_qubits = 10
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)A continuación, definimos el número de pasos de Trotter que componen nuestro MPF, el tiempo de evolución objetivo, así como el estado inicial ( en [1] y en [2], resp.) con respecto a la cual calculamos el solapamiento entre los estados de evolución temporal. Aquí, simplemente utilizamos el estado Néel que también construimos utilizando quimb:
>>> trotter_steps = [3, 4]
>>> time = 0.9>>> from quimb.tensor import MPS_neel_state
>>> initial_state = MPS_neel_state(num_qubits)Dado que debemos ejecutar el algoritmo DynamicMPF para calcular cada elemento de y , debemos proporcionar métodos de fábrica para inicializar los argumentos de entrada de las instancias DynamicMPF instancias. Para ello, debemos ofrecer tres funciones. Para construirlas, utilizaremos la función functools.partial() función
>>> from functools import partialEn primer lugar, necesitamos una función para inicializar un estado de evolución temporal vacío (véase también DynamicMPF.evolution_state para más detalles). Esta función constructora no puede tomar ningún argumento posicional o de palabra clave y debe devolver un State objeto.
>>> from qiskit_addon_mpf.backends.quimb_tebd import MPOState
>>> from quimb.tensor import MPO_identity
>>> identity_factory = lambda: MPOState(MPO_identity(num_qubits))La segunda y tercera función deben construir los motores de evolución temporal del lado izquierdo y derecho (véase también DynamicMPF.lhs y DynamicMPF.rhs para más detalles). Estas funciones deben seguir los ExactEvolverFactory y ApproxEvolverFactory respectivamente.
La función ExactEvolverFactory debe tomar un objeto State como único argumento posicional y debe devolver un objeto Evolver que se utilizará para calcular el LHS de los elementos de (es decir, debe producir el estado de evolución temporal exacto, ).
Aquí, aproximamos el estado exacto evolucionado en el tiempo con una fórmula de Suzuki-Trotter de cuarto orden utilizando un pequeño paso de tiempo de 0.05. También especificamos algunas quimb-opciones de truncamiento específicas para limitar la dimensión máxima de los enlaces de la red tensorial subyacente, así como los valores singulares mínimos de los enlaces de la red tensorial dividida.
>>> 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},
... )La función ApproxEvolverFactory debe tomar también un objeto State como único argumento posicional y, además, un argumento de palabra clave denominado dt para especificar el paso temporal de la evolución temporal. También debe devolver un objeto Evolver que produce los estados aproximados de evolución temporal, , donde viene determinado por el paso temporal elegido, dt. Como tales, estas instancias se utilizarán para calcular el RHS de así como ambos lados de los elementos de .
Aquí, utilizamos una fórmula de Suzuki-Trotter de segundo orden con los mismos ajustes de truncamiento que antes.
>>> approx_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... order=2,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )Por último, podemos inicializar y ejecutar la función setup_dynamic_lse() para obtener el LSE descrito en la parte superior.
>>> 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]Parámetros
- trotter_steps (list[int]) – la secuencia de pasos de trote que se utilizará.
- time (float) – el tiempo total de evolución del objetivo.
- identity_factory (IdentityStateFactory) – una función para generar un objeto
Statevacío. - exact_evolver_factory (ExactEvolverFactory) – una función para inicializar la instancia
Evolverinstancia que produce el estado exacto de evolución temporal, . - approx_evolver_factory (ApproxEvolverFactory) – una función para inicializar la instancia
Evolverinstancia que produce el estado aproximado de evolución temporal, , para diferentes valores de en función del paso temporal proporcionado,dt. - initial_state (Any) – el estado inicial ( o ) con respecto al cual calcular los elementos de
LSE.Ay deLSE.b. El tipo de este objeto debe coincidir con el backend de red tensorial elegido para los argumentos anteriores.
Devuelve
La dirección LSE para hallar los coeficientes MPF dinámicos como se ha descrito anteriormente.
Tipo de retorno
Referencias
[1] : S. Zhuk et al., Física. Rev. Research 6, 033309 (2024).
https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309
[2] : N. Robertson et al., arXiv:2407.17405v2 (2024).
Protocolos de fábrica
Los siguientes protocolos definen las firmas de función para los distintos argumentos de la fábrica de objetos.
IdentityStateFactory
class IdentityStateFactory(*args, **kwargs)
Bases: Protocol
El protocolo de la función de fábrica para construir una State instancia.
Como se explica con más detalle en setup_dynamic_lse()se llama a esta función de fábrica para inicializar el módulo DynamicMPF.evolution_state con una identidad o un estado vacío. Esta función no debe tomar ningún argumento y devuelve una State instancia.
ExactEvolverFactory
class ExactEvolverFactory(*args, **kwargs)
Bases: Protocol
El protocolo de la función de fábrica para construir una Evolver exacta.
Como se explica con más detalle en setup_dynamic_lse()se llama a esta función de fábrica para inicializar las instancias de DynamicMPF.lhs instancias de Evolver que producen el estado exacto de evolución temporal, , al calcular los elementos .
ApproxEvolverFactory
class ApproxEvolverFactory(*args, **kwargs)
Bases: Protocol
El protocolo de la función de fábrica para construir una Evolver aproximada.
Como se explica con más detalle en setup_dynamic_lse()esta función de fábrica se llama para inicializar las instancias de DynamicMPF.rhs instancias de Evolver al calcular los elementos o ambos lados (DynamicMPF.lhs y DynamicMPF.rhs) al calcular los elementos . Dado que estos estados aproximados de evolución temporal dependen del paso de Trotter ( ), esta función requiere que el paso temporal de la evolución temporal se proporcione como un argumento de palabra clave llamado dt.
Algoritmo central
DynamicMPF
class DynamicMPF(evolution_state, lhs, rhs)
Bases: object
El algoritmo MPF dinámico.
Instanciado con un LHS y un RHS Evolver este algoritmo evolve() compartido State hasta un tiempo de evolución objetivo. Después, el DynamicMPF.overlap() de la evolución temporal State con algún estado inicial puede calcularse. Véase setup_dynamic_lse() para una explicación más detallada sobre cómo se utiliza esto para calcular los elementos y que componen los LSE de los coeficientes MPF dinámicos.
Referencias
[1] : S. Zhuk et al., Física. Rev. Research 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
Construye una DynamicMPF instancia.
Parámetros
- evolution_state (State) – el estado que compartirán los motores de evolución temporal LHS y RHS.
- lhs (Evolver) – el motor de evolución temporal LHS.
- rhs (Evolver) – el motor de evolución temporal RHS.
TIEMPO_DECIMALES
Tipo: int
Valor predeterminado: 8
El número de decimales utilizados para redondear los tiempos de evolución.
Durante la evolución temporal del evolution_statecomparamos a menudo los tiempos de evolución de los motores LHS y RHS entre sí, así como el tiempo de evolución del objetivo. Estas comprobaciones comparan números en coma flotante y este ajuste especifica el número de decimales a los que redondeamos.
evolution_state
El estado compartido entre los motores de evolución temporal LHS y RHS.
evolve
evolve(time)
Evoluciona el algoritmo MPF dinámico hasta el tiempo previsto.
Esto realmente ejecuta el algoritmo MPF dinámico evolucionando en el tiempo DynamicMPF.evolution_state hasta el tiempo especificado utilizando las instancias LHS y RHS Evolver instancias.
Parámetros
time (float) – el tiempo total de evolución del objetivo.
Eleva
RuntimeError - si los tiempos evolucionados LHS y RHS no son iguales al final.
Tipo de retorno
Ninguna
lhs
El motor de evolución temporal LHS.
overlap
overlap(initial_state)
Calcular el solapamiento de DynamicMPF.evolution_state con el estado proporcionado.
El tipo del initial_state proporcionado dependerá del backend elegido utilizado para el State y Evolver proporcionadas a esta instancia DynamicMPF instancia. En otras palabras, es posible que un backend sólo admita un tipo específico de objetos initial_state para este cálculo de solapamiento. Véanse también las explicaciones del argumento initial_state de la directiva setup_dynamic_lse() para más detalles.
Parámetros
initial_state (Any) – el estado inicial con el que calcular el solapamiento.
Eleva
TypeError - si el estado inicial proporcionado tiene un tipo incompatible.
Devuelve
El solapamiento de DynamicMPF.evolution_state con el proporcionado.
Tipo de retorno
rhs
El motor de evolución temporal RHS.