QuEST-Kit/QuEST

Imaginary-Time Evolution

Closed this issue · 4 comments

Hi there, new to QuEST and was hoping for a pointer in the right direction.

Within QuEST I would like to prepare the state $|\psi(\beta)\rangle = \frac{1}{N} e^{-\beta H} |\psi_0\rangle$ where $N$ is the normalisation constant, for some Hamiltonian $H$ and initial state $|\psi_0\rangle$. This state could be generated using variational simulation methods, but I would rather generate the state directly/exactly.
Alternately a function that acts similarly to the ApplyTrotterCircuit function but instead evolves the state in imaginary time.

I would be grateful for some advice, or if a small example could be provided demonstrating how this could be implemented.

Thanks,
Joe

Hi Joe,
Sure, something like this is very doable, albeit not directly with a single function.
Is your Hamiltonian $H$ specified as an element-wise matrix, or as a real-weighted sum of Pauli tensors?

$H$ will be a Heisenberg Hamiltonian on some 1D/2D lattice, so a description in terms of a Pauli decomposition would be preferred.

Apologies for the delay - I hope this is still valuable!

You can trotterise the (non-unitary) "imaginary-time generator" exp(- beta t H) like is done in this work. Each term in the product resembles operator exp(coeff * pauli product). Because coeff is real, this operator not a Pauli gadget like QuEST supports.

But as I show here,

exp(coeff * pauli-prod) = cosh(coeff) * Identity + sinh(coeff) * pauli-prod

QuEST is soon (well, some months away still) to receive functions that make effecting such operators trivial.
But right now, you could effect it upon a given state qureg by...

  • cloning qureg into a copy tmp via cloneQureg()
  • apply the pauli-product upon qureg as a single-term sum via applyPauliSum()
  • combine the registers via setWeightedQureg(), giving tmp coefficient cosh(coeff) and qureg coefficient sinh(coeff), overwriting qureg.

Let me know if I'm not uselessly late and I can help with a full implementation. Please leave this issue open in any case, since I think incorporating a Trotterised imaginary-time evolver is a good idea, and I'll make a full implementation (faster than the above hack) after the aforementioned QuEST changes.

Hi Tyson,

I have since started using QuESTlink instead to perform these calculations (which I am enjoying much more 😁), but thank you for the answer.