I’m currently using IDMRG2 in MPSKit, but have encountered some unexpected behavior.
Below is the relevant code snippet (I’m using the MPS2MPO function to handle Grassmann MPSs).
using TensorKit, MPSKit
function MPS2MPO(mps::MPSKit.InfiniteMPS)
mpo = [zeros(scalartype(mps.AL[i]), codomain(mps.AL[i]) ← space(mps.AL[i],2) ⊗ space(mps.AL[i],3)') for i in eachindex(mps.AL)]
for i in eachindex(mpo)
for (f1,f2) in fusiontrees(mpo[i])
f1′ = FusionTree((f1.uncoupled[1], Irrep[ℤ₂](f1.uncoupled[2].n + 1 % 2)), Irrep[ℤ₂](f1.coupled.n+1%2), f1.isdual)
f2′ = FusionTree(f2.uncoupled[[2]], f2.uncoupled[2], f2.isdual[[2]])
if f2.uncoupled[1].n == 0
copyto!(mpo[i][f1,f2] , mps.AL[i][f1,f2′])
elseif f1.uncoupled[2].n == 1
copyto!(mpo[i][f1,f2] , mps.AL[i][f1′,f2′])
end
end
for (f1,f2) in fusiontrees(mpo[i])
if f1.uncoupled[1].n == 1 && f2.uncoupled[1].n == 1
mpo[i][f1,f2] .*= -1
end
end
end
return MPSKit.InfiniteMPO(mpo)
end
function test(T = ComplexF64, L = 2)
Dh = 3
x = MPSKit.InfiniteMPS(randn, T, fill(Rep[ℤ₂](0=>1, 1=>1), L), fill(Rep[ℤ₂](0=>Dh, 1=>Dh), L))
y = MPSKit.InfiniteMPS(randn, T, fill(Rep[ℤ₂](0=>1, 1=>1), L), fill(Rep[ℤ₂](0=>Dh, 1=>Dh), L))
x′ = MPS2MPO(x)
res0 = x′ * y
Dh = 18
z1 = MPSKit.InfiniteMPS(randn, T, fill(Rep[ℤ₂](0=>1, 1=>1), L), fill(Rep[ℤ₂](0=>Dh, 1=>Dh), L))
res1, _ = approximate(z1, (x′, y), MPSKit.IDMRG(verbosity=1, tol=1e-12, maxiter=100))
z2 = MPSKit.InfiniteMPS(randn, T, fill(Rep[ℤ₂](0=>1, 1=>1), L), fill(Rep[ℤ₂](0=>Dh, 1=>Dh), L))
trunc = truncdim(2*Dh)
res2, _ = approximate(z2, (x′, y), MPSKit.IDMRG2(verbosity=1, tol=1e-12, maxiter=100, trscheme=trunc))
@assert norm(dot(res0, res0) - 1) < 1e-10
@assert norm(dot(res1, res1) - 1) < 1e-10
@assert norm(dot(res2, res2) - 1) < 1e-10
println(dot(res0, res1))
println(dot(res0, res2))
return res1, res2
end
test(Float64, 2)
test(ComplexF64, 2)
test(Float64, 4)
test(ComplexF64, 4)
┌ Warning: non-unique fixedpoint detected
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/fixedpoint.jl:27
┌ Warning: non-unique fixedpoint detected
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/fixedpoint.jl:27
┌ Warning: IDMRG cancel 100: err = 1.6503699291e-06 time = 1.04 sec
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/approximate/idmrg.jl:44
0.9999999992086777 - 8.43769498715119e-15im
0.9022513012776303 + 8.326672684688674e-16im
┌ Warning: IDMRG cancel 100: err = 4.2302533960e-07 time = 0.98 sec
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/approximate/idmrg.jl:44
0.9999999999803788 + 2.1895713171580676e-14im
0.5670804416153772 - 0.10941681962026244im
┌ Warning: non-unique fixedpoint detected
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/fixedpoint.jl:27
┌ Warning: non-unique fixedpoint detected
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/fixedpoint.jl:27
┌ Warning: IDMRG cancel 100: err = 3.7099543139e-08 time = 0.16 sec
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/approximate/idmrg.jl:44
0.9999999999999138 - 1.4464098719947963e-16im
0.9999999999999991 + 1.0607145446866777e-16im
┌ Warning: IDMRG cancel 100: err = 1.4863279294e-09 time = 0.21 sec
└ @ MPSKit ~/.julia/packages/MPSKit/bM5WR/src/algorithms/approximate/idmrg.jl:44
0.999999999999998 + 9.922618282587337e-16im
-0.16548138653124678 + 0.7396622075311708im
I’m currently using IDMRG2 in MPSKit, but have encountered some unexpected behavior.
Below is the relevant code snippet (I’m using the
MPS2MPOfunction to handle Grassmann MPSs).belwo is the output
IDMRG2 returns incorrect results for
L = 2, and also forT = ComplexF64, L = 4.I’m currently using
MPSKit v0.13.1andTensorKit v0.14.6.Do you know what might be causing this? Thank you in advance!