ITensorInfiniteMPS.jl icon indicating copy to clipboard operation
ITensorInfiniteMPS.jl copied to clipboard

Simplify `vumps` interface

Open mtfishman opened this issue 3 years ago • 0 comments

Currently you have to call vumps and subspace_expansion in separate function calls, for example:

for _ in 1:n_subspace_expansions
  ψ = subspace_expansion(ψ, H; maxdim=100, cutoff=1e-8)
  ψ = vumps(H, ψ; tol=1e-5, maxiter=20)
end

which performs subspace expansion n_subspace_expansions times, and for each bond dimension runs VUMPS to some level of convergence.

It would be better to hide the subspace expansion inside the vumps call, and use an interface closer to the keyword argument interface of ITensors.dmrg.

The closest interface would be something like:

maxdim = [10, 10, 10, 10, 20, 20, 20, 20, 50, 50, 50, 50, 100]
ψ = vumps(ψ, H; maxdim, cutoff=1e-8, maxiter=50, precision_error_tol=1e-5)

This would attempt to perform subspace expansion at each iteration, which automatically skips if the bond dimension is saturated.

We could rely on Julia functions to make it easier to specify more maxdims, for example:

niter_per_dim = 20
maxdims = [10, 20, 50, 100]
maxdim = [fill(maxdim_i,niter_per_dim) for maxdim_i in maxdims] 
ψ = vumps(ψ, H; maxdim, cutoff=1e-8, precision_error_tol=1e-5)

A disadvantage is that we probably want to provide a variety of subspace expansion techniques, but that could be specified with a different interface, like passing a function:

ψ = vumps(ψ, H; maxdim, cutoff=1e-8, precision_error_tol=1e-5, subspace_expansion=my_subspace_expansion)

@hershsingh @LHerviou

mtfishman avatar Jul 15 '22 23:07 mtfishman