Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ DocStringExtensions = "0.9.3"
HalfIntegers = "1.6.0"
KrylovKit = "0.8.3, 0.9.2, 0.10"
LinearAlgebra = "1.6"
LoggingExtras = "~1.0"
LoggingExtras = "1"
MatrixAlgebraKit = "0.6.5"
OhMyThreads = "0.7, 0.8"
OptimKit = "0.4, 0.5"
Expand Down
4 changes: 4 additions & 0 deletions docs/src/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ When releasing a new version, move the "Unreleased" changes to a new version sec

### Changed

- Algorithm logging now uses named initialization, iteration, convergence, and non-convergence
groups, replacing the deprecated LoggingExtras verbosity APIs. LoggingExtras 1.1 and 1.2 are
supported alongside 1.0. Canonicalization now logs initialization at verbosity 2 and
non-convergence warnings at verbosity 1, consistently with the other algorithms.
- `FiniteMPOHamiltonian`/`InfiniteMPOHamiltonian` constructed from a set of local terms now share
virtual channels between terms that start out with the same operators, up to a scalar factor,
and add up terms that are linearly dependent. The resulting Hamiltonian is unchanged, but its
Expand Down
1 change: 1 addition & 0 deletions src/MPSKit.jl
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ using Compat: @compat
@compat public DynamicTols, DynamicTol, AdaptiveKrylov
@compat public VERBOSE_NONE, VERBOSE_WARN, VERBOSE_CONV, VERBOSE_ITER, VERBOSE_ALL
@compat public IterLog, loginit!, logiter!, logfinish!, logcancel!
@compat public @log_initialization, @log_iteration, @log_convergence, @log_nonconvergence
@compat public default_allocator

# Imports
Expand Down
20 changes: 10 additions & 10 deletions src/algorithms/approximate/fvomps.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ function approximate!(ψ::AbstractFiniteMPS, Oϕ, alg::DMRG2, envs = environment
iter = 0
log = IterLog("DMRG2")

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)
for outer iter in 1:(alg.maxiter)
ϵ = 0.0
for pos in [1:(length(ψ) - 1); (length(ψ) - 2):-1:1]
Expand All @@ -23,13 +23,13 @@ function approximate!(ψ::AbstractFiniteMPS, Oϕ, alg::DMRG2, envs = environment
ψ, envs = alg.finalize(iter, ψ, Oϕ, envs)::Tuple{typeof(ψ), typeof(envs)}

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ)
@log_convergence logfinish!(log, iter, ϵ)
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ)
@log_nonconvergence logcancel!(log, iter, ϵ)
else
@infov 3 logiter!(log, iter, ϵ)
@log_iteration logiter!(log, iter, ϵ)
end
end
end
Expand All @@ -43,8 +43,8 @@ function approximate!(ψ::AbstractFiniteMPS, Oϕ, alg::DMRG, envs = environments
iter = 0
log = IterLog("DMRG")

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)
for outer iter in 1:(alg.maxiter)
ϵ = 0.0
for pos in [1:(length(ψ) - 1); length(ψ):-1:2]
Expand All @@ -59,13 +59,13 @@ function approximate!(ψ::AbstractFiniteMPS, Oϕ, alg::DMRG, envs = environments
ψ, envs = alg.finalize(iter, ψ, Oϕ, envs)::Tuple{typeof(ψ), typeof(envs)}

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ)
@log_convergence logfinish!(log, iter, ϵ)
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ)
@log_nonconvergence logcancel!(log, iter, ϵ)
else
@infov 3 logiter!(log, iter, ϵ)
@log_iteration logiter!(log, iter, ϵ)
end
end
end
Expand Down
20 changes: 10 additions & 10 deletions src/algorithms/approximate/idmrg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ function approximate!(
ϵ::Float64 = 2 * alg.tol
iter = 0

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)
for outer iter in 1:(alg.maxiter)
C_current = ψ.C[:, 0]

