DMRG for non Hermitian MPO

Hello!

I am trying to look at the left and right eigenvectors of a non-Hemitian MPO. I have seen that DMRG is able to find the lowest eigenvalue of the system if you use the flag ishermitian=false. It works fine and I am able to find the right eigenvector. However, to find the left eigenvector I use swapprime(dag(ℋ), 0 => 1), where `ℋ`` was the previous MPO and it gives me the following error.

DimensionMismatch: cannot add ITensors with different numbers of indices

The code is just that

E,ψ = dmrg(ℋ, MPS(stotal, ["0" for i=1:2*n]), sweeps,ishermitian = false)
E,ψ1 = dmrg(swapprime(dag(ℋ), 0 => 1), MPS(stotal, ["0" for i=1:2*n]), sweeps,ishermitian = false)

and the first line works and the second does not. I have looked at the MPO to see if there was something wrong since it says DimensionMissmatch, and the only thing that I have seen is that the primes in the sites are ordered differently.

ℋ = MPO
[1] ((dim=2|id=156|"Qubit,Site,n=1"), (dim=2|id=156|"Qubit,Site,n=1")', (dim=5|id=918|"Link,l=1"))
[2] ((dim=2|id=72|"Qubit,Site,n=1"), (dim=2|id=72|"Qubit,Site,n=1")', (dim=8|id=768|"Link,l=1"), (dim=5|id=918|"Link,l=1"))
[3] ((dim=2|id=271|"Qubit,Site,n=2"), (dim=2|id=271|"Qubit,Site,n=2")', (dim=10|id=554|"Link,l=2"), (dim=8|id=768|"Link,l=1"))
[4] ((dim=2|id=188|"Qubit,Site,n=2"), (dim=2|id=188|"Qubit,Site,n=2")', (dim=10|id=798|"Link,l=2"), (dim=10|id=554|"Link,l=2"))
[5] ((dim=2|id=584|"Qubit,Site,n=3"), (dim=2|id=584|"Qubit,Site,n=3")', (dim=11|id=592|"Link,l=3"), (dim=10|id=798|"Link,l=2"))
[6] ((dim=2|id=613|"Qubit,Site,n=3"), (dim=2|id=613|"Qubit,Site,n=3")', (dim=10|id=473|"Link,l=3"), (dim=11|id=592|"Link,l=3"))
[7] ((dim=2|id=388|"Qubit,Site,n=4"), (dim=2|id=388|"Qubit,Site,n=4")', (dim=11|id=446|"Link,l=4"), (dim=10|id=473|"Link,l=3"))
[8] ((dim=2|id=994|"Qubit,Site,n=4"), (dim=2|id=994|"Qubit,Site,n=4")', (dim=10|id=916|"Link,l=4"), (dim=11|id=446|"Link,l=4"))
[9] ((dim=2|id=520|"Qubit,Site,n=5"), (dim=2|id=520|"Qubit,Site,n=5")', (dim=9|id=517|"Link,l=5"), (dim=10|id=916|"Link,l=4"))
[10] ((dim=2|id=556|"Qubit,Site,n=5"), (dim=2|id=556|"Qubit,Site,n=5")', (dim=9|id=443|"Link,l=5"), (dim=9|id=517|"Link,l=5"))
[11] ((dim=2|id=497|"Qubit,Site,n=6"), (dim=2|id=497|"Qubit,Site,n=6")', (dim=9|id=589|"Link,l=6"), (dim=9|id=443|"Link,l=5"))
[12] ((dim=2|id=924|"Qubit,Site,n=6"), (dim=2|id=924|"Qubit,Site,n=6")', (dim=9|id=760|"Link,l=6"), (dim=9|id=589|"Link,l=6"))
[13] ((dim=2|id=822|"Qubit,Site,n=7"), (dim=2|id=822|"Qubit,Site,n=7")', (dim=8|id=170|"Link,l=7"), (dim=9|id=760|"Link,l=6"))
[14] ((dim=2|id=806|"Qubit,Site,n=7"), (dim=2|id=806|"Qubit,Site,n=7")', (dim=9|id=641|"Link,l=7"), (dim=8|id=170|"Link,l=7"))
[15] ((dim=2|id=402|"Qubit,Site,n=8"), (dim=2|id=402|"Qubit,Site,n=8")', (dim=8|id=417|"Link,l=8"), (dim=9|id=641|"Link,l=7"))
[16] ((dim=2|id=363|"Qubit,Site,n=8"), (dim=2|id=363|"Qubit,Site,n=8")', (dim=8|id=472|"Link,l=8"), (dim=8|id=417|"Link,l=8"))
[17] ((dim=2|id=452|"Qubit,Site,n=9"), (dim=2|id=452|"Qubit,Site,n=9")', (dim=5|id=967|"Link,l=9"), (dim=8|id=472|"Link,l=8"))
[18] ((dim=2|id=779|"Qubit,Site,n=9"), (dim=2|id=779|"Qubit,Site,n=9")', (dim=5|id=586|"Link,l=9"), (dim=5|id=967|"Link,l=9"))
[19] ((dim=2|id=43|"Qubit,Site,n=10"), (dim=2|id=43|"Qubit,Site,n=10")', (dim=2|id=6|"Link,l=19"), (dim=5|id=586|"Link,l=9"))
[20] ((dim=2|id=124|"Qubit,Site,n=10"), (dim=2|id=124|"Qubit,Site,n=10")', (dim=2|id=6|"Link,l=19"))
swapprime(dag(ℋ), 0 => 1) = MPO
[1] ((dim=2|id=156|"Qubit,Site,n=1")', (dim=2|id=156|"Qubit,Site,n=1"), (dim=5|id=918|"Link,l=1")')
[2] ((dim=2|id=72|"Qubit,Site,n=1")', (dim=2|id=72|"Qubit,Site,n=1"), (dim=8|id=768|"Link,l=1")', (dim=5|id=918|"Link,l=1")')
[3] ((dim=2|id=271|"Qubit,Site,n=2")', (dim=2|id=271|"Qubit,Site,n=2"), (dim=10|id=554|"Link,l=2")', (dim=8|id=768|"Link,l=1")')
[4] ((dim=2|id=188|"Qubit,Site,n=2")', (dim=2|id=188|"Qubit,Site,n=2"), (dim=10|id=798|"Link,l=2")', (dim=10|id=554|"Link,l=2")')
[5] ((dim=2|id=584|"Qubit,Site,n=3")', (dim=2|id=584|"Qubit,Site,n=3"), (dim=11|id=592|"Link,l=3")', (dim=10|id=798|"Link,l=2")')
[6] ((dim=2|id=613|"Qubit,Site,n=3")', (dim=2|id=613|"Qubit,Site,n=3"), (dim=10|id=473|"Link,l=3")', (dim=11|id=592|"Link,l=3")')
[7] ((dim=2|id=388|"Qubit,Site,n=4")', (dim=2|id=388|"Qubit,Site,n=4"), (dim=11|id=446|"Link,l=4")', (dim=10|id=473|"Link,l=3")')
[8] ((dim=2|id=994|"Qubit,Site,n=4")', (dim=2|id=994|"Qubit,Site,n=4"), (dim=10|id=916|"Link,l=4")', (dim=11|id=446|"Link,l=4")')
[9] ((dim=2|id=520|"Qubit,Site,n=5")', (dim=2|id=520|"Qubit,Site,n=5"), (dim=9|id=517|"Link,l=5")', (dim=10|id=916|"Link,l=4")')
[10] ((dim=2|id=556|"Qubit,Site,n=5")', (dim=2|id=556|"Qubit,Site,n=5"), (dim=9|id=443|"Link,l=5")', (dim=9|id=517|"Link,l=5")')
[11] ((dim=2|id=497|"Qubit,Site,n=6")', (dim=2|id=497|"Qubit,Site,n=6"), (dim=9|id=589|"Link,l=6")', (dim=9|id=443|"Link,l=5")')
[12] ((dim=2|id=924|"Qubit,Site,n=6")', (dim=2|id=924|"Qubit,Site,n=6"), (dim=9|id=760|"Link,l=6")', (dim=9|id=589|"Link,l=6")')
[13] ((dim=2|id=822|"Qubit,Site,n=7")', (dim=2|id=822|"Qubit,Site,n=7"), (dim=8|id=170|"Link,l=7")', (dim=9|id=760|"Link,l=6")')
[14] ((dim=2|id=806|"Qubit,Site,n=7")', (dim=2|id=806|"Qubit,Site,n=7"), (dim=9|id=641|"Link,l=7")', (dim=8|id=170|"Link,l=7")')
[15] ((dim=2|id=402|"Qubit,Site,n=8")', (dim=2|id=402|"Qubit,Site,n=8"), (dim=8|id=417|"Link,l=8")', (dim=9|id=641|"Link,l=7")')
[16] ((dim=2|id=363|"Qubit,Site,n=8")', (dim=2|id=363|"Qubit,Site,n=8"), (dim=8|id=472|"Link,l=8")', (dim=8|id=417|"Link,l=8")')
[17] ((dim=2|id=452|"Qubit,Site,n=9")', (dim=2|id=452|"Qubit,Site,n=9"), (dim=5|id=967|"Link,l=9")', (dim=8|id=472|"Link,l=8")')
[18] ((dim=2|id=779|"Qubit,Site,n=9")', (dim=2|id=779|"Qubit,Site,n=9"), (dim=5|id=586|"Link,l=9")', (dim=5|id=967|"Link,l=9")')
[19] ((dim=2|id=43|"Qubit,Site,n=10")', (dim=2|id=43|"Qubit,Site,n=10"), (dim=2|id=6|"Link,l=19")', (dim=5|id=586|"Link,l=9")')
[20] ((dim=2|id=124|"Qubit,Site,n=10")', (dim=2|id=124|"Qubit,Site,n=10"), (dim=2|id=6|"Link,l=19")')

Could this be the problem. If so, is there an easy way to fix it?

Thank you very much,
Aleix

1 Like

What you wrote should work. My best guess is that the issue is that the link indices got primed, which in principle shouldn’t be a problem but in practice there may be a bug.

Could you try this instead:

noprime(linkinds, swapprime(dag(ℋ), 0 => 1))
3 Likes

Hello Mat,

Unpriming the linkinds solve the issue.

Thank you very much,
Aleix

1 Like

Glad to hear that works. I’ll raise an issue about this to remind us to make sure it works even if the link indices are primed.

1 Like