Skip to content

Commit ee263d6

Browse files
committed
Quasiparticle type stability improvements
Test type stability excitations
1 parent d30ef9e commit ee263d6

File tree

3 files changed

+23
-56
lines changed

3 files changed

+23
-56
lines changed

src/algorithms/excitation/quasiparticleexcitation.jl

Lines changed: 11 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -342,52 +342,19 @@ function _effective_excitation_local_apply(site, ϕ,
342342
return B′
343343
end
344344

345-
function effective_excitation_renormalization_energy(H::Union{InfiniteMPO,
346-
InfiniteMPOHamiltonian,
347-
FiniteMPOHamiltonian}, ϕ,
348-
lenvs,
349-
renvs)
345+
function effective_excitation_renormalization_energy(H, ϕ, lenvs, renvs)
350346
ψ_left = ϕ.left_gs
351-
E_left = map(1:length(ϕ)) do site
352-
return contract_mpo_expval(ψ_left.AC[site], leftenv(lenvs, site, ψ_left),
353-
H[site], rightenv(lenvs, site, ψ_left))
354-
end
355-
356-
ϕ.trivial && return E_left
357-
358347
ψ_right = ϕ.right_gs
359-
E_right = map(1:length(ϕ)) do site
360-
return contract_mpo_expval(ψ_right.AC[site], leftenv(renvs, site, ψ_right),
361-
H[site], rightenv(renvs, site, ψ_right))
362-
end
363-
364-
return (E_left .+ E_right) ./ 2
365-
end
366-
367-
function effective_excitation_renormalization_energy(H, ϕ, lenvs, renvs)
368-
E_left = map(1:length(ϕ)) do loc
369-
AC = ϕ.left_gs.AC[loc]
370-
GL = leftenv(lenvs, loc, ϕ.left_gs)
371-
GR = rightenv(lenvs, loc, ϕ.left_gs)
372-
return sum(keys(H[loc]); init=zero(scalartype(ϕ))) do (j, k)
373-
return @plansor conj(AC[2 6; 4]) * GL[j][2 5; 3] * AC[3 7; 1] *
374-
H[loc][j, k][5 6; 7 8] *
375-
GR[k][1 8; 4]
348+
E = Vector{scalartype(ϕ)}(undef, length(ϕ))
349+
for i in eachindex(E)
350+
E[i] = contract_mpo_expval(ψ_left.AC[i], leftenv(lenvs, i, ψ_left),
351+
H[i], rightenv(lenvs, i, ψ_left))
352+
if !ϕ.trivial
353+
E[i] += contract_mpo_expval(ψ_right.AC[i], leftenv(renvs, i, ψ_right),
354+
H[i], rightenv(renvs, i, ψ_right))
355+
E[i] /= 2
376356
end
377357
end
378-
379-
ϕ.trivial && return E_left
380-
381-
E_right = map(1:length(ϕ)) do loc
382-
AC = ϕ.right_gs.AC[loc]
383-
GL = leftenv(renvs, loc, ϕ.right_gs)
384-
GR = rightenv(renvs, loc, ϕ.right_gs)
385-
return sum(keys(H[loc]); init=zero(scalartype(ϕ))) do (j, k)
386-
return @plansor conj(AC[2 6; 4]) * GL[j][2 5; 3] * AC[3 7; 1] *
387-
H[loc][j, k][5 6; 7 8] *
388-
GR[k][1 8; 4]
389-
end
390-
end
391-
392-
return (E_left .+ E_right) ./ 2
358+
return E
393359
end
360+

src/states/quasiparticle_state.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,11 @@ function RightGaugedQP(datfun, left_gs, right_gs=left_gs;
5959
end
6060
6161
#gauge dependent code
62-
function Base.similar(v::LeftGaugedQP, T=scalartype(v))
63-
return LeftGaugedQP(v.left_gs, v.right_gs, v.VLs, map(e -> similar(e, T), v.Xs),
64-
v.momentum)
62+
function Base.similar(v::LeftGaugedQP, ::Type{T}=scalartype(v)) where {T<:Number}
63+
return LeftGaugedQP(v.left_gs, v.right_gs, v.VLs, similar.(v.Xs, T), v.momentum)
6564
end
66-
function Base.similar(v::RightGaugedQP, T=scalartype(v))
67-
return RightGaugedQP(v.left_gs, v.right_gs, map(e -> similar(e, T), v.Xs), v.VRs,
68-
v.momentum)
65+
function Base.similar(v::RightGaugedQP, ::Type{T}=scalartype(v)) where {T<:Number}
66+
return RightGaugedQP(v.left_gs, v.right_gs, similar.(v.Xs, T), v.VRs, v.momentum)
6967
end
7068
7169
Base.getindex(v::LeftGaugedQP, i::Int) = v.VLs[mod1(i, end)] * v.Xs[mod1(i, end)];

test/algorithms.jl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ end
435435
ψ = InfiniteMPS([ℙ^3, ℙ^3], [ℙ^48, ℙ^48])
436436
ψ, envs, _ = find_groundstate(ψ, H; maxiter=400, verbosity=verbosity_conv,
437437
tol=1e-10)
438-
energies, ϕs = excitations(H, QuasiparticleAnsatz(), Float64(pi), ψ, envs)
438+
energies, ϕs = @constinferred excitations(H, QuasiparticleAnsatz(), Float64(pi), ψ,
439+
envs)
439440
@test energies[1] 0.41047925 atol = 1e-4
440441
@test variance(ϕs[1], H) < 1e-8
441442
end
@@ -445,7 +446,8 @@ end
445446
ψ, envs, _ = leading_boundary(ψ, H,
446447
VUMPS(; maxiter=400, verbosity=verbosity_conv,
447448
tol=1e-10))
448-
energies, ϕs = excitations(H, QuasiparticleAnsatz(), [0.0, Float64(pi / 2)], ψ,
449+
energies, ϕs = @constinferred excitations(H, QuasiparticleAnsatz(),
450+
[0.0, Float64(pi / 2)], ψ,
449451
envs; verbosity=0)
450452
@test abs(energies[1]) > abs(energies[2]) # has a minimum at pi/2
451453
end
@@ -464,20 +466,20 @@ end
464466
ψ, envs, = find_groundstate(ψ, H; verbosity)
465467

466468
# find energy with quasiparticle ansatz
467-
energies_QP, ϕs = excitations(H, QuasiparticleAnsatz(), ψ, envs)
469+
energies_QP, ϕs = @constinferred excitations(H, QuasiparticleAnsatz(), ψ, envs)
468470
@test variance(ϕs[1], H) < 1e-6
469471

470472
# find energy with normal dmrg
471473
for gsalg in (DMRG(; verbosity, tol=1e-6),
472474
DMRG2(; verbosity, tol=1e-6, trscheme=truncbelow(1e-4)))
473-
energies_dm, _ = excitations(H, FiniteExcited(; gsalg), ψ)
475+
energies_dm, _ = @constinferred excitations(H, FiniteExcited(; gsalg), ψ)
474476
@test energies_dm[1] energies_QP[1] + expectation_value(ψ, H, envs) atol = 1e-4
475477
end
476478

477479
# find energy with Chepiga ansatz
478-
energies_ch, _ = excitations(H, ChepigaAnsatz(), ψ, envs)
480+
energies_ch, _ = @constinferred excitations(H, ChepigaAnsatz(), ψ, envs)
479481
@test energies_ch[1] energies_QP[1] + expectation_value(ψ, H, envs) atol = 1e-4
480-
energies_ch2, _ = excitations(H, ChepigaAnsatz2(), ψ, envs)
482+
energies_ch2, _ = @constinferred excitations(H, ChepigaAnsatz2(), ψ, envs)
481483
@test energies_ch2[1] energies_QP[1] + expectation_value(ψ, H, envs) atol = 1e-4
482484
return energies_QP[1]
483485
end

0 commit comments

Comments
 (0)