Skip to main content
IBM Quantum Platform

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)

GitHub

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.AMM em [1] e [2] ) e o vetor de sobreposição (LSE.b, LL em [1] e [2] ) para os parâmetros de evolução temporal fornecidos.

Os elementos da matriz Gram, MijM_{ij}, e o vetor de sobreposição, LiL_i, são definidos como

Mij=Tr(ρki(t)ρkj(t)),Li=Tr(ρ(t)ρki(t)),\begin{split}M_{ij} &= \text{Tr}(\rho_{k_i}(t)\rho_{k_j}(t)) \, , \\ L_i &= \text{Tr}(\rho(t)\rho_{k_i}(t)) \, ,\end{split}

em que ρ(t)\rho(t) é o estado exato da evolução do tempo no momento tt e ρki(t)\rho_{k_i}(t) é o estado da evolução do tempo aproximado usando as etapas de Trotter de kik_i.

O cálculo dos coeficientes MPF dinâmicos (ou seja, dependentes do tempo) de MM e LL 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 ( ixi=1\sum_i x_i = 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 MijM_{ij} e LiL_i 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 ( ψin\psi_{in} em [1] e ψ0\psi_0 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 MijM_{ij} e LiL_i, 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 partial

Primeiro, 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 LiL_i (ou seja, deve produzir o estado exato da evolução do tempo, ρ(t)\rho(t) ).

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, ρki(t)\rho_{k_i}(t), em que kik_i é determinado pela etapa de tempo escolhida, dt. Dessa forma, essas instâncias serão usadas para calcular o RHS do LiL_i, bem como os dois lados dos elementos do MijM_{ij}.

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 State vazio.
  • exact_evolver_factory (ExactEvolverFactory) – uma função para inicializar a instância Evolver que produz o estado exato da evolução temporal, ρ(t)\rho(t).
  • approx_evolver_factory (ApproxEvolverFactory) – uma função para inicializar a instância Evolver que produz o estado de evolução temporal aproximado, ρki(t)\rho_{k_i}(t), para diferentes valores de kik_i dependendo da etapa de tempo fornecida, dt.
  • initial_state (Any) – o estado inicial ( ψin\psi_{in} ou ψ0\psi_0 ) com relação ao qual serão computados os elementos MijM_{ij} de LSE.A e LiL_i de LSE.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

LSE

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).

https://arxiv.org/abs/2407.17405v2


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)

GitHub

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)

GitHub

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, ρ(t)\rho(t), ao calcular os elementos LiL_i.

ApproxEvolverFactory

class ApproxEvolverFactory(*args, **kwargs)

GitHub

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 LiL_i ou ambos os lados (DynamicMPF.lhs e DynamicMPF.rhs) ao calcular os elementos MijM_{ij}. Como esses estados de evolução temporal aproximada dependem da etapa de Trotter ( ρki(t)\rho_{k_i}(t) ), 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)

GitHub

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 MijM_{ij} e LiL_i 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)

GitHub

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)

GitHub

Calcule a sobreposição de DynamicMPF.evolution_state com o estado fornecido.

Aviso

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

complexo

rhs

O mecanismo de evolução temporal do RHS.

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.