OpenFermion-Cirq
OpenFermion-Cirq copied to clipboard
Implement phase estimation
There are many variants of the basic phase estimation circuit. For instance, the one presented in the Kitaev, Shen, Vyalyi book is usually called 'iterative' and is different from the one in Nielsen and Chuang. There are many more variants on these in the literature. Does anyone have thoughts about what is the best for us right now/tricks we should incorporate? Or perhaps a textbook implementation of iterative phase estimation is good? I may end up working on this soon so references would be helpful.
Iterative phase estimation is what you want. Unlike the original phase estimation of Kitaev, the iterative variety is projective, which means that it is capable of projecting a non-eigenstate of U to an eigenstate of U. This is what we want because we'll be starting in the Hartree-Fock state. Furthermore, unlike the entanglement based method of Nielsen and Chuang (which involves an inverse QFT), iterative phase estimation requires only a single ancilla.
This should be fine: https://arxiv.org/abs/quant-ph/0610214
Although iterative phase estimation requires classical feedback. @Strilanc is that going to even be possible to simulate in Cirq?
Currently we don't support feedback because we don't know how the hardware will go about exposing feedback.
I don't think it makes sense to decide on or implement the outer loop for iterative phase estimation at this stage, especially without classical feedback.
IMO the most important thing to do would be a good implementation of the building block of IPEA (Fig. 2 of the paper @babbush linked). We should replace the power $2^{k-1}$ with M, and allow for arbitrary real M>0 and $\omega_k$. That gives full flexibility / generality later.
@kevinsung @idk3 how is this going? Obtaining these numerics on the Trotter error is probably the most important task right now.
I spent some time thinking about how to resolve #5 but decided that for now, I'll just write custom routines to produce controlled versions of the Trotter steps. I don't plan on using the trick where the control bit being 0 actually induces time evolution in reverse, or on trying to do everything with nearest neighbor interactions, unless you think either of these are critical. Although Cirq does not naturally support classical feedback, it should still be possible to implement the outer loop I think.
That sounds good. Indeed, in order to get a handle on Trotter errors it is not necessary to do anything fancy.