Hi,
I am trying to get thermal states \rho_\beta = e^{-\beta H} mean values of local observables for long-range interacting system. More concretely the Long Range Spin chain:
Notice that the smaller the \alpha, the “least” local the model is, and thereby MPs and MPOs representations are less efficient as the entanglement of the system is greater.
We construct the time evolution operator of the LR-Ising model explicitly in the short-range case(Radware Bot Manager Captcha) and then applying a super-extensive amount of swap gates to exactly simulate the power-law interactions in a finite system size. This yields a Trotterized representation of the time evolution operator U(\delta t) = \mathrm{e}^{-iH \delta t} in form of an MPO. We concatenate the Trotterized time evoltion to yield the desired final imaginary time or \beta U(t) \simeq \prod_{i=1}^{n_t} U(\delta t), with t = n_t \cdot \delta t.
When I perform the simulations for \alpha \leq 1.5, despite the bond dimension not to collapse the evolution stops and we have the following error:
ERROR: LoadError: BoundsError: attempt to access 0-element Vector{Pair{QN, Int64}} at index [1]
Stacktrace:
[1] throw_boundserror(A::Vector{Pair{QN, Int64}}, I::Tuple{Int64})
@ Base ./essentials.jl:14
[2] getindex
@ ./essentials.jl:916 [inlined]
[3] combineblocks(qns::Vector{Pair{QN, Int64}})
@ ITensors ~/.julia/packages/ITensors/4M2ep/src/qn/qnindex.jl:413
[4] combineblocks
@ ~/.julia/packages/ITensors/4M2ep/src/qn/qnindex.jl:475 [inlined]
[5] combiner(inds::Tuple{Index{Vector{Pair{QN, Int64}}}, Index{Vector{Pair{QN, Int64}}}, Index{Vector{Pair{QN, Int64}}}}; dir::Nothing, tags::String)
@ ITensors ~/.julia/packages/ITensors/4M2ep/src/qn/qnitensor.jl:444
[6] combiner(::Index{Vector{Pair{QN, Int64}}}, ::Vararg{Index{Vector{Pair{QN, Int64}}}}; kwargs::@Kwargs{dir::Nothing})
@ ITensors ~/.julia/packages/ITensors/4M2ep/src/tensor_operations/itensor_combiner.jl:7
[7] svd(A::ITensor, Linds::Vector{Index{Vector{Pair{QN, Int64}}}}; leftdir::Nothing, rightdir::Nothing, lefttags::TagSet, righttags::TagSet, mindim::Int64, maxdim::Int64, cutoff::Float64, alg::Nothing, use_absolute_cutoff::Nothing, use_relative_cutoff::Nothing, min_blockdim::Nothing, utags::TagSet, vtags::TagSet)
@ ITensors ~/.julia/packages/ITensors/4M2ep/src/tensor_operations/matrix_decomposition.jl:153
[8] svd
@ ~/.julia/packages/ITensors/4M2ep/src/tensor_operations/matrix_decomposition.jl:110 [inlined]
[9] factorize_svd(A::ITensor, Linds::Vector{Index{Vector{Pair{QN, Int64}}}}; singular_values!::Nothing, ortho::String, alg::Nothing, dir::Nothing, mindim::Int64, maxdim::Int64, cutoff::Float64, tags::TagSet, use_absolute_cutoff::Nothing, use_relative_cutoff::Nothing, min_blockdim::Nothing)
@ ITensors ~/.julia/packages/ITensors/4M2ep/src/tensor_operations/matrix_decomposition.jl:614
[10] factorize(A::ITensor, Linds::Vector{Index{Vector{Pair{QN, Int64}}}}; mindim::Int64, maxdim::Int64, cutoff::Float64, ortho::String, tags::TagSet, plev::Nothing, which_decomp::Nothing, eigen_perturbation::Nothing, svd_alg::Nothing, use_absolute_cutoff::Nothing, use_relative_cutoff::Nothing, min_blockdim::Nothing, singular_values!::Nothing, dir::Nothing)
@ ITensors ~/.julia/packages/ITensors/4M2ep/src/tensor_operations/matrix_decomposition.jl:808
[11] contract(::NDTensors.BackendSelection.Algorithm{:zipup, @NamedTuple{}}, A::MPO, B::MPO; cutoff::Float64, maxdim::Int64, mindim::Int64, kwargs::@Kwargs{})
@ ITensors.ITensorMPS ~/.julia/packages/ITensors/4M2ep/src/ITensorMPS/mpo.jl:845
[12] contract
@ ~/.julia/packages/ITensors/4M2ep/src/ITensorMPS/mpo.jl:815 [inlined]
[13] contract(A::MPO, B::MPO; alg::String, kwargs::@Kwargs{cutoff::Float64, maxdim::Int64})
@ ITensors.ITensorMPS ~/.julia/packages/ITensors/4M2ep/src/ITensorMPS/mpo.jl:808
[14] contract
@ ~/.julia/packages/ITensors/4M2ep/src/ITensorMPS/mpo.jl:807 [inlined]
[15] product(A::MPO, B::MPO; kwargs::@Kwargs{cutoff::Float64, maxdim::Int64})
@ ITensors.ITensorMPS ~/.julia/packages/ITensors/4M2ep/src/ITensorMPS/mpo.jl:885
[16] top-level scope
@ ~/jssegovia/Codes/CorrelationOfDecayLR/CorrelationOfDecayLR/GibbsExpectationValue_tosend.jl:87
in expression starting at /lustre/home/ift/jssegovia/jssegovia/Codes/CorrelationOfDecayLR/CorrelationOfDecayLR/GibbsExpectationValue_tosend.jl:83
The code is the following, and I’ve used the parameters: \delta t=0.01, SVDcutoff=1e-18, and the evolution stopped at \beta=2.85 when I was aiming \beta=3. The problem gets worse when decreasing \alpha:
The code is something like this:
for (i, t) in enumerate(β_values)
contraction_U[:] = apply(U_δt, contraction_U; cutoff=SVDcutoff, maxdim=SVDmaxdim) #here U_δt is the infinitesimal imaginary time evolution MPO, and contraction_U is initialized as the Identity MPO
trace_values[i] = tr(contraction_U)
A_values[i]= tr(apply( contraction_U, A; cutoff=SVDcutoff, maxdim=SVDmaxdim))*(1/trace_values[i])
maxdim = maxlinkdim(contraction_U)
open(csv_filename, "a") do file
writedlm(file, [t trace_values[i] A_values[i] maxdim], ',')
end
@printf("After t=%g\tmaxlinkdim=%d\ttimestep %d out of %d", t, maxdim, i, ntimes)
println(" runtime: $(Dates.canonicalize(Dates.now() - t1))")
end
I don’t have a good intuition of what is going on, If someone has it would be really helpful!