MPFs dinâmicos
qiskit_addon_mpf.dynamic
Coeficientes MPF dinâmicos.
Esse módulo fornece a função geradora para o sistema linear de equações (LSE) para calcular os coeficientes MPF dinâmicos (ou seja, dependentes do tempo).
setup_dynamic_lse
setup_dynamic_lse(trotter_steps, time, identity_factory, exact_evolver_factory, approx_evolver_factory, initial_state)
Retorna o sistema linear de equações para calcular os coeficientes dinâmicos do MPF.
Essa função usa o algoritmo DynamicMPF para calcular os componentes da matriz de Gram (LSE.A em [1] e [2] ) e o vetor de sobreposição (LSE.b, em [1] e [2] ) para os parâmetros de evolução temporal fornecidos.
Os elementos da matriz Gram, , e o vetor de sobreposição, , são definidos como
em que é o estado exato da evolução do tempo no momento e é o estado da evolução do tempo aproximado usando as etapas de Trotter de .
O cálculo dos coeficientes MPF dinâmicos (ou seja, dependentes do tempo) de e equivale a encontrar uma solução para a equação LSE (de forma semelhante a como os coeficientes static MPF são calculados) e, ao mesmo tempo, impor a restrição de que todos os coeficientes devem somar 1 ( ), que não é imposta como parte desse LSE (diferentemente do caso estático). Os problemas de otimização que incluem essa restrição adicional estão documentados no módulo costs módulo. O sugerido por [1] e [2] é o setup_frobenius_problem().
A avaliação de cada elemento e exige o cálculo da sobreposição entre dois estados de evolução temporal. O algoritmo DynamicMPF faz isso por meio de cálculos de rede tensorial, fornecidos por uma das dependências opcionais. Os backends disponíveis são listados e explicados em mais detalhes no módulo backends módulo.
Abaixo, fornecemos um exemplo usando o quimb_tebd backend. Explicamos brevemente cada elemento.
Primeiro, inicializamos um Hamiltoniano de Heisenberg simples que gostaríamos de fazer evoluir no tempo. Como estamos usando um time-evolver baseado em quimbtambém inicializamos o Hamiltoniano usando essa biblioteca.
>>> from quimb.tensor import ham_1d_heis
>>> num_qubits = 10
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)Em seguida, definimos o número de etapas de Trotter para compor nosso MPF, o tempo de evolução desejado, bem como o estado inicial ( em [1] e em [2], respectivamente) em relação ao qual calculamos a sobreposição entre os estados de evolução temporal. Aqui, simplesmente usamos o estado Néel, que também construímos usando quimb:
>>> trotter_steps = [3, 4]
>>> time = 0.9>>> from quimb.tensor import MPS_neel_state
>>> initial_state = MPS_neel_state(num_qubits)Como precisamos executar o algoritmo DynamicMPF para calcular cada elemento de e , precisamos fornecer métodos de fábrica para inicializar os argumentos de entrada das instâncias DynamicMPF instâncias. Para isso, precisamos oferecer três funções. Para construí-los, usaremos a função functools.partial() função.
>>> from functools import partialPrimeiro, precisamos de uma função para inicializar um estado de evolução temporal vazio (consulte também DynamicMPF.evolution_state para obter mais detalhes). Essa função de construtor não pode receber nenhum argumento posicional ou de palavra-chave e deve retornar um objeto 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))A segunda e a terceira função devem construir os mecanismos de evolução temporal dos lados esquerdo e direito (consulte também DynamicMPF.lhs e DynamicMPF.rhs para obter mais detalhes). Essas funções devem seguir os parâmetros ExactEvolverFactory e ApproxEvolverFactory respectivamente.
A função ExactEvolverFactory deve receber um objeto State como seu único argumento posicional e deve retornar um objeto Evolver que será usado para calcular o LHS dos elementos de (ou seja, deve produzir o estado exato da evolução do tempo, ).
Aqui, aproximamos o estado exato da evolução do tempo com uma fórmula Suzuki-Trotter de quarta ordem usando uma pequena etapa de tempo de 0.05. Também especificamos algumas quimb-opções de truncamento específicas para limitar a dimensão máxima da ligação da rede de tensores subjacente, bem como os valores singulares mínimos das ligações da rede de tensores 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},
... )A função ApproxEvolverFactory também deve receber um objeto State como seu único argumento posicional e, adicionalmente, um argumento de palavra-chave chamado dt para especificar a etapa de tempo da evolução temporal. Ele também deve retornar um objeto Evolver que produz os estados de evolução temporal aproximados, , em que é determinado pela etapa de tempo escolhida, dt. Dessa forma, essas instâncias serão usadas para calcular o RHS do , bem como os dois lados dos elementos do .
Aqui, usamos uma fórmula Suzuki-Trotter de segunda ordem com as mesmas configurações de truncamento anteriores.
>>> approx_evolver_factory = partial(
... TEBDEvolver,
... H=hamil,
... order=2,
... split_opts={"max_bond": 10, "cutoff": 1e-5},
... )Por fim, podemos inicializar e executar a função setup_dynamic_lse() para obter a função LSE descrito na 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]) – a sequência de passos do trotador a ser usada.
- time (float) – o tempo total de evolução do alvo.
- identity_factory (IdentityStateFactory) – uma função para gerar um objeto
Statevazio. - exact_evolver_factory (ExactEvolverFactory) – uma função para inicializar a instância
Evolverque produz o estado exato da evolução temporal, . - approx_evolver_factory (ApproxEvolverFactory) – uma função para inicializar a instância
Evolverque produz o estado de evolução temporal aproximado, , para diferentes valores de dependendo da etapa de tempo fornecida,dt. - initial_state (Any) – o estado inicial ( ou ) com relação ao qual serão computados os elementos de
LSE.Ae deLSE.b. O tipo desse objeto deve corresponder ao backend da rede de tensores escolhido para os argumentos anteriores.
Retorna
O LSE para encontrar os coeficientes MPF dinâmicos, conforme descrito acima.
Tipo de retorno
Referências
[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
Os protocolos a seguir definem as assinaturas de função para os vários argumentos da fábrica de objetos.
IdentityStateFactory
class IdentityStateFactory(*args, **kwargs)
Bases: Protocol
O protocolo de função de fábrica para a construção de uma instância de identidade State instância.
Conforme explicado com mais detalhes em setup_dynamic_lse()essa função de fábrica é chamada para inicializar o DynamicMPF.evolution_state com uma identidade ou estado vazio. Essa função não deve receber nenhum argumento e retornar uma instância State instância.
ExactEvolverFactory
class ExactEvolverFactory(*args, **kwargs)
Bases: Protocol
O protocolo da função de fábrica para a construção de uma instância exata Evolver exata.
Conforme explicado com mais detalhes em setup_dynamic_lse()essa função de fábrica é chamada para inicializar as DynamicMPF.lhs instâncias de Evolver que produzem o estado exato da evolução temporal, , ao calcular os elementos .
ApproxEvolverFactory
class ApproxEvolverFactory(*args, **kwargs)
Bases: Protocol
O protocolo da função de fábrica para a construção de uma instância aproximada de Evolver aproximada.
Conforme explicado com mais detalhes em setup_dynamic_lse()essa função de fábrica é chamada para inicializar as DynamicMPF.rhs instâncias de Evolver ao computar os elementos ou ambos os lados (DynamicMPF.lhs e DynamicMPF.rhs) ao calcular os elementos . Como esses estados de evolução temporal aproximada dependem da etapa de Trotter ( ), essa função exige que a etapa de tempo da evolução temporal seja fornecida como um argumento de palavra-chave chamado dt.
Algoritmo central
DynamicMPF
class DynamicMPF(evolution_state, lhs, rhs)
Bases: object
O algoritmo MPF dinâmico.
Instanciado com um LHS e um RHS Evolver esse algoritmo irá evolve() compartilhado State até um tempo de evolução desejado. Em seguida, o DynamicMPF.overlap() da evolução temporal State com algum estado inicial pode ser calculado. Veja setup_dynamic_lse() para obter uma explicação mais detalhada sobre como isso é usado para calcular os elementos e que compõem os LSE dos coeficientes dinâmicos do MPF.
Referências
[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
Construa uma DynamicMPF instância.
Parâmetros
- evolution_state (State) – o estado a ser compartilhado pelos mecanismos de evolução temporal do LHS e do RHS.
- lhs (Evolver) – o mecanismo de evolução temporal do LHS.
- rhs (Evolver) – o mecanismo de evolução temporal do RHS.
TEMPO_DECIMAIS
Tipo: int
Valor Padrão: 8
O número de casas decimais usadas para arredondar os tempos de evolução.
Durante a evolução do tempo do evolution_statecomparamos frequentemente os tempos evoluídos dos mecanismos LHS e RHS entre si, bem como o tempo de evolução do alvo. Essas verificações comparam números de ponto flutuante e essa configuração especifica o número de casas decimais que serão arredondadas.
evolution_state
O estado compartilhado entre os mecanismos de evolução temporal do LHS e do RHS.
evolve
evolve(time)
Evolua o algoritmo MPF dinâmico até o tempo fornecido.
Na verdade, isso executa o algoritmo MPF dinâmico por meio da evolução temporal DynamicMPF.evolution_state até o tempo especificado usando as instâncias LHS e RHS Evolver instâncias.
Parâmetros
time (float) – o tempo total de evolução do alvo.
Aumentos
RuntimeError - se os tempos evoluídos de LHS e RHS não forem iguais no final.
Tipo de retorno
Nenhum
lhs
O mecanismo de evolução temporal do LHS.
overlap
overlap(initial_state)
Calcule a sobreposição de DynamicMPF.evolution_state com o estado fornecido.
O tipo de initial_state fornecido dependerá do backend escolhido usado para o State e Evolver fornecidas para essa instância DynamicMPF instância. Em outras palavras, um backend pode suportar apenas um tipo específico de objetos initial_state para esse cálculo de sobreposição. Consulte também as explicações do argumento initial_state para o setup_dynamic_lse() para obter mais detalhes.
Parâmetros
initial_state (Any) – o estado inicial com o qual será calculada a sobreposição.
Aumentos
TypeError - se o estado inicial fornecido tiver um tipo incompatível.
Retorna
A sobreposição de DynamicMPF.evolution_state com o fornecido.
Tipo de retorno
rhs
O mecanismo de evolução temporal do RHS.