Hi, thanks a lot for creating these libraries. I love the simplicity of constructing DMRG codes with them!

I have a question, why do the first Hamiltonian MPO sites always have two rows instead of one? I have worked with the TNT libraries, and we use 1 row and 1 column at the first and last sites in that software. Wouldn't having two rows or columns make the code inefficient for big Hilbert spaces?

Thanks in advance,

## Question about the Hamiltonian MPO

### Re: Question about the Hamiltonian MPO

MPOs are extensive sums of local terms; thus they take a Jordan block form

\[ W = \begin{pmatrix} 1 & C & D \\ 0 & A & B \\ 0 & 0 & 1 \end{pmatrix} = \text{e.g. for transverse field ising} \begin{pmatrix} 1 & X & - Z \\ 0 & 0 & X \\ 0 & 0 & 1 \end{pmatrix} \]

The first and last index here are special, because they have the identity blocks. TeNPy chooses to keep those identity blocks/indices around by default, just because that allows to easily modify/extract onsite terms and avoid complications for some methods that require them (e.g in calc_H_bond_from_MPO).

In general, this is a tiny bit of extra work for finite MPS, yes, but it's definitely a subleading contribution - even for huge local bond dimensions, it's not gonna give you a substantial speedup of more than a few percent (unless you only have this huge local dimension only at the boundaries, and/or a tiny system).

That being said, if it really bothers you that much, you can easily disable this by setting the option

\[ W = \begin{pmatrix} 1 & C & D \\ 0 & A & B \\ 0 & 0 & 1 \end{pmatrix} = \text{e.g. for transverse field ising} \begin{pmatrix} 1 & X & - Z \\ 0 & 0 & X \\ 0 & 0 & 1 \end{pmatrix} \]

The first and last index here are special, because they have the identity blocks. TeNPy chooses to keep those identity blocks/indices around by default, just because that allows to easily modify/extract onsite terms and avoid complications for some methods that require them (e.g in calc_H_bond_from_MPO).

In general, this is a tiny bit of extra work for finite MPS, yes, but it's definitely a subleading contribution - even for huge local bond dimensions, it's not gonna give you a substantial speedup of more than a few percent (unless you only have this huge local dimension only at the boundaries, and/or a tiny system).

That being said, if it really bothers you that much, you can easily disable this by setting the option

`insert_all_Ids=False`

of the function from_terms when constructing the MPO, presumably in the source code of calc_H_MPO.