From 9b849f105fccb8d7b65f9fc3926ba55fb180d6ae Mon Sep 17 00:00:00 2001 From: Alexis Montoison Date: Sat, 15 Feb 2025 00:36:09 -0600 Subject: [PATCH 1/2] Add more tests for the option warm-start --- src/bicgstab.jl | 4 +- src/bilq.jl | 4 +- src/bilqr.jl | 2 + src/car.jl | 3 +- src/cg.jl | 3 +- src/cg_lanczos.jl | 3 +- src/cg_lanczos_shift.jl | 2 +- src/cgls.jl | 2 +- src/cgls_lanczos_shift.jl | 2 +- src/cgne.jl | 2 +- src/cgs.jl | 4 +- src/cr.jl | 3 + src/craig.jl | 2 +- src/craigmr.jl | 4 +- src/crls.jl | 2 +- src/crmr.jl | 2 +- src/diom.jl | 3 +- src/dqgmres.jl | 3 +- src/fgmres.jl | 3 +- src/fom.jl | 3 +- src/gmres.jl | 3 +- src/lnlq.jl | 2 +- src/lslq.jl | 4 +- src/lsmr.jl | 4 +- src/lsqr.jl | 4 +- src/minares.jl | 3 +- src/minres.jl | 4 +- src/minres_qlp.jl | 3 +- src/qmr.jl | 4 +- src/symmlq.jl | 3 +- src/usymlq.jl | 3 +- src/usymqr.jl | 3 +- test/test_bicgstab.jl | 2 +- test/test_bilq.jl | 2 +- test/test_car.jl | 2 +- test/test_cg.jl | 2 +- test/test_cg_lanczos.jl | 2 +- test/test_cg_lanczos_shift.jl | 2 +- test/test_cgls.jl | 2 +- test/test_cgls_lanczos_shift.jl | 2 +- test/test_cgne.jl | 2 +- test/test_cgs.jl | 2 +- test/test_craig.jl | 2 +- test/test_craigmr.jl | 2 +- test/test_crls.jl | 2 +- test/test_crmr.jl | 2 +- test/test_diom.jl | 2 +- test/test_dqgmres.jl | 2 +- test/test_fgmres.jl | 2 +- test/test_fom.jl | 2 +- test/test_gmres.jl | 2 +- test/test_lnlq.jl | 2 +- test/test_lslq.jl | 2 +- test/test_lsmr.jl | 2 +- test/test_lsqr.jl | 2 +- test/test_minares.jl | 2 +- test/test_minres.jl | 2 +- test/test_minres_qlp.jl | 2 +- test/test_qmr.jl | 2 +- test/test_symmlq.jl | 2 +- test/test_usymlq.jl | 2 +- test/test_usymqr.jl | 2 +- test/test_utils.jl | 3 +- test/test_warm_start.jl | 689 ++++++++++++++++++++------------ 64 files changed, 531 insertions(+), 317 deletions(-) diff --git a/src/bicgstab.jl b/src/bicgstab.jl index 8b456c043..7d4d8ea83 100644 --- a/src/bicgstab.jl +++ b/src/bicgstab.jl @@ -171,7 +171,8 @@ kwargs_bicgstab = (:c, :M, :N, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end @@ -189,6 +190,7 @@ kwargs_bicgstab = (:c, :M, :N, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, stats.solved, stats.inconsistent = false, false stats.timer = start_time |> ktimer stats.status = "Breakdown bᴴc = 0" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/bilq.jl b/src/bilq.jl index bb01b9c45..1bb0cb061 100644 --- a/src/bilq.jl +++ b/src/bilq.jl @@ -165,7 +165,8 @@ kwargs_bilq = (:c, :transfer_to_bicg, :M, :N, :ldiv, :atol, :rtol, :itmax, :time stats.solved = true stats.inconsistent = false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end @@ -181,6 +182,7 @@ kwargs_bilq = (:c, :transfer_to_bicg, :M, :N, :ldiv, :atol, :rtol, :itmax, :time stats.inconsistent = false stats.timer = start_time |> ktimer stats.status = "Breakdown bᴴc = 0" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/bilqr.jl b/src/bilqr.jl index 29b27934c..a48987bbe 100644 --- a/src/bilqr.jl +++ b/src/bilqr.jl @@ -168,6 +168,8 @@ kwargs_bilqr = (:transfer_to_bicg, :atol, :rtol, :itmax, :timemax, :verbose, :hi stats.solved_dual = false stats.timer = start_time |> ktimer stats.status = "Breakdown bᴴc = 0" + warm_start && kaxpy!(n, one(FC), Δx, x) + warm_start && kaxpy!(n, one(FC), Δy, t) solver.warm_start = false return solver end diff --git a/src/car.jl b/src/car.jl index 1dd359582..20e935d2b 100644 --- a/src/car.jl +++ b/src/car.jl @@ -165,7 +165,8 @@ kwargs_car = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :history, :ca stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/cg.jl b/src/cg.jl index 7bedd8d27..709e7c6ce 100644 --- a/src/cg.jl +++ b/src/cg.jl @@ -149,7 +149,8 @@ kwargs_cg = (:M, :ldiv, :radius, :linesearch, :atol, :rtol, :itmax, :timemax, :v stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/cg_lanczos.jl b/src/cg_lanczos.jl index 51c1ca811..05475acc5 100644 --- a/src/cg_lanczos.jl +++ b/src/cg_lanczos.jl @@ -148,7 +148,8 @@ kwargs_cg_lanczos = (:M, :ldiv, :check_curvature, :atol, :rtol, :itmax, :timemax stats.Anorm = zero(T) stats.indefinite = false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/cg_lanczos_shift.jl b/src/cg_lanczos_shift.jl index 1b6185e01..c4ad43903 100644 --- a/src/cg_lanczos_shift.jl +++ b/src/cg_lanczos_shift.jl @@ -149,7 +149,7 @@ kwargs_cg_lanczos_shift = (:M, :ldiv, :check_curvature, :atol, :rtol, :itmax, :t stats.niter = 0 stats.solved = true stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" return solver end diff --git a/src/cgls.jl b/src/cgls.jl index b8cc38b53..ac566867b 100644 --- a/src/cgls.jl +++ b/src/cgls.jl @@ -153,7 +153,7 @@ kwargs_cgls = (:M, :ldiv, :radius, :λ, :atol, :rtol, :itmax, :timemax, :verbose stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" history && push!(rNorms, zero(T)) history && push!(ArNorms, zero(T)) return solver diff --git a/src/cgls_lanczos_shift.jl b/src/cgls_lanczos_shift.jl index 11d3561a9..0f4a4e047 100644 --- a/src/cgls_lanczos_shift.jl +++ b/src/cgls_lanczos_shift.jl @@ -150,7 +150,7 @@ kwargs_cgls_lanczos_shift = (:M, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose stats.niter = 0 stats.solved = true stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" return solver end diff --git a/src/cgne.jl b/src/cgne.jl index 953635b4d..af352ee5d 100644 --- a/src/cgne.jl +++ b/src/cgne.jl @@ -160,7 +160,7 @@ kwargs_cgne = (:N, :ldiv, :λ, :atol, :rtol, :itmax, :timemax, :verbose, :histor stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" return solver end λ > 0 && kcopy!(m, s, r) # s ← r diff --git a/src/cgs.jl b/src/cgs.jl index cc7f70782..f0f157789 100644 --- a/src/cgs.jl +++ b/src/cgs.jl @@ -166,7 +166,8 @@ kwargs_cgs = (:c, :M, :N, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :hist stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end @@ -178,6 +179,7 @@ kwargs_cgs = (:c, :M, :N, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :hist stats.solved, stats.inconsistent = false, false stats.timer = start_time |> ktimer stats.status = "Breakdown bᴴc = 0" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start =false return solver end diff --git a/src/cr.jl b/src/cr.jl index a2193acac..65e43c63e 100644 --- a/src/cr.jl +++ b/src/cr.jl @@ -160,6 +160,7 @@ kwargs_cr = (:M, :ldiv, :radius, :linesearch, :γ, :atol, :rtol, :itmax, :timema stats.timer = start_time |> ktimer stats.status = "x is a zero-residual solution" history && push!(ArNorms, zero(T)) + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end @@ -219,6 +220,7 @@ kwargs_cr = (:M, :ldiv, :radius, :linesearch, :γ, :atol, :rtol, :itmax, :timema stats.timer = start_time |> ktimer stats.status = "nonpositive curvature" iter == 0 && kcopy!(n, x, b) # x ← b + solver.warm_start = false return solver end elseif pAp ≤ 0 && radius == 0 @@ -384,6 +386,7 @@ kwargs_cr = (:M, :ldiv, :radius, :linesearch, :γ, :atol, :rtol, :itmax, :timema stats.inconsistent = false stats.timer = start_time |> ktimer stats.status = "solver encountered numerical issues" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/craig.jl b/src/craig.jl index 28348b17a..f469e45ba 100644 --- a/src/craig.jl +++ b/src/craig.jl @@ -211,7 +211,7 @@ kwargs_craig = (:M, :N, :ldiv, :transfer_to_lsqr, :sqd, :λ, :btol, :conlim, :at stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" return solver end β₁² = β₁^2 diff --git a/src/craigmr.jl b/src/craigmr.jl index 1fc7459de..076b6a945 100644 --- a/src/craigmr.jl +++ b/src/craigmr.jl @@ -198,7 +198,7 @@ kwargs_craigmr = (:M, :N, :ldiv, :sqd, :λ, :atol, :rtol, :itmax, :timemax, :ver history && push!(rNorms, β) history && push!(ArNorms, zero(T)) stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" return solver end @@ -226,7 +226,7 @@ kwargs_craigmr = (:M, :N, :ldiv, :sqd, :λ, :atol, :rtol, :itmax, :timemax, :ver history && push!(rNorms, β) history && push!(ArNorms, zero(T)) stats.timer = start_time |> ktimer - stats.status = "x = 0 is a minimum least-squares solution" + stats.status = "x is a minimum least-squares solution" return solver end kscal!(n, one(FC)/α, v) diff --git a/src/crls.jl b/src/crls.jl index fac05fd86..899c15060 100644 --- a/src/crls.jl +++ b/src/crls.jl @@ -148,7 +148,7 @@ kwargs_crls = (:M, :ldiv, :radius, :λ, :atol, :rtol, :itmax, :timemax, :verbose stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" history && push!(ArNorms, zero(T)) return solver end diff --git a/src/crmr.jl b/src/crmr.jl index a07b08fa9..15ada4f3c 100644 --- a/src/crmr.jl +++ b/src/crmr.jl @@ -159,7 +159,7 @@ kwargs_crmr = (:N, :ldiv, :λ, :atol, :rtol, :itmax, :timemax, :verbose, :histor stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" history && push!(ArNorms, zero(T)) return solver end diff --git a/src/diom.jl b/src/diom.jl index b5baf3102..c261ff27c 100644 --- a/src/diom.jl +++ b/src/diom.jl @@ -155,7 +155,8 @@ kwargs_diom = (:M, :N, :ldiv, :reorthogonalization, :atol, :rtol, :itmax, :timem stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/dqgmres.jl b/src/dqgmres.jl index fa3f4d12b..bbda56b6a 100644 --- a/src/dqgmres.jl +++ b/src/dqgmres.jl @@ -155,7 +155,8 @@ kwargs_dqgmres = (:M, :N, :ldiv, :reorthogonalization, :atol, :rtol, :itmax, :ti stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/fgmres.jl b/src/fgmres.jl index f8f13462f..b44f44207 100644 --- a/src/fgmres.jl +++ b/src/fgmres.jl @@ -165,7 +165,8 @@ kwargs_fgmres = (:M, :N, :ldiv, :restart, :reorthogonalization, :atol, :rtol, :i stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/fom.jl b/src/fom.jl index fb84383bb..b6454febe 100644 --- a/src/fom.jl +++ b/src/fom.jl @@ -160,7 +160,8 @@ kwargs_fom = (:M, :N, :ldiv, :restart, :reorthogonalization, :atol, :rtol, :itma stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/gmres.jl b/src/gmres.jl index b43a00525..08a06bc27 100644 --- a/src/gmres.jl +++ b/src/gmres.jl @@ -160,7 +160,8 @@ kwargs_gmres = (:M, :N, :ldiv, :restart, :reorthogonalization, :atol, :rtol, :it stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/lnlq.jl b/src/lnlq.jl index b8ffd7bed..e6d542983 100644 --- a/src/lnlq.jl +++ b/src/lnlq.jl @@ -208,7 +208,7 @@ kwargs_lnlq = (:M, :N, :ldiv, :transfer_to_craig, :sqd, :λ, :σ, :utolx, :utoly stats.error_with_bnd = false history && push!(rNorms, bNorm) stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" return solver end diff --git a/src/lslq.jl b/src/lslq.jl index 4f546689b..54fc4b942 100644 --- a/src/lslq.jl +++ b/src/lslq.jl @@ -236,7 +236,7 @@ kwargs_lslq = (:M, :N, :ldiv, :transfer_to_lsqr, :sqd, :λ, :σ, :etol, :utol, : history && push!(rNorms, zero(T)) history && push!(ArNorms, zero(T)) stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" return solver end β = β₁ @@ -256,7 +256,7 @@ kwargs_lslq = (:M, :N, :ldiv, :transfer_to_lsqr, :sqd, :λ, :σ, :etol, :utol, : history && push!(rNorms, β₁) history && push!(ArNorms, zero(T)) stats.timer = start_time |> ktimer - stats.status = "x = 0 is a minimum least-squares solution" + stats.status = "x is a minimum least-squares solution" return solver end kscal!(n, one(FC)/α, v) diff --git a/src/lsmr.jl b/src/lsmr.jl index 59211140c..0d3fa13bc 100644 --- a/src/lsmr.jl +++ b/src/lsmr.jl @@ -207,7 +207,7 @@ kwargs_lsmr = (:M, :N, :ldiv, :sqd, :λ, :radius, :etol, :axtol, :btol, :conlim, stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" history && push!(rNorms, zero(T)) history && push!(ArNorms, zero(T)) return solver @@ -268,7 +268,7 @@ kwargs_lsmr = (:M, :N, :ldiv, :sqd, :λ, :radius, :etol, :axtol, :btol, :conlim, stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a minimum least-squares solution" + stats.status = "x is a minimum least-squares solution" return solver end kscal!(n, one(FC)/α, v) diff --git a/src/lsqr.jl b/src/lsqr.jl index 06ac69b18..f4b79ec83 100644 --- a/src/lsqr.jl +++ b/src/lsqr.jl @@ -204,7 +204,7 @@ kwargs_lsqr = (:M, :N, :ldiv, :sqd, :λ, :radius, :etol, :axtol, :btol, :conlim, stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" history && push!(rNorms, zero(T)) history && push!(ArNorms, zero(T)) return solver @@ -250,7 +250,7 @@ kwargs_lsqr = (:M, :N, :ldiv, :sqd, :λ, :radius, :etol, :axtol, :btol, :conlim, stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a minimum least-squares solution" + stats.status = "x is a minimum least-squares solution" return solver end kscal!(n, one(FC)/α, v) diff --git a/src/minares.jl b/src/minares.jl index 9a32ebef0..4bdf64e27 100644 --- a/src/minares.jl +++ b/src/minares.jl @@ -195,7 +195,8 @@ kwargs_minares = (:M, :ldiv, :λ, :atol, :rtol, :Artol, :itmax, :timemax, :verbo stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/minres.jl b/src/minres.jl index ef9348ad6..08904d451 100644 --- a/src/minres.jl +++ b/src/minres.jl @@ -179,10 +179,11 @@ kwargs_minres = (:M, :ldiv, :λ, :atol, :rtol, :etol, :conlim, :itmax, :timemax, stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" history && push!(rNorms, β₁) history && push!(ArNorms, zero(T)) history && push!(Aconds, zero(T)) + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end @@ -330,6 +331,7 @@ kwargs_minres = (:M, :ldiv, :λ, :atol, :rtol, :etol, :conlim, :itmax, :timemax, stats.solved, stats.inconsistent = true, true stats.timer = start_time |> ktimer stats.status = "x is a minimum least-squares solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/minres_qlp.jl b/src/minres_qlp.jl index fb1648747..370ce9da1 100644 --- a/src/minres_qlp.jl +++ b/src/minres_qlp.jl @@ -169,7 +169,8 @@ kwargs_minres_qlp = (:M, :ldiv, :λ, :atol, :rtol, :Artol, :itmax, :timemax, :ve stats.niter = 0 stats.solved, stats.inconsistent = true, false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/qmr.jl b/src/qmr.jl index e642e2d5f..59749eef2 100644 --- a/src/qmr.jl +++ b/src/qmr.jl @@ -171,7 +171,8 @@ kwargs_qmr = (:c, :M, :N, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :hist stats.solved = true stats.inconsistent = false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end @@ -187,6 +188,7 @@ kwargs_qmr = (:c, :M, :N, :ldiv, :atol, :rtol, :itmax, :timemax, :verbose, :hist stats.inconsistent = false stats.timer = start_time |> ktimer stats.status = "Breakdown bᴴc = 0" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/symmlq.jl b/src/symmlq.jl index 221160513..7138cb5d0 100644 --- a/src/symmlq.jl +++ b/src/symmlq.jl @@ -169,7 +169,8 @@ kwargs_symmlq = (:M, :ldiv, :transfer_to_cg, :λ, :λest, :atol, :rtol, :etol, : history && push!(rNorms, zero(T)) history && push!(rcgNorms, zero(T)) stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/usymlq.jl b/src/usymlq.jl index a92913f99..a29d69b9f 100644 --- a/src/usymlq.jl +++ b/src/usymlq.jl @@ -154,7 +154,8 @@ kwargs_usymlq = (:transfer_to_usymcg, :atol, :rtol, :itmax, :timemax, :verbose, stats.solved = true stats.inconsistent = false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/src/usymqr.jl b/src/usymqr.jl index 98e9e87d0..7fdd3eabe 100644 --- a/src/usymqr.jl +++ b/src/usymqr.jl @@ -157,7 +157,8 @@ kwargs_usymqr = (:atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, stats.solved = true stats.inconsistent = false stats.timer = start_time |> ktimer - stats.status = "x = 0 is a zero-residual solution" + stats.status = "x is a zero-residual solution" + warm_start && kaxpy!(n, one(FC), Δx, x) solver.warm_start = false return solver end diff --git a/test/test_bicgstab.jl b/test/test_bicgstab.jl index bde109fdd..be9e4c9ba 100644 --- a/test/test_bicgstab.jl +++ b/test/test_bicgstab.jl @@ -56,7 +56,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = bicgstab(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Left preconditioning A, b, M = square_preconditioned(FC=FC) diff --git a/test/test_bilq.jl b/test/test_bilq.jl index 672097187..b2008a372 100644 --- a/test/test_bilq.jl +++ b/test/test_bilq.jl @@ -48,7 +48,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = bilq(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # System that cause a breakdown with the Lanczos biorthogonalization process. A, b, c = unsymmetric_breakdown(FC=FC) diff --git a/test/test_car.jl b/test/test_car.jl index 0a3af9272..b63300aa2 100644 --- a/test/test_car.jl +++ b/test/test_car.jl @@ -24,7 +24,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = car(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test with Jacobi (or diagonal) preconditioner A, b, M = square_preconditioned(FC=FC) diff --git a/test/test_cg.jl b/test/test_cg.jl index 4a4af3ecc..423b0e480 100644 --- a/test/test_cg.jl +++ b/test/test_cg.jl @@ -38,7 +38,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = cg(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test with Jacobi (or diagonal) preconditioner A, b, M = square_preconditioned(FC=FC) diff --git a/test/test_cg_lanczos.jl b/test/test_cg_lanczos.jl index fe589842f..11ce4e7d8 100644 --- a/test/test_cg_lanczos.jl +++ b/test/test_cg_lanczos.jl @@ -21,7 +21,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = cg_lanczos(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test with Jacobi (or diagonal) preconditioner A, b, M = square_preconditioned(FC=FC) diff --git a/test/test_cg_lanczos_shift.jl b/test/test_cg_lanczos_shift.jl index 5486e5323..8cbc6c9d2 100644 --- a/test/test_cg_lanczos_shift.jl +++ b/test/test_cg_lanczos_shift.jl @@ -31,7 +31,7 @@ end for xi ∈ x @test norm(xi) == 0 end - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test with Jacobi (or diagonal) preconditioner A, b, M = square_preconditioned(FC=FC) diff --git a/test/test_cgls.jl b/test/test_cgls.jl index 706bd3f22..44fb1bb1d 100644 --- a/test/test_cgls.jl +++ b/test/test_cgls.jl @@ -38,7 +38,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = cgls(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test dimension of additional vectors for transpose ∈ (false, true) diff --git a/test/test_cgls_lanczos_shift.jl b/test/test_cgls_lanczos_shift.jl index d5af61414..2422cf772 100644 --- a/test/test_cgls_lanczos_shift.jl +++ b/test/test_cgls_lanczos_shift.jl @@ -26,7 +26,7 @@ end for xi ∈ x @test norm(xi) == 0 end - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Not implemented # Test with Jacobi (or diagonal) preconditioner diff --git a/test/test_cgne.jl b/test/test_cgne.jl index c1a3e798b..664933379 100644 --- a/test/test_cgne.jl +++ b/test/test_cgne.jl @@ -66,7 +66,7 @@ end A, b = zero_rhs(FC=FC) (x, stats) = cgne(A, b, λ=1.0e-3) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test with Jacobi (or diagonal) preconditioner A, b, N = square_preconditioned(FC=FC) diff --git a/test/test_cgs.jl b/test/test_cgs.jl index e4aaca4ef..01e5bfc8b 100644 --- a/test/test_cgs.jl +++ b/test/test_cgs.jl @@ -48,7 +48,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = cgs(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Left preconditioning A, b, M = square_preconditioned(FC=FC) diff --git a/test/test_craig.jl b/test/test_craig.jl index a4840085f..429d27745 100644 --- a/test/test_craig.jl +++ b/test/test_craig.jl @@ -73,7 +73,7 @@ end (x, y, stats) = craig(A, b, λ=1.0e-3) @test norm(x) == 0 @test norm(y) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test regularization A, b, λ = regularization(FC=FC) diff --git a/test/test_craigmr.jl b/test/test_craigmr.jl index acfbadd2f..4b9dfd1c0 100644 --- a/test/test_craigmr.jl +++ b/test/test_craigmr.jl @@ -82,7 +82,7 @@ end (x, y, stats) = craigmr(A, b, λ=1.0e-3) @test norm(x) == 0 @test norm(y) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test regularization A, b, λ = regularization(FC=FC) diff --git a/test/test_crls.jl b/test/test_crls.jl index 08f68f2f1..eed66de97 100644 --- a/test/test_crls.jl +++ b/test/test_crls.jl @@ -39,7 +39,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = crls(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test A positive semi-definite radius = 10. diff --git a/test/test_crmr.jl b/test/test_crmr.jl index d0f902df6..83f962c70 100644 --- a/test/test_crmr.jl +++ b/test/test_crmr.jl @@ -69,7 +69,7 @@ end A, b = zero_rhs(FC=FC) (x, stats) = crmr(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test preconditioner with an under-determined problem: # Find the least norm force that transfers mass unit distance with zero final velocity diff --git a/test/test_diom.jl b/test/test_diom.jl index 62a38b198..cd6e17dda 100644 --- a/test/test_diom.jl +++ b/test/test_diom.jl @@ -56,7 +56,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = diom(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Poisson equation in polar coordinates. A, b = polar_poisson(FC=FC) diff --git a/test/test_dqgmres.jl b/test/test_dqgmres.jl index 230b7edf3..496a7beab 100644 --- a/test/test_dqgmres.jl +++ b/test/test_dqgmres.jl @@ -56,7 +56,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = dqgmres(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Poisson equation in polar coordinates. A, b = polar_poisson(FC=FC) diff --git a/test/test_fgmres.jl b/test/test_fgmres.jl index 9bb73d3e4..5df1b8f47 100644 --- a/test/test_fgmres.jl +++ b/test/test_fgmres.jl @@ -69,7 +69,7 @@ end A, b = zero_rhs(FC=FC) (x, stats) = fgmres(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Poisson equation in polar coordinates. A, b = polar_poisson(FC=FC) diff --git a/test/test_fom.jl b/test/test_fom.jl index 0500d139f..e941b634b 100644 --- a/test/test_fom.jl +++ b/test/test_fom.jl @@ -53,7 +53,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = fom(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Poisson equation in polar coordinates. A, b = polar_poisson(FC=FC) diff --git a/test/test_gmres.jl b/test/test_gmres.jl index 8c4b7d346..493f94c12 100644 --- a/test/test_gmres.jl +++ b/test/test_gmres.jl @@ -56,7 +56,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = gmres(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Poisson equation in polar coordinates. A, b = polar_poisson(FC=FC) diff --git a/test/test_lnlq.jl b/test/test_lnlq.jl index b308609fa..9d79a82b0 100644 --- a/test/test_lnlq.jl +++ b/test/test_lnlq.jl @@ -20,7 +20,7 @@ end (x, y, stats) = lnlq(A, b) @test norm(x) == 0 @test norm(y) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" for transfer_to_craig ∈ (false, true) # Underdetermined consistent. diff --git a/test/test_lslq.jl b/test/test_lslq.jl index be34cb361..2592d2daa 100644 --- a/test/test_lslq.jl +++ b/test/test_lslq.jl @@ -29,7 +29,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = lslq(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" for transfer_to_lsqr ∈ (false, true) # Test with smallest singular value estimate diff --git a/test/test_lsmr.jl b/test/test_lsmr.jl index c9a7558f4..ab4febd20 100644 --- a/test/test_lsmr.jl +++ b/test/test_lsmr.jl @@ -36,7 +36,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = lsmr(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test with preconditioners A, b, M, N = two_preconditioners(FC=FC) diff --git a/test/test_lsqr.jl b/test/test_lsqr.jl index 8b3c331cc..1bd165883 100644 --- a/test/test_lsqr.jl +++ b/test/test_lsqr.jl @@ -36,7 +36,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = lsqr(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test with preconditioners A, b, M, N = two_preconditioners(FC=FC) diff --git a/test/test_minares.jl b/test/test_minares.jl index 4eb22159e..e4a4bb9a1 100644 --- a/test/test_minares.jl +++ b/test/test_minares.jl @@ -40,7 +40,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = minares(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Singular inconsistent system A, b = square_inconsistent(FC=FC) diff --git a/test/test_minres.jl b/test/test_minres.jl index 1b0efdf51..cdd6c887d 100644 --- a/test/test_minres.jl +++ b/test/test_minres.jl @@ -40,7 +40,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = minres(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Shifted system A, b = symmetric_indefinite(FC=FC) diff --git a/test/test_minres_qlp.jl b/test/test_minres_qlp.jl index 0b4d2046d..3f68ad785 100644 --- a/test/test_minres_qlp.jl +++ b/test/test_minres_qlp.jl @@ -40,7 +40,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = minres_qlp(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Singular inconsistent system A, b = square_inconsistent(FC=FC) diff --git a/test/test_qmr.jl b/test/test_qmr.jl index 91fc77dd0..2d31f0dfe 100644 --- a/test/test_qmr.jl +++ b/test/test_qmr.jl @@ -48,7 +48,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = qmr(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Poisson equation in polar coordinates. A, b = polar_poisson(FC=FC) diff --git a/test/test_symmlq.jl b/test/test_symmlq.jl index c4f52c764..eadee7f5c 100644 --- a/test/test_symmlq.jl +++ b/test/test_symmlq.jl @@ -41,7 +41,7 @@ A, b = zero_rhs(FC=FC) (x, stats) = symmlq(A, b) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Test error estimate A = Matrix(get_div_grad(8, 8, 8)) diff --git a/test/test_usymlq.jl b/test/test_usymlq.jl index b9aec86e3..576458ea6 100644 --- a/test/test_usymlq.jl +++ b/test/test_usymlq.jl @@ -63,7 +63,7 @@ c = copy(b) (x, stats) = usymlq(A, b, c) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Underdetermined and consistent systems. A, b = under_consistent(FC=FC) diff --git a/test/test_usymqr.jl b/test/test_usymqr.jl index 7f17e27d4..4f8d75351 100644 --- a/test/test_usymqr.jl +++ b/test/test_usymqr.jl @@ -54,7 +54,7 @@ c = copy(b) (x, stats) = usymqr(A, b, c) @test norm(x) == 0 - @test stats.status == "x = 0 is a zero-residual solution" + @test stats.status == "x is a zero-residual solution" # Underdetermined and consistent systems. A, b = under_consistent(FC=FC) diff --git a/test/test_utils.jl b/test/test_utils.jl index d5fd5f004..4d71545f2 100644 --- a/test/test_utils.jl +++ b/test/test_utils.jl @@ -378,7 +378,8 @@ end # Test warm-start feature with linear systems of size n³. function warm_start(n :: Int=8; FC=Float64) A = get_div_grad(n, n, n) - b = A * ones(n^3) + A = FC.(A) + b = A * ones(FC, n^3) return A, b end diff --git a/test/test_warm_start.jl b/test/test_warm_start.jl index 47508a63a..32bbfe83f 100644 --- a/test/test_warm_start.jl +++ b/test/test_warm_start.jl @@ -1,4 +1,5 @@ function test_warm_start(FC) + T = real(FC) A, b = warm_start(FC=FC) c = copy(b) n, m = size(A) @@ -8,305 +9,489 @@ function test_warm_start(FC) nshifts = 5 tol = 1.0e-6 + J = 5 * Matrix{FC}(I, n, n) + z0 = -2 * ones(FC, n) + d = -10 * ones(FC, n) + # BILQR - x, y, stats = bilqr(A, b, c, x0, y0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - s = c - A' * y - resid = norm(s) / norm(c) - @test(resid ≤ tol) - - solver = BilqrSolver(A, b) - solve!(solver, A, b, c, x0, y0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - s = c - A' * solver.y - resid = norm(s) / norm(c) - @test(resid ≤ tol) + @testset "bilqr" begin + x, y, stats = bilqr(A, b, c, x0, y0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + s = c - A' * y + resid = norm(s) / norm(c) + @test(resid ≤ tol) + + solver = BilqrSolver(A, b) + solve!(solver, A, b, c, x0, y0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + s = c - A' * solver.y + resid = norm(s) / norm(c) + @test(resid ≤ tol) + + solve!(solver, J, d, d, z0, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + s = d - J' * solver.y + resid = norm(s) / norm(d) + @test(resid ≤ tol) + end # TRILQR - x, y, stats = trilqr(A, b, c, x0, y0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - s = c - A' * y - resid = norm(s) / norm(c) - @test(resid ≤ tol) - - solver = TrilqrSolver(A, b) - solve!(solver, A, b, c, x0, y0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - s = c - A' * solver.y - resid = norm(s) / norm(c) - @test(resid ≤ tol) + @testset "trilqr" begin + x, y, stats = trilqr(A, b, c, x0, y0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + s = c - A' * y + resid = norm(s) / norm(c) + @test(resid ≤ tol) + + solver = TrilqrSolver(A, b) + solve!(solver, A, b, c, x0, y0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + s = c - A' * solver.y + resid = norm(s) / norm(c) + @test(resid ≤ tol) + + solve!(solver, J, d, d, z0, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + s = d - J' * solver.y + resid = norm(s) / norm(d) + @test(resid ≤ tol) + end # TRICG - x, y, stats = tricg(A, b, b, x0, y0) - r = [b - x - A * y; b - A' * x + y] - resid = norm(r) / norm([b; b]) - @test(resid ≤ tol) - - solver = TricgSolver(A, b) - solve!(solver, A, b, b, x0, y0) - r = [b - solver.x - A * solver.y; b - A' * solver.x + solver.y] - resid = norm(r) / norm([b; b]) - @test(resid ≤ tol) + @testset "tricg" begin + x, y, stats = tricg(A, b, b, x0, y0) + r = [b - x - A * y; b - A' * x + y] + resid = norm(r) / norm([b; b]) + @test(resid ≤ tol) + + solver = TricgSolver(A, b) + solve!(solver, A, b, b, x0, y0) + r = [b - solver.x - A * solver.y; b - A' * solver.x + solver.y] + resid = norm(r) / norm([b; b]) + @test(resid ≤ tol) + + τ = zero(T) + ν = zero(T) + solve!(solver, J, d, d, z0, z0; τ, ν) + r = [d - τ * solver.x - J * solver.y; d - J' * solver.x - ν * solver.y] + resid = norm(r) / norm([d; d]) + @test(resid ≤ tol) + end # TRIMR - x, y, stats = trimr(A, b, b, x0, y0) - r = [b - x - A * y; b - A' * x + y] - resid = norm(r) / norm([b; b]) - @test(resid ≤ tol) - - solver = TrimrSolver(A, b) - solve!(solver, A, b, b, x0, y0) - r = [b - solver.x - A * solver.y; b - A' * solver.x + solver.y] - resid = norm(r) / norm([b; b]) - @test(resid ≤ tol) + @testset "trimr" begin + x, y, stats = trimr(A, b, b, x0, y0) + r = [b - x - A * y; b - A' * x + y] + resid = norm(r) / norm([b; b]) + @test(resid ≤ tol) + + solver = TrimrSolver(A, b) + solve!(solver, A, b, b, x0, y0) + r = [b - solver.x - A * solver.y; b - A' * solver.x + solver.y] + resid = norm(r) / norm([b; b]) + @test(resid ≤ tol) + + τ = zero(T) + ν = zero(T) + solve!(solver, J, d, d, z0, z0; τ, ν) + r = [d - τ * solver.x - J * solver.y; d - J' * solver.x - ν * solver.y] + resid = norm(r) / norm([d; d]) + @test(resid ≤ tol) + end # GPMR - x, y, stats = gpmr(A, A', b, b, x0, y0) - r = [b - x - A * y; b - A' * x - y] - resid = norm(r) / norm([b; b]) - @test(resid ≤ tol) - - solver = GpmrSolver(A, b) - solve!(solver, A, A', b, b, x0, y0) - r = [b - solver.x - A * solver.y; b - A' * solver.x - solver.y] - resid = norm(r) / norm([b; b]) - @test(resid ≤ tol) + @testset "gpmr" begin + x, y, stats = gpmr(A, A', b, b, x0, y0) + r = [b - x - A * y; b - A' * x - y] + resid = norm(r) / norm([b; b]) + @test(resid ≤ tol) + + solver = GpmrSolver(A, b) + solve!(solver, A, A', b, b, x0, y0) + r = [b - solver.x - A * solver.y; b - A' * solver.x - solver.y] + resid = norm(r) / norm([b; b]) + @test(resid ≤ tol) + + λ = zero(FC) + μ = zero(FC) + solve!(solver, J, J', d, d, z0, z0; λ, μ) + r = [d - λ * solver.x - J * solver.y; d - J' * solver.x - μ * solver.y] + resid = norm(r) / norm([d; d]) + @test(resid ≤ tol) + end # MINRES-QLP - x, stats = minres_qlp(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = MinresQlpSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "minres_qlp" begin + x, stats = minres_qlp(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = MinresQlpSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # SYMMLQ - x, stats = symmlq(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = SymmlqSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "symmlq" begin + x, stats = symmlq(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = SymmlqSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # CG - x, stats = cg(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = CgSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "cg" begin + x, stats = cg(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = CgSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # CR - x, stats = cr(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = CrSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "cr" begin + x, stats = cr(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = CrSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # CAR - x, stats = car(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = CarSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "car" begin + x, stats = car(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = CarSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # CG-LANCZOS - x, stats = cg_lanczos(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = CgLanczosSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "cg_lanczos" begin + x, stats = cg_lanczos(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = CgLanczosSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # MINRES - x, stats = minres(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = MinresSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "minres" begin + x, stats = minres(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = MinresSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # MINARES - x, stats = minares(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = MinaresSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "minares" begin + x, stats = minares(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = MinaresSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # DIOM - x, stats = diom(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = DiomSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "diom" begin + x, stats = diom(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = DiomSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # DQGMRES - x, stats = dqgmres(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = DqgmresSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "dqgmres" begin + x, stats = dqgmres(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = DqgmresSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # FOM - x, stats = fom(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = FomSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "fom" begin + x, stats = fom(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = FomSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # GMRES - x, stats = gmres(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = GmresSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "gmres" begin + x, stats = gmres(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = GmresSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # FGMRES - x, stats = fgmres(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = FgmresSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "fgmres" begin + x, stats = fgmres(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = FgmresSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # BICGSTAB - x, stats = bicgstab(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = BicgstabSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "bicgstab" begin + x, stats = bicgstab(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = BicgstabSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # CGS - x, stats = cgs(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = CgsSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "cgs" begin + x, stats = cgs(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = CgsSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # BILQ - x, stats = bilq(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = BilqSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "bilq" begin + x, stats = bilq(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = BilqSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # QMR - x, stats = qmr(A, b, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = QmrSolver(A, b) - solve!(solver, A, b, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "qmr" begin + x, stats = qmr(A, b, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = QmrSolver(A, b) + solve!(solver, A, b, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # USYMLQ - x, stats = usymlq(A, b, c, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = UsymlqSolver(A, b) - solve!(solver, A, b, c, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "usymlq" begin + x, stats = usymlq(A, b, c, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = UsymlqSolver(A, b) + solve!(solver, A, b, c, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end # USYMQR - x, stats = usymqr(A, b, c, x0) - r = b - A * x - resid = norm(r) / norm(b) - @test(resid ≤ tol) - - solver = UsymqrSolver(A, b) - solve!(solver, A, b, c, x0) - r = b - A * solver.x - resid = norm(r) / norm(b) - @test(resid ≤ tol) + @testset "usymqr" begin + x, stats = usymqr(A, b, c, x0) + r = b - A * x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solver = UsymqrSolver(A, b) + solve!(solver, A, b, c, x0) + r = b - A * solver.x + resid = norm(r) / norm(b) + @test(resid ≤ tol) + + solve!(solver, J, d, d, z0) + r = d - J * solver.x + resid = norm(r) / norm(d) + @test(resid ≤ tol) + end end @testset "warm-start" begin From 61d7fed62b59f51229c3c720f3ba22cc90bb8045 Mon Sep 17 00:00:00 2001 From: Alexis Montoison <35051714+amontoison@users.noreply.github.com> Date: Sat, 15 Feb 2025 02:57:55 -0600 Subject: [PATCH 2/2] Fix breakage tests (#4) * Fix breakage tests * Update .github/workflows/Breakage.yml --- .github/workflows/Breakage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Breakage.yml b/.github/workflows/Breakage.yml index c80819806..8a3df43a9 100644 --- a/.github/workflows/Breakage.yml +++ b/.github/workflows/Breakage.yml @@ -160,7 +160,7 @@ jobs: done >> summary.md - name: PR comment with file - uses: actions/github-script@v6 + uses: actions/github-script@main with: github-token: ${{ secrets.GITHUB_TOKEN }} script: |