Expand Down Expand Up @@ -43,13 +43,13 @@ function approximate!(
ϵ = norm(C_current - ψ.C[:, 0])

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ)
@log_convergence logfinish!(log, iter, ϵ)
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ)
@log_nonconvergence logcancel!(log, iter, ϵ)
else
@infov 3 logiter!(log, iter, ϵ)
@log_iteration logiter!(log, iter, ϵ)
end
end
end
Expand All @@ -75,8 +75,8 @@ function approximate!(
iter = 0
ϵ_truncs = PeriodicMatrix(zeros(real(scalartype(ψ)), length(ψ), width(ψ)))

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)
for outer iter in 1:(alg.maxiter)
C_current = ψ.C[:, 0]

Expand Down Expand Up @@ -177,13 +177,13 @@ function approximate!(
end

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ)
@log_convergence logfinish!(log, iter, ϵ)
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ)
@log_nonconvergence logcancel!(log, iter, ϵ)
else
@infov 3 logiter!(log, iter, ϵ)
@log_iteration logiter!(log, iter, ϵ)
end
end
end
Expand Down
10 changes: 5 additions & 5 deletions src/algorithms/approximate/vomps.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,19 @@ function _approximate_vomps(mps, toapprox, alg::VOMPS, envs)
state = VOMPSState(mps, toapprox, envs, iter, ϵ)
it = IterativeSolver(alg, state)

return LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
return with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)

for (mps, envs, ϵ) in it
if ϵ ≤ alg.tol
@infov 2 logfinish!(log, it.iter, ϵ)
@log_convergence logfinish!(log, it.iter, ϵ)
return mps, envs, AlgorithmInfo(; converged = true, galerkin = ϵ, numiter = it.iter)
end
if it.iter ≥ alg.maxiter
@warnv 1 logcancel!(log, it.iter, ϵ)
@log_nonconvergence logcancel!(log, it.iter, ϵ)
return mps, envs, AlgorithmInfo(; converged = false, galerkin = ϵ, numiter = it.iter)
end
@infov 3 logiter!(log, it.iter, ϵ)
@log_iteration logiter!(log, it.iter, ϵ)
end

