Skip to main content
IBM Quantum Platform

Backend Quimb TEBD

qiskit_addon_mpf.backends.quimb_tebd

A quimb-com base no backend TEBD.

Aviso

Esse backend só estará disponível se as dependências opcionais tiverem sido instaladas:

pip install "qiskit-addon-mpf[quimb]"
TEBDEvolverUm algoritmo TEBD para a evolução de um MPO interno.
MPOStateUma MPO aplicando o medidor Vidal.

Método subjacente

Esse módulo fornece um backend de evolução temporal para calcular coeficientes MPF dinâmicos com base no algoritmo [1] de decimação de bloco com evolução temporal (TEBD) implementado na quimb biblioteca de rede de tensores.

As classes fornecidas por esse módulo têm duas finalidades:

  1. Conectando quimbà interface definida por qiskit_addon_mpf.backends.
  2. Extensão da implementação do quimbpara lidar com um estado MPO interno (em vez de MPS) (consulte também State para obter mais detalhes).

No sentido mais simples, esse módulo fornece uma extensão direta do algoritmo TEBD para desenvolver um estado MPO interno. Portanto, se você quiser usar esse backend para seu algoritmo MPF dinâmico, deverá codificar o Hamiltoniano que deseja evoluir no tempo, em uma quimb-forma nativa. Para ser mais concreto, a classe TEBDEvolver (que é uma subclasse de quimb.tensor.TEBD) trabalha com um Hamiltoniano na forma de um quimb.tensor.LocalHam1D. O Quimb oferece vários métodos convenientes para a construção desses Hamiltonianos em seu módulo quimb.tensor.tensor_builder módulo. Se nenhuma dessas opções atender às suas necessidades, você pode considerar o uso da classe LayerModel que implementa alguns métodos de conversão de objetos nativos do Qiskit.


Exemplo de código

Esta seção mostra um exemplo simples para que você comece a usar esse backend. O exemplo mostra como criar as três funções de fábrica necessárias para a função setup_dynamic_lse().

Primeiro, criamos o site identity_factory , que deve corresponder ao IdentityStateFactory protocolo. Fazemos isso simplesmente usando a função quimb.tensor.MPO_identity() e envolvendo a função quimb.tensor.MatrixProductOperator resultante com nossa interface 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))

Em seguida, antes de podermos definir os atributos ExactEvolverFactory e ApproxEvolverFactory devemos definir o Hamiltoniano que gostaríamos de fazer evoluir no tempo. Aqui, simplesmente escolhemos um dos métodos de conveniência do quimbde sua empresa.

>>> from quimb.tensor import ham_1d_heis
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)

Agora podemos construir as fábricas de instâncias de evolução temporal exata e aproximada. Para fazer isso, podemos simplesmente usar functools.partial() para vincular os valores predefinidos do inicializador TEBDEvolver reduzindo-o para a interface correta, conforme esperado pelas funções ExactEvolverFactory e 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,
... )

Observe como fixamos o valor de dt em uma pequena etapa de tempo e usamos uma decomposição Suzuki-Trotter de ordem superior para imitar a evolução exata do tempo acima.

Abaixo, não fixamos o valor dt e usamos apenas uma fórmula Suzuki-Trotter de segunda ordem para a evolução aproximada do tempo. Além disso, também especificamos algumas configurações de truncamento.

>>> approx_evolver_factory = partial(
...     TEBDEvolver,
...     H=hamil,
...     order=2,
...     split_opts={"max_bond": 10, "cutoff": 1e-5},
... )

Obviamente, você não está limitado aos exemplos mostrados aqui, e nós o incentivamos a brincar com as outras configurações fornecidas pela implementação do quimb.tensor.TEBD implementação.


Limitações

Por fim, apontamos algumas limitações conhecidas sobre os tipos de Hamiltonianos que podem ser tratados por esse backend:

  • todas as interações devem ser unidimensionais
  • as interações devem ser acíclicas

Recursos

[1]: https://en.wikipedia.org/wiki/Time-evolving _block_decimation

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