Skip to main content
IBM Quantum Platform

Backend baseado no circuito Quimb

qiskit_addon_mpf.backends.quimb_circuit

Um backend de evolução temporal baseado em circuito usando quimb.

Aviso

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

pip install "qiskit-addon-mpf[quimb]"
CircuitEvolverUm mecanismo de evolução temporal baseado em circuitos quânticos.
CircuitStateUma representação do tipo MPO de um estado de evolução temporal com base em circuitos quânticos.

Método subjacente

O Quimb oferece suporte direto para a simulação de circuitos quânticos na forma de sua representação baseada em rede de tensores quimb.tensor.Circuit representação. Podemos aproveitar isso para ignorar qualquer algoritmo de evolução temporal explícito e, em vez disso, codificar diretamente a evolução temporal em um QuantumCircuit e usar quimb para calcular a sobreposição entre dois desses circuitos. Para obter mais informações, consulte o guia deles sobre circuitos quânticos.


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

O protocolo IdentityStateFactory já é cumprido pelo construtor CircuitState tornando o argumento identity_factory trivial:

>>> from qiskit_addon_mpf.backends.quimb_circuit import CircuitState
>>> identity_factory = CircuitState

A configuração do CircuitEvolver é um pouco mais complexa. Requer um **parametrizado **QuantumCircuit objeto como sua entrada onde o Parameter deve tomar o lugar do passo de tempo do método Trotter (dt ).

Para mostrar como esse modelo de circuito de Trotter parametrizado é construído, reutilizamos o mesmo Hamiltoniano e a fórmula de Suzuki-Trotter de segunda ordem como em quimb_layers.

>>> from qiskit.quantum_info import SparsePauliOp
>>> hamil = SparsePauliOp.from_sparse_list(
...     [("ZZ", (i, i+1), 1.0) for i in range(0, 9, 2)] +
...     [("Z", (i,), 0.5) for i in range(10)] +
...     [("ZZ", (i, i+1), 1.0) for i in range(1, 9, 2)] +
...     [("X", (i,), 0.25) for i in range(10)],
...     num_qubits=10,
... )

Mas, desta vez, especificamos um Parameter como o argumento time ao construir os circuitos reais.

>>> from functools import partial
>>> from qiskit.circuit import Parameter
>>> from qiskit.synthesis import SuzukiTrotter
>>> from qiskit_addon_mpf.backends.quimb_circuit import CircuitEvolver
>>> from qiskit_addon_utils.problem_generators import generate_time_evolution_circuit
>>> dt = Parameter("dt")
>>> suzuki_2 = generate_time_evolution_circuit(hamil, time=dt, synthesis=SuzukiTrotter(order=2))
>>> approx_evolver_factory = partial(CircuitEvolver, circuit=suzuki_2)
Cuidado

É necessário que o nome do arquivo Parameter seja dt!

Podemos escolher uma fórmula de Trotter de ordem superior para o exact_evolver_factory. Mas observe que, mais uma vez, precisamos usar um circuito parametrizado, mesmo que vinculemos imediatamente seu parâmetro ao construir a função partial .

>>> suzuki_4 = generate_time_evolution_circuit(hamil, time=dt, synthesis=SuzukiTrotter(order=4))
>>> exact_evolver_factory = partial(CircuitEvolver, circuit=suzuki_4, dt=0.05)

Essas funções de fábrica agora podem ser usadas para executar o programa setup_dynamic_lse(). Consulte sua documentação para obter mais detalhes sobre isso.

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