# this should never be reached
Expand Down
2 changes: 1 addition & 1 deletion src/algorithms/fixedpoint.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ function fixedpoint(A, x₀, which::Symbol, alg::Lanczos)
end
function fixedpoint(A, x₀, which::Symbol, alg::Arnoldi)
TT, vecs, vals, info = schursolve(A, x₀, 1, which, alg)
size(TT, 2) > 1 && TT[2, 1] != 0 && @warnv 1 "non-unique fixed point detected"
size(TT, 2) > 1 && TT[2, 1] != 0 && @warn "non-unique fixed point detected" _group = :mpskit_warning
return vals[1], vecs[1], info
end
14 changes: 7 additions & 7 deletions src/algorithms/groundstate/dmrg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,8 @@ function find_groundstate_sweep!(
fwd, bwd = _sweep_ranges(alg, ψ)
iter = 0

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ_global, expectation_value(ψ, H, envs))
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ_global, expectation_value(ψ, H, envs))
for outer iter in 1:(alg.maxiter)
@timeit timeroutput "sweep" begin
# left-to-right
Expand Down Expand Up @@ -349,15 +349,15 @@ function find_groundstate_sweep!(
# truncation error rather than the (unreachable) bare `tol`. With no truncation
# (`ϵ_truncs .= 0`, e.g. single-site/QR gauge) this reduces to the plain `ϵ_global ≤ tol`.
if ϵ_global <= max(alg.tol, maximum(ϵ_truncs))
@infov 4 TimerReport(timeroutput)
@infov 2 logfinish!(log, iter, ϵ_global, expectation_value(ψ, H, envs))
@info TimerReport(timeroutput) _group = :mpskit_timing
@log_convergence logfinish!(log, iter, ϵ_global, expectation_value(ψ, H, envs))
break
end
if iter == alg.maxiter
@infov 4 TimerReport(timeroutput)
@warnv 1 logcancel!(log, iter, ϵ_global, expectation_value(ψ, H, envs))
@info TimerReport(timeroutput) _group = :mpskit_timing
@log_nonconvergence logcancel!(log, iter, ϵ_global, expectation_value(ψ, H, envs))
else
@infov 3 logiter!(log, iter, ϵ_global, expectation_value(ψ, H, envs))
@log_iteration logiter!(log, iter, ϵ_global, expectation_value(ψ, H, envs))
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions src/algorithms/groundstate/gradient_grassmann.jl
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ function _find_groundstate(ψ, H, alg::GradientGrassmann, envs, scheduler, timer
isometrictransport = true,
)

LoggingExtras.withlevel(; verbosity = method_verbosity) do
@infov 4 TimerReport(timeroutput)
with_verbosity(; verbosity = method_verbosity) do
@info TimerReport(timeroutput) _group = :mpskit_timing
end

info = _optimkit_info(alg, x, f, g, normgradhistory)
Expand Down
16 changes: 8 additions & 8 deletions src/algorithms/groundstate/idmrg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,8 @@ function _find_groundstate_idmrg(mps, operator, alg::alg_type, envs) where {alg_
ϵ = calc_galerkin(mps, operator, mps, envs; alg.backend, allocator)
E = zero(TensorOperations.promote_contract(scalartype(mps), scalartype(operator)))

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 begin
with_verbosity(; alg.verbosity) do
@log_initialization begin
E = expectation_value(mps, operator, envs)
loginit!(log, ϵ, E)
end
Expand All @@ -119,19 +119,19 @@ function _find_groundstate_idmrg(mps, operator, alg::alg_type, envs) where {alg_
state = IDMRGState(mps, operator, envs, iter, ϵ, ϵ_truncs, E, timeroutput, allocator)
it = IterativeSolver(alg, state)

return LoggingExtras.withlevel(; alg.verbosity) do
return with_verbosity(; alg.verbosity) do
for (mps, envs, ϵ, ΔE) in it
if ϵ ≤ alg.tol
@infov 4 TimerReport(timeroutput)
@infov 2 logfinish!(log, it.iter, ϵ, ΔE)
@info TimerReport(timeroutput) _group = :mpskit_timing
@log_convergence logfinish!(log, it.iter, ϵ, ΔE)
break
end
if it.iter ≥ alg.maxiter
@infov 4 TimerReport(timeroutput)
@warnv 1 logcancel!(log, it.iter, ϵ, ΔE)
@info TimerReport(timeroutput) _group = :mpskit_timing
@log_nonconvergence logcancel!(log, it.iter, ϵ, ΔE)
break
end
@infov 3 logiter!(log, it.iter, ϵ, ΔE)
@log_iteration logiter!(log, it.iter, ϵ, ΔE)
end

alg_gauge = adapt_solver(alg.alg_gauge; iter = it.state.iter, g_global = it.state.ϵ)
Expand Down
14 changes: 7 additions & 7 deletions src/algorithms/groundstate/vumps.jl
Original file line number Diff line number Diff line change
Expand Up @@ -82,21 +82,21 @@ function dominant_eigsolve(
state = VUMPSState(mps, operator, envs, iter, ϵ, which, timeroutput)
it = IterativeSolver(alg, state)

result = LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ, vumps_objective(mps, operator, envs))
result = with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ, vumps_objective(mps, operator, envs))

for (mps, envs, ϵ) in it
if ϵ ≤ alg.tol
@infov 4 TimerReport(timeroutput)
@infov 2 logfinish!(log, it.iter, ϵ, vumps_objective(mps, operator, envs))
@info TimerReport(timeroutput) _group = :mpskit_timing
@log_convergence logfinish!(log, it.iter, ϵ, vumps_objective(mps, operator, envs))
return mps, envs, AlgorithmInfo(; converged = true, galerkin = ϵ, numiter = it.iter)
end
if it.iter ≥ alg.maxiter
@infov 4 TimerReport(timeroutput)
@warnv 1 logcancel!(log, it.iter, ϵ, vumps_objective(mps, operator, envs))
@info TimerReport(timeroutput) _group = :mpskit_timing
@log_nonconvergence logcancel!(log, it.iter, ϵ, vumps_objective(mps, operator, envs))
return mps, envs, AlgorithmInfo(; converged = false, galerkin = ϵ, numiter = it.iter)
end
@infov 3 logiter!(log, it.iter, ϵ, vumps_objective(mps, operator, envs))
@log_iteration logiter!(log, it.iter, ϵ, vumps_objective(mps, operator, envs))
end

# this should never be reached
Expand Down
20 changes: 10 additions & 10 deletions src/algorithms/propagator/corvector.jl
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ function propagator(
ϵ = 2 * alg.tol
log = IterLog("DDMRG")

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)
for iter in 1:(alg.maxiter)
ϵ = 0.0

Expand All @@ -100,13 +100,13 @@ function propagator(
end

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ)
@log_convergence logfinish!(log, iter, ϵ)
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ)
@log_nonconvergence logcancel!(log, iter, ϵ)
else
@infov 3 logiter!(log, iter, ϵ)
@log_iteration logiter!(log, iter, ϵ)
end
end
end
Expand Down Expand Up @@ -157,8 +157,8 @@ function propagator(
ϵ = 2 * alg.tol
log = IterLog("DDMRG")

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)
for iter in 1:(alg.maxiter)
ϵ = 0.0

Expand All @@ -177,13 +177,13 @@ function propagator(
end

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ)
@log_convergence logfinish!(log, iter, ϵ)
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ)
@log_nonconvergence logcancel!(log, iter, ϵ)
else
@infov 3 logiter!(log, iter, ϵ)
@log_iteration logiter!(log, iter, ϵ)
end
end
end
Expand Down
20 changes: 10 additions & 10 deletions src/algorithms/statmech/idmrg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ function leading_boundary(
ϵ::Float64 = 2 * alg.tol
iter = 0

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ, leading_eigenvalue(ψ, operator, envs))
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ, leading_eigenvalue(ψ, operator, envs))
for outer iter in 1:(alg.maxiter)
alg_eigsolve = adapt_solver(alg.alg_eigsolve; iter, g_global = ϵ)
C_current = ψ.C[:, 0]
Expand Down Expand Up @@ -44,13 +44,13 @@ function leading_boundary(
ϵ = norm(C_current - ψ.C[:, 0])

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ, leading_eigenvalue(ψ, operator, envs))
@log_convergence logfinish!(log, iter, ϵ, leading_eigenvalue(ψ, operator, envs))
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ, leading_eigenvalue(ψ, operator, envs))
@log_nonconvergence logcancel!(log, iter, ϵ, leading_eigenvalue(ψ, operator, envs))
else
@infov 3 logiter!(log, iter, ϵ, leading_eigenvalue(ψ, operator, envs))
@log_iteration logiter!(log, iter, ϵ, leading_eigenvalue(ψ, operator, envs))
end
end
end
Expand All @@ -72,8 +72,8 @@ function leading_boundary(
iter = 0
ϵ_truncs = PeriodicMatrix(zeros(real(scalartype(ψ)), length(ψ), width(ψ)))

LoggingExtras.withlevel(; alg.verbosity) do
@infov 2 loginit!(log, ϵ)
with_verbosity(; alg.verbosity) do
@log_initialization loginit!(log, ϵ)
for outer iter in 1:(alg.maxiter)
alg_eigsolve = adapt_solver(alg.alg_eigsolve; iter, g_global = ϵ)
C_current = ψ.C[:, 0]
Expand Down Expand Up @@ -182,13 +182,13 @@ function leading_boundary(
end

if ϵ <= alg.tol
@infov 2 logfinish!(log, iter, ϵ)
@log_convergence logfinish!(log, iter, ϵ)
break
end
if iter == alg.maxiter
@warnv 1 logcancel!(log, iter, ϵ)
@log_nonconvergence logcancel!(log, iter, ϵ)
else
@infov 3 logiter!(log, iter, ϵ)
@log_iteration logiter!(log, iter, ϵ)
end
end
end
Expand Down
Loading
Loading