Skip to content

Commit fbda480

Browse files
committed
Centralize environment alg selection
1 parent 8a6dbce commit fbda480

File tree

6 files changed

+84
-84
lines changed

6 files changed

+84
-84
lines changed

src/algorithms/excitation/quasiparticleexcitation.jl

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ end
3333
################################################################################
3434

3535
function excitations(H, alg::QuasiparticleAnsatz, ϕ₀::InfiniteQP, lenvs, renvs;
36-
num=1, solver=Defaults.linearsolver)
37-
qp_envs(ϕ) = environments(ϕ, H, lenvs, renvs; solver)
36+
num=1, kwargs...)
37+
qp_envs(ϕ) = environments(ϕ, H, lenvs, renvs; kwargs...)
3838
E = effective_excitation_renormalization_energy(H, ϕ₀, lenvs, renvs)
3939
H_eff = @closure-> effective_excitation_hamiltonian(H, ϕ, qp_envs(ϕ), E))
4040

@@ -45,16 +45,16 @@ function excitations(H, alg::QuasiparticleAnsatz, ϕ₀::InfiniteQP, lenvs, renv
4545
return Es, ϕs
4646
end
4747
function excitations(H, alg::QuasiparticleAnsatz, ϕ₀::InfiniteQP, lenvs;
48-
num=1, solver=Defaults.linearsolver)
48+
num=1, kwargs...)
4949
# Infer `renvs` in function body as it depends on `solver`.
50-
renvs = ϕ₀.trivial ? lenvs : environments(ϕ₀.right_gs, H; solver=solver)
51-
return excitations(H, alg, ϕ₀, lenvs, renvs; num, solver)
50+
renvs = ϕ₀.trivial ? lenvs : environments(ϕ₀.right_gs, H; kwargs...)
51+
return excitations(H, alg, ϕ₀, lenvs, renvs; num, kwargs...)
5252
end
5353
function excitations(H, alg::QuasiparticleAnsatz, ϕ₀::InfiniteQP;
54-
num=1, solver=Defaults.linearsolver)
54+
num=1, kwargs...)
5555
# Infer `lenvs` in function body as it depends on `solver`.
56-
lenvs = environments(ϕ₀.left_gs, H; solver=solver)
57-
return excitations(H, alg, ϕ₀, lenvs; num, solver)
56+
lenvs = environments(ϕ₀.left_gs, H; kwargs...)
57+
return excitations(H, alg, ϕ₀, lenvs; num, kwargs...)
5858
end
5959

