Dear Zhaochen,
Thank you for your nice package. I developed an iDMRG package some time ago (see GitHub - yangxucmt/iDMRG_v0.0: A mini julia repository for idmrg · GitHub) which might be of some interest. And I have one comment regarding the MPO construction.
In the early stages of my project, I used a similar approach, i.e., taking the central piece of the MPO generated by ITensor’s finite DMRG. This worked well for the toric code in one of my project, but it failed in another project involving the Heisenberg model with next nearest-neighbor interactions on a triangular lattice. The issue is that while the finite-state-machine construction in ITensor is translationally symmetric, ITensor may subsequently compress the MPO using MPS SVD compression algorithm, which can destroy the translational structure of the MPO.
For this reason, I think the best practice is still to construct the iMPO directly using the finite-state-machine algorithm. The algorithm is quite intuitive when spelled out on a piece of paper and is straightforward to implement. I’d be happy to explain it in more detail if you’re interested. You can also take a look at MPO_common.jl in my repository, where I implemented this construction. A related discussion for a finite MPO is MPO construction and compression principles (or: how does OpSum work?) - #4 by miles.
Best,
Xu