6060
"""
@@ -83,19 +83,20 @@ Create and optimise infinite quasiparticle states.
8383
function excitations(H, alg::QuasiparticleAnsatz, momentum::Number, lmps::InfiniteMPS,
8484
lenvs=environments(lmps, H), rmps::InfiniteMPS=lmps,
8585
renvs=lmps === rmps ? lenvs : environments(rmps, H);
86-
sector=one(sectortype(lmps)), num=1, solver=Defaults.linearsolver)
86+
sector=one(sectortype(lmps)), num=1, kwargs...)
8787
ϕ₀ = LeftGaugedQP(rand, lmps, rmps; sector, momentum)
88-
return excitations(H, alg, ϕ₀, lenvs, renvs; num, solver)
88+
return excitations(H, alg, ϕ₀, lenvs, renvs; num, kwargs...)
8989
end
9090
function excitations(H, alg::QuasiparticleAnsatz, momenta, lmps,
9191
lenvs=environments(lmps, H), rmps=lmps,
9292
renvs=lmps === rmps ? lenvs : environments(rmps, H);
93-
verbosity=Defaults.verbosity, num=1, solver=Defaults.linearsolver,
94-
sector=one(sectortype(lmps)), parallel=true)
93+
verbosity=Defaults.verbosity, num=1,
94+
sector=one(sectortype(lmps)), parallel=true, kwargs...)
9595
if parallel
9696
tasks = map(momenta) do momentum
9797
Threads.@spawn begin
98-
E, ϕ = excitations(H, alg, momentum, lmps, lenvs, rmps, renvs; num, solver,
98+
E, ϕ = excitations(H, alg, momentum, lmps, lenvs, rmps, renvs; num,
99+
kwargs...,
99100
sector)
100101
verbosity VERBOSE_CONV &&
101102
@info "Found excitations for momentum = $(momentum)"
@@ -106,7 +107,7 @@ function excitations(H, alg::QuasiparticleAnsatz, momenta, lmps,
106107
fetched = fetch.(tasks)
107108
else
108109
fetched = map(momenta) do momentum
109-
E, ϕ = excitations(H, alg, momentum, lmps, lenvs, rmps, renvs; num, solver,
110+
E, ϕ = excitations(H, alg, momentum, lmps, lenvs, rmps, renvs; num, kwargs...,
110111
sector)
111112
verbosity VERBOSE_CONV && @info "Found excitations for momentum = $(momentum)"
112113
return E, ϕ
@@ -168,8 +169,8 @@ end
168169
################################################################################
169170

170171
function excitations(H::MultilineMPO, alg::QuasiparticleAnsatz, ϕ₀::Multiline{<:InfiniteQP},
171-
lenvs, renvs; num=1, solver=Defaults.linearsolver)
172-
qp_envs(ϕ) = environments(ϕ, H, lenvs, renvs; solver)
172+
lenvs, renvs; num=1, kwargs...)
173+
qp_envs(ϕ) = environments(ϕ, H, lenvs, renvs; kwargs...)
173174
function H_eff(ϕ′)
174175
ϕ = Multiline(ϕ′)
175176
return effective_excitation_hamiltonian(H, ϕ, qp_envs(ϕ)).data.data
@@ -183,8 +184,8 @@ function excitations(H::MultilineMPO, alg::QuasiparticleAnsatz, ϕ₀::Multiline
183184
end
184185

185186
function excitations(H::InfiniteMPO, alg::QuasiparticleAnsatz, ϕ₀::InfiniteQP, lenvs, renvs;
186-
num=1, solver=Defaults.linearsolver)
187-
qp_envs(ϕ) = environments(ϕ, H, lenvs, renvs; solver)
187+
num=1, kwargs...)
188+
qp_envs(ϕ) = environments(ϕ, H, lenvs, renvs; kwargs...)
188189
H_eff(ϕ) = effective_excitation_hamiltonian(H, ϕ, qp_envs(ϕ))
189190

190191
Es, ϕs, convhist = eigsolve(H_eff, ϕ₀, num, :LM, alg.alg)
@@ -194,14 +195,14 @@ function excitations(H::InfiniteMPO, alg::QuasiparticleAnsatz, ϕ₀::InfiniteQP
194195
return Es, ϕs
195196
end
196197

197-
function excitations(H::MultilineMPO, alg::QuasiparticleAnsatz, ϕ₀::Multiline{<:InfiniteQP},
198-
lenvs; num=1, solver=Defaults.linearsolver)
198+
function excitations(H::MultilineMPO, alg::QuasiparticleAnsatz, ϕ₀::MultilineQP,
199+
lenvs; num=1, kwargs...)
199200
# Infer `renvs` in function body as it depends on `solver`.
200-
renvs = ϕ₀.trivial ? lenvs : environments(ϕ₀.right_gs, H; solver)
201-
return excitations(H, alg, ϕ₀, lenvs, renvs; num, solver)
201+
renvs = ϕ₀.trivial ? lenvs : environments(ϕ₀.right_gs, H; kwargs...)
202+
return excitations(H, alg, ϕ₀, lenvs, renvs; num, kwargs...)
202203
end
203-
function excitations(H::MultilineMPO, alg::QuasiparticleAnsatz, ϕ₀::Multiline{<:InfiniteQP};
204-
num=1, solver=Defaults.linearsolver)
204+
function excitations(H::MultilineMPO, alg::QuasiparticleAnsatz, ϕ₀::MultilineQP;
205+
num=1, kwargs...)
205206
# Infer `lenvs` in function body as it depends on `solver`.
206207
lenvs = environments(ϕ₀.left_gs, H; solver)
207208
return excitations(H, alg, ϕ₀, lenvs; num, solver)
@@ -211,28 +212,28 @@ function excitations(H::DenseMPO, alg::QuasiparticleAnsatz, momentum::Real,
211212
lmps::InfiniteMPS,
212213
lenvs=environments(lmps, H), rmps::InfiniteMPS=lmps,
213214
renvs=lmps === rmps ? lenvs : environments(rmps, H);
214-
sector=one(sectortype(lmps)), num=1, solver=Defaults.linearsolver)
215+
sector=one(sectortype(lmps)), num=1, kwargs...)
215216
multiline_lmps = convert(MultilineMPS, lmps)
216217
if lmps === rmps
217218
excitations(convert(MultilineMPO, H), alg, momentum, multiline_lmps, lenvs,
218219
multiline_lmps,
219-
lenvs; sector, num, solver)
220+
lenvs; sector, num, kwargs...)
220221
else
221222
excitations(convert(MultilineMPO, H), alg, momentum, multiline_lmps, lenvs,
222-
convert(MultilineMPS, rmps), renvs; sector, num, solver)
223+
convert(MultilineMPS, rmps), renvs; sector, num, kwargs...)
223224
end
224225
end
225226

226227
function excitations(H::MultilineMPO, alg::QuasiparticleAnsatz, momentum::Real,
227228
lmps::MultilineMPS,
228229
lenvs=environments(lmps, H), rmps=lmps,
229230
renvs=lmps === rmps ? lenvs : environments(rmps, H);
230-
sector=one(sectortype(lmps)), num=1, solver=Defaults.linearsolver)
231+
sector=one(sectortype(lmps)), num=1, kwargs...)
231232
ϕ₀ = Multiline(map(1:size(lmps, 1)) do row
232233
return LeftGaugedQP(rand, lmps[row], rmps[row]; sector, momentum)
233234
end)
234235

235-
return excitations(H, alg, ϕ₀, lenvs, renvs; num, solver)
236+
return excitations(H, alg, ϕ₀, lenvs, renvs; num, kwargs...)
236237
end
237238

238239
################################################################################

src/algorithms/toolbox.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,9 @@ function variance(state::InfiniteQP, H::InfiniteMPOHamiltonian, envs=environment
197197
gs = state.left_gs
198198

199199
e_local = map(1:length(state)) do i
200-
return contract_mpo_expval(gs.AC[i], envs.GLs[i], H[i][:, :, :, end],
201-
envs.GRs[i][end])
200+
GL = leftenv(envs, i, gs)
201+
GR = rightenv(envs, i, gs)
202+
return contract_mpo_expval(gs.AC[i], GL, H[i][:, :, :, end], GR[end])
202203
end
203204
lattice = physicalspace.(Ref(gs), 1:length(state))
204205
H_regularized = H - InfiniteMPOHamiltonian(lattice,

src/environments/abstract_envs.jl

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ Base.unlock(envs::AbstractMPSEnvironments) = unlock(envs.lock);
1313

1414
# Allocating tensors
1515
# ------------------
16-
1716
function allocate_GL(bra::AbstractMPS, mpo::AbstractMPO, ket::AbstractMPS, i::Int)
1817
T = Base.promote_type(scalartype(bra), scalartype(mpo), scalartype(ket))
1918
V = left_virtualspace(bra, i) left_virtualspace(mpo, i)'
@@ -61,3 +60,31 @@ function allocate_GBR(bra::QP, mpo::AbstractMPO, ket::QP, i::Int)
6160
end
6261
return TT(undef, V)
6362
end
63+
64+
# Environment algorithms
65+
# ----------------------
66+
"""
67+
environment_alg(above, operator, below; kwargs...)
68+
69+
Determine an appropriate algorithm for computing the environments, based on the given `kwargs...`.
70+
"""
71+
function environment_alg(::Union{InfiniteMPS,MultilineMPS},
72+
::Union{InfiniteMPO,MultilineMPO},
73+
::Union{InfiniteMPS,MultilineMPS};
74+
tol=Defaults.tol, maxiter=Defaults.maxiter,
75+
krylovdim=Defaults.krylovdim, verbosity=Defaults.VERBOSE_NONE,
76+
eager=true)
77+
return Arnoldi(; tol, maxiter, krylovdim, verbosity, eager)
78+
end
79+
function environment_alg(above, ::InfiniteMPOHamiltonian, below;
80+
tol=Defaults.tol, maxiter=Defaults.maxiter,
81+
krylovdim=Defaults.krylovdim, verbosity=Defaults.VERBOSE_NONE)
82+
return GMRES(; tol, maxiter, krylovdim, verbosity)
83+
end
84+
function environment_alg(::Union{InfiniteQP,MultilineQP},
85+
::Union{InfiniteMPO,MultilineMPO},
86+
::Union{InfiniteQP,MultilineQP};
87+
tol=Defaults.tol, maxiter=Defaults.maxiter,
88+
krylovdim=Defaults.krylovdim, verbosity=Defaults.VERBOSE_NONE)
89+
return GMRES(; tol, maxiter, krylovdim, verbosity)
90+
end

src/environments/infinite_envs.jl

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,6 @@ function issamespace(envs::InfiniteEnvironments, above::InfiniteMPS,
4242
return true
4343
end
4444

45-
function environment_alg(above, operator::Union{InfiniteMPO,MultilineMPO}, below;
46-
tol=Defaults.tol, maxiter=Defaults.maxiter,
47-
krylovdim=Defaults.krylovdim, verbosity=Defaults.VERBOSE_NONE,
48-
eager=true)
49-
return Arnoldi(; tol, maxiter, krylovdim, verbosity, eager)
50-
end
51-
function environment_alg(above, operator::InfiniteMPOHamiltonian, below;
52-
tol=Defaults.tol, maxiter=Defaults.maxiter,
53-
krylovdim=Defaults.krylovdim, verbosity=Defaults.VERBOSE_NONE)
54-
return GMRES(; tol, maxiter, krylovdim, verbosity)
55-
end
56-
5745
function recalculate!(envs::InfiniteEnvironments, above::InfiniteMPS,
5846
operator::Union{InfiniteMPO,InfiniteMPOHamiltonian},
5947
below::InfiniteMPS=above; kwargs...)

src/environments/qp_envs.jl

Lines changed: 22 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,51 +19,31 @@ struct QuasiparticleEnvironments{A,B} <: AbstractMPSEnvironments
1919
rightenvs::B
2020
end
2121

22-
function environments(exci::Union{InfiniteQP,Multiline{<:InfiniteQP}}, H;
23-
solver=Defaults.linearsolver)
24-
# Explicitly define optional arguments as these depend on solver,
25-
# which needs to come after these arguments.
26-
lenvs = environments(exci.left_gs, H; solver=solver)
27-
28-
return environments(exci, H, lenvs; solver=solver)
22+
function leftenv(envs::QuasiparticleEnvironments, site::Int, state)
23+
return leftenv(envs.leftenvs, site, state)
2924
end
30-
31-
function environments(exci::Union{InfiniteQP,Multiline{<:InfiniteQP}}, H, lenvs;
32-
solver=Defaults.linearsolver)
33-
# Explicitly define optional arguments as these depend on solver,
34-
# which needs to come after these arguments.
35-
renvs = exci.trivial ? lenvs : environments(exci.right_gs, H; solver=solver)
36-
37-
return environments(exci, H, lenvs, renvs; solver=solver)
25+
function rightenv(envs::QuasiparticleEnvironments, site::Int, state)
26+
return rightenv(envs.rightenvs, site, state)
3827
end
3928

40-
function gen_exci_lw_rw(left_gs::InfiniteMPS, H::Union{InfiniteMPO,InfiniteMPOHamiltonian},
41-
right_gs,
42-
excileg)
43-
B = tensormaptype(spacetype(left_gs), 2, 2, storagetype(eltype(left_gs)))
44-
BB = tensormaptype(sumspacetype(spacetype(B)), 2, 2, B)
45-
46-
GBL = PeriodicVector{BB}(undef, length(left_gs))
47-
GBR = PeriodicVector{BB}(undef, length(left_gs))
48-
49-
for site in 1:length(left_gs)
50-
GBL[site] = BB(undef,
51-
left_virtualspace(left_gs, site - 1) left_virtualspace(H, site)'
52-
excileg' left_virtualspace(right_gs, site - 1))
53-
fill!(GBL[site], zero(scalartype(B)))
54-
55-
GBR[site] = BB(undef,
56-
right_virtualspace(left_gs, site)' right_virtualspace(H, site)'
57-
excileg' right_virtualspace(right_gs, site)')
58-
fill!(GBR[site], zero(scalartype(B)))
59-
end
29+
# Explicitly define optional arguments as these depend on kwargs,
30+
# which needs to come after these arguments.
6031

61-
return GBL, GBR
32+
function environments(exci::Union{InfiniteQP,MultilineQP}, H; kwargs...)
33+
lenvs = environments(exci.left_gs, H; kwargs...)
34+
return environments(exci, H, lenvs; kwargs...)
35+
end
36+
function environments(exci::Union{InfiniteQP,MultilineQP}, H, lenvs;
37+
kwargs...)
38+
renvs = exci.trivial ? lenvs : environments(exci.right_gs, H; kwargs...)
39+
return environments(exci, H, lenvs, renvs; kwargs...)
6240
end
6341

64-
function environments(exci::InfiniteQP, H::InfiniteMPOHamiltonian, lenvs, renvs;
65-
solver=Defaults.linearsolver)
42+
function environments(exci::InfiniteQP, H::InfiniteMPOHamiltonian,
43+
lenvs, renvs;
44+
kwargs...)
6645
ids = findall(Base.Fix1(isidentitylevel, H), 2:(size(H[1], 1) - 1))
46+
solver = environment_alg(exci, H, exci; kwargs...)
6747
# ids = collect(Iterators.filter(x -> isidentitylevel(H, x), 2:(H.odim - 1)))
6848

6949
AL = exci.left_gs.AL
@@ -195,9 +175,10 @@ function environments(exci::Multiline{<:InfiniteQP},
195175
ham::MultilineMPO,
196176
lenvs,
197177
renvs;
198-
solver=Defaults.linearsolver)
178+
kwargs...)
199179
exci.trivial ||
200180
@warn "there is a phase ambiguity in topologically nontrivial statmech excitations"
181+
solver = environment_alg(exci, ham, exci; kwargs...)
201182

202183
left_gs = exci.left_gs
203184
right_gs = exci.right_gs
@@ -329,9 +310,10 @@ function environments(exci::InfiniteQP,
329310
O::InfiniteMPO,
330311
lenvs,
331312
renvs;
332-
solver=Defaults.linearsolver)
313+
kwargs...)
333314
exci.trivial ||
334315
@warn "there is a phase ambiguity in topologically nontrivial statmech excitations"
316+
solver = environment_alg(exci, O, exci; kwargs...)
335317

336318
left_gs = exci.left_gs
337319
right_gs = exci.right_gs

src/states/quasiparticle_state.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ end
174174
const QP{S,T1,T2} = Union{LeftGaugedQP{S,T1,T2},RightGaugedQP{S,T1,T2}}
175175
const FiniteQP{S<:FiniteMPS,T1,T2} = QP{S,T1,T2}
176176
const InfiniteQP{S<:InfiniteMPS,T1,T2} = QP{S,T1,T2}
177+
const MultilineQP{Q<:QP} = Multiline{Q}
177178

178179
TensorKit.spacetype(::Union{QP{S},Type{<:QP{S}}}) where {S} = spacetype(S)
179180
TensorKit.sectortype(::Union{QP{S},Type{<:QP{S}}}) where {S} = sectortype(S)

0 commit comments

Comments
 (0)