From 8a2978b6205f20f632eba2d645a993fdf16a95c9 Mon Sep 17 00:00:00 2001 From: Alexis Montoison Date: Fri, 7 Oct 2022 17:23:10 -0400 Subject: [PATCH] Update test_solvers.jl --- src/krylov_solvers.jl | 52 +- src/krylov_stats.jl | 3 + src/minres.jl | 2 +- test/test_solvers.jl | 1292 ++++------------------------------------- 4 files changed, 148 insertions(+), 1201 deletions(-) diff --git a/src/krylov_solvers.jl b/src/krylov_solvers.jl index 37be1373d..c86ecef2d 100644 --- a/src/krylov_solvers.jl +++ b/src/krylov_solvers.jl @@ -8,7 +8,7 @@ GmresSolver, FomSolver, GpmrSolver, FgmresSolver export solve!, solution, nsolution, statistics, issolved, issolved_primal, issolved_dual, niterations, Aprod, Atprod, Bprod, warm_start! -import Base.size, Base.sizeof +import Base.size, Base.sizeof, Base.format_bytes const KRYLOV_SOLVERS = Dict( :cg => :CgSolver , @@ -1895,40 +1895,18 @@ function ksizeof(attribute) return size_attribute end -function sizeof(solver :: KrylovSolver) - workspace = typeof(solver) - nfields = fieldcount(workspace) +function sizeof(stats_solver :: Union{KrylovStats, KrylovSolver}) + type = typeof(stats_solver) + nfields = fieldcount(type) storage = 0 - for i = 1:nfields-1 - field_i = getfield(solver, i) + for i = 1:nfields + field_i = getfield(stats_solver, i) size_i = ksizeof(field_i) storage += size_i end return storage end -function val_metric(val::Int) - metric = "bytes" - if val ≥ 1024 - val /= 1024 - metric = "KB" - if val ≥ 1024 - val /= 1024 - metric = "MB" - if val ≥ 1024 - val /= 1024 - metric = "GB" - if val ≥ 1024 - val /= 1024 - metric = "TB" - end - end - end - val = round(val, digits=2) - end - return string(val, " ", metric) -end - """ show(io, solver; show_stats=true) @@ -1937,30 +1915,32 @@ Statistics of `solver` are displayed if `show_stats` is set to true. function show(io :: IO, solver :: KrylovSolver{T,FC,S}; show_stats :: Bool=true) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: DenseVector{FC}} workspace = typeof(solver) name_solver = string(workspace.name.name) + name_stats = string(typeof(solver.stats).name.name) nbytes = sizeof(solver) - storage = val_metric(nbytes) + storage = format_bytes(nbytes) architecture = S <: Vector ? "CPU" : "GPU" - l1 = max(length(name_solver) + 8, length(string(FC)) + 11) # length("solver: ") = 8 and length("Precision: ") = 11 + l1 = max(length(name_solver), length(string(FC)) + 11) # length("Precision: ") = 11 l2 = max(ndigits(solver.m) + 7, length(architecture) + 14, length(string(S)) + 8) # length("Vector{}") = 8, # length("Architecture: ") = 14 and length("nrows: ") = 7 - l3 = max(ndigits(solver.n) + 7, length(storage) + 9, 13) # length("Size in bytes") = 13, length("Storage: ") = 9 and length("cols: ") = 7 + l2 = max(l2, length(name_stats) + 2 + length(string(T))) # length("{}") = 2 + l3 = max(ndigits(solver.n) + 7, length(storage) + 9) # length("Storage: ") = 9 and length("cols: ") = 7 format = Printf.Format("│%$(l1)s│%$(l2)s│%$(l3)s│\n") format2 = Printf.Format("│%$(l1+1)s│%$(l2)s│%$(l3)s│\n") @printf(io, "┌%s┬%s┬%s┐\n", "─"^l1, "─"^l2, "─"^l3) - Printf.format(io, format, "Solver: $(name_solver)", "nrows: $(solver.m)", "ncols: $(solver.n)") + Printf.format(io, format, "$(name_solver)", "nrows: $(solver.m)", "ncols: $(solver.n)") @printf(io, "├%s┼%s┼%s┤\n", "─"^l1, "─"^l2, "─"^l3) Printf.format(io, format, "Precision: $FC", "Architecture: $architecture","Storage: $storage") @printf(io, "├%s┼%s┼%s┤\n", "─"^l1, "─"^l2, "─"^l3) - Printf.format(io, format, "Attribute", "Type", "Size in bytes") + Printf.format(io, format, "Attribute", "Type", "Size") @printf(io, "├%s┼%s┼%s┤\n", "─"^l1, "─"^l2, "─"^l3) - for i=1:fieldcount(workspace)-1 # show stats seperately + for i=1:fieldcount(workspace) name_i = fieldname(workspace, i) type_i = fieldtype(workspace, i) field_i = getfield(solver, name_i) size_i = ksizeof(field_i) if (name_i in [:w̅, :w̄, :d̅]) && (VERSION < v"1.8.0-DEV") - Printf.format(io, format2, string(name_i), type_i, size_i) + Printf.format(io, format2, string(name_i), type_i, format_bytes(size_i)) else - Printf.format(io, format, string(name_i), type_i, size_i) + Printf.format(io, format, string(name_i), type_i, format_bytes(size_i)) end end @printf(io, "└%s┴%s┴%s┘\n","─"^l1,"─"^l2,"─"^l3) diff --git a/src/krylov_stats.jl b/src/krylov_stats.jl index a662fa0a0..f99c7863b 100644 --- a/src/krylov_stats.jl +++ b/src/krylov_stats.jl @@ -1,3 +1,6 @@ +export KrylovStats, SimpleStats, LsmrStats, LanczosStats, LanczosShiftStats, +SymmlqStats, AdjointStats, LNLQStats, LSLQStats + "Abstract type for statistics returned by a solver" abstract type KrylovStats{T} end diff --git a/src/minres.jl b/src/minres.jl index c1d5d5751..f2814403c 100644 --- a/src/minres.jl +++ b/src/minres.jl @@ -306,7 +306,7 @@ function minres!(solver :: MinresSolver{T,FC,S}, A, b :: AbstractVector{FC}; if iter == 1 && β / β₁ ≤ 10 * ϵM # Aᴴb = 0 so x = 0 is a minimum least-squares solution - stats.niter = 0 + stats.niter = 1 stats.solved, stats.inconsistent = true, true stats.status = "x is a minimum least-squares solution" solver.warm_start = false diff --git a/test/test_solvers.jl b/test/test_solvers.jl index 7f36af586..8c1e2975d 100644 --- a/test/test_solvers.jl +++ b/test/test_solvers.jl @@ -11,1175 +11,139 @@ function test_solvers(FC) nshifts = 5 T = real(FC) S = Vector{FC} + solvers = Dict{Symbol, KrylovSolver}() @eval begin - cg_solver = $(KRYLOV_SOLVERS[:cg])($n, $n, $S) - symmlq_solver = $(KRYLOV_SOLVERS[:symmlq])($n, $n, $S) - minres_solver = $(KRYLOV_SOLVERS[:minres])($n, $n, $S) - cg_lanczos_solver = $(KRYLOV_SOLVERS[:cg_lanczos])($n, $n, $S) - diom_solver = $(KRYLOV_SOLVERS[:diom])($n, $n, $mem, $S) - fom_solver = $(KRYLOV_SOLVERS[:fom])($n, $n, $mem, $S) - dqgmres_solver = $(KRYLOV_SOLVERS[:dqgmres])($n, $n, $mem, $S) - gmres_solver = $(KRYLOV_SOLVERS[:gmres])($n, $n, $mem, $S) - fgmres_solver = $(KRYLOV_SOLVERS[:fgmres])($n, $n, $mem, $S) - cr_solver = $(KRYLOV_SOLVERS[:cr])($n, $n, $S) - crmr_solver = $(KRYLOV_SOLVERS[:crmr])($m, $n, $S) - cgs_solver = $(KRYLOV_SOLVERS[:cgs])($n, $n, $S) - bicgstab_solver = $(KRYLOV_SOLVERS[:bicgstab])($n, $n, $S) - craigmr_solver = $(KRYLOV_SOLVERS[:craigmr])($m, $n, $S) - cgne_solver = $(KRYLOV_SOLVERS[:cgne])($m, $n, $S) - lnlq_solver = $(KRYLOV_SOLVERS[:lnlq])($m, $n, $S) - craig_solver = $(KRYLOV_SOLVERS[:craig])($m, $n, $S) - lslq_solver = $(KRYLOV_SOLVERS[:lslq])($n, $m, $S) - cgls_solver = $(KRYLOV_SOLVERS[:cgls])($n, $m, $S) - lsqr_solver = $(KRYLOV_SOLVERS[:lsqr])($n, $m, $S) - crls_solver = $(KRYLOV_SOLVERS[:crls])($n, $m, $S) - lsmr_solver = $(KRYLOV_SOLVERS[:lsmr])($n, $m, $S) - usymqr_solver = $(KRYLOV_SOLVERS[:usymqr])($n, $m, $S) - trilqr_solver = $(KRYLOV_SOLVERS[:trilqr])($n, $n, $S) - bilq_solver = $(KRYLOV_SOLVERS[:bilq])($n, $n, $S) - bilqr_solver = $(KRYLOV_SOLVERS[:bilqr])($n, $n, $S) - minres_qlp_solver = $(KRYLOV_SOLVERS[:minres_qlp])($n, $n, $S) - qmr_solver = $(KRYLOV_SOLVERS[:qmr])($n, $n, $S) - usymlq_solver = $(KRYLOV_SOLVERS[:usymlq])($m, $n, $S) - tricg_solver = $(KRYLOV_SOLVERS[:tricg])($m, $n, $S) - trimr_solver = $(KRYLOV_SOLVERS[:trimr])($m, $n, $S) - gpmr_solver = $(KRYLOV_SOLVERS[:gpmr])($n, $m, $mem, $S) - cg_lanczos_shift_solver = $(KRYLOV_SOLVERS[:cg_lanczos_shift])($n, $n, $nshifts, $S) + $solvers[:cg] = $(KRYLOV_SOLVERS[:cg])($n, $n, $S) + $solvers[:symmlq] = $(KRYLOV_SOLVERS[:symmlq])($n, $n, $S) + $solvers[:minres] = $(KRYLOV_SOLVERS[:minres])($n, $n, $S) + $solvers[:cg_lanczos] = $(KRYLOV_SOLVERS[:cg_lanczos])($n, $n, $S) + $solvers[:cg_lanczos_shift] = $(KRYLOV_SOLVERS[:cg_lanczos_shift])($n, $n, $nshifts, $S) + $solvers[:diom] = $(KRYLOV_SOLVERS[:diom])($n, $n, $mem, $S) + $solvers[:fom] = $(KRYLOV_SOLVERS[:fom])($n, $n, $mem, $S) + $solvers[:dqgmres] = $(KRYLOV_SOLVERS[:dqgmres])($n, $n, $mem, $S) + $solvers[:gmres] = $(KRYLOV_SOLVERS[:gmres])($n, $n, $mem, $S) + $solvers[:fgmres] = $(KRYLOV_SOLVERS[:fgmres])($n, $n, $mem, $S) + $solvers[:cr] = $(KRYLOV_SOLVERS[:cr])($n, $n, $S) + $solvers[:crmr] = $(KRYLOV_SOLVERS[:crmr])($m, $n, $S) + $solvers[:cgs] = $(KRYLOV_SOLVERS[:cgs])($n, $n, $S) + $solvers[:bicgstab] = $(KRYLOV_SOLVERS[:bicgstab])($n, $n, $S) + $solvers[:craigmr] = $(KRYLOV_SOLVERS[:craigmr])($m, $n, $S) + $solvers[:cgne] = $(KRYLOV_SOLVERS[:cgne])($m, $n, $S) + $solvers[:lnlq] = $(KRYLOV_SOLVERS[:lnlq])($m, $n, $S) + $solvers[:craig] = $(KRYLOV_SOLVERS[:craig])($m, $n, $S) + $solvers[:lslq] = $(KRYLOV_SOLVERS[:lslq])($n, $m, $S) + $solvers[:cgls] = $(KRYLOV_SOLVERS[:cgls])($n, $m, $S) + $solvers[:lsqr] = $(KRYLOV_SOLVERS[:lsqr])($n, $m, $S) + $solvers[:crls] = $(KRYLOV_SOLVERS[:crls])($n, $m, $S) + $solvers[:lsmr] = $(KRYLOV_SOLVERS[:lsmr])($n, $m, $S) + $solvers[:usymqr] = $(KRYLOV_SOLVERS[:usymqr])($n, $m, $S) + $solvers[:trilqr] = $(KRYLOV_SOLVERS[:trilqr])($n, $n, $S) + $solvers[:bilq] = $(KRYLOV_SOLVERS[:bilq])($n, $n, $S) + $solvers[:bilqr] = $(KRYLOV_SOLVERS[:bilqr])($n, $n, $S) + $solvers[:minres_qlp] = $(KRYLOV_SOLVERS[:minres_qlp])($n, $n, $S) + $solvers[:qmr] = $(KRYLOV_SOLVERS[:qmr])($n, $n, $S) + $solvers[:usymlq] = $(KRYLOV_SOLVERS[:usymlq])($m, $n, $S) + $solvers[:tricg] = $(KRYLOV_SOLVERS[:tricg])($m, $n, $S) + $solvers[:trimr] = $(KRYLOV_SOLVERS[:trimr])($m, $n, $S) + $solvers[:gpmr] = $(KRYLOV_SOLVERS[:gpmr])($n, $m, $mem, $S) + $solvers[:cg_lanczos_shift] = $(KRYLOV_SOLVERS[:cg_lanczos_shift])($n, $n, $nshifts, $S) end - for i = 1 : 3 - A = i * A - Au = i * Au - Ao = i * Ao - b = 5 * b - c = 3 * c - - solver = solve!(cg_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(symmlq_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(minres_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(cg_lanczos_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(cg_lanczos_shift_solver, A, b, shifts) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(diom_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(fom_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(dqgmres_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(gmres_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(fgmres_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(cr_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(crmr_solver, Au, c) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(cgs_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == 2 * niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(bicgstab_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == 2 * niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(craigmr_solver, Au, c) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 2 - @test issolved(solver) - - solver = solve!(cgne_solver, Au, c) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(lnlq_solver, Au, c) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test solution(solver, 2) === solver.y - @test nsolution(solver) == 2 - @test issolved(solver) - - solver = solve!(craig_solver, Au, c) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test solution(solver, 2) === solver.y - @test nsolution(solver) == 2 - @test issolved(solver) - - solver = solve!(lslq_solver, Ao, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(cgls_solver, Ao, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(lsqr_solver, Ao, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(crls_solver, Ao, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(lsmr_solver, Ao, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(usymqr_solver, Ao, b, c) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(trilqr_solver, A, b, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test solution(solver, 2) === solver.y - @test nsolution(solver) == 2 - @test issolved_primal(solver) - @test issolved_dual(solver) - @test issolved(solver) - - solver = solve!(bilq_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(bilqr_solver, A, b, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test solution(solver, 2) === solver.y - @test nsolution(solver) == 2 - @test issolved_primal(solver) - @test issolved_dual(solver) - @test issolved(solver) - - solver = solve!(minres_qlp_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(qmr_solver, A, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(usymlq_solver, Au, c, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test nsolution(solver) == 1 - @test issolved(solver) - - solver = solve!(tricg_solver, Au, c, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test solution(solver, 2) === solver.y - @test nsolution(solver) == 2 - @test issolved(solver) - - solver = solve!(trimr_solver, Au, c, b) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test solution(solver, 2) === solver.y - @test nsolution(solver) == 2 - @test issolved(solver) - - solver = solve!(gpmr_solver, Ao, Au, b, c) - niter = niterations(solver) - @test niter > 0 - @test Aprod(solver) == niter - @test Atprod(solver) == 0 - @test Bprod(solver) == niter - @test statistics(solver) === solver.stats - @test solution(solver, 1) === solver.x - @test solution(solver, 2) === solver.y - @test nsolution(solver) == 2 - @test issolved(solver) + for (method, solver) in solvers + @testset "$(method)" begin + for i = 1 : 3 + A = i * A + Au = i * Au + Ao = i * Ao + b = 5 * b + c = 3 * c + + if method ∈ (:cg, :cr, :symmlq, :minres, :minres_qlp, :cg_lanczos, :diom, :fom, + :dqgmres, :gmres, :fgmres, :cgs, :bicgstab, :bilq, :qmr, :cg_lanczos_shift) + method == :cg_lanczos_shift ? solve!(solver, A, b, shifts) : solve!(solver, A, b) + niter = niterations(solver) + @test Aprod(solver) == (method ∈ (:cgs, :bicgstab) ? 2 * niter : niter) + @test Atprod(solver) == (method ∈ (:bilq, :qmr) ? niter : 0) + @test solution(solver) === solver.x + @test nsolution(solver) == 1 + end + + if method ∈ (:cgne, :crmr, :lnlq, :craig, :craigmr) + solve!(solver, Au, c) + niter = niterations(solver) + @test Aprod(solver) == niter + @test Atprod(solver) == niter + @test solution(solver, 1) === solver.x + @test nsolution(solver) == (method ∈ (:cgne, :crmr) ? 1 : 2) + (nsolution == 2) && (@test solution(solver, 2) == solver.y) + end + + if method ∈ (:cgls, :crls, :lslq, :lsqr, :lsmr) + solve!(solver, Ao, b) + niter = niterations(solver) + @test Aprod(solver) == niter + @test Atprod(solver) == niter + @test solution(solver) === solver.x + @test nsolution(solver) == 1 + end + + if method ∈ (:bilqr, :trilqr) + solve!(solver, A, b, b) + niter = niterations(solver) + @test Aprod(solver) == niter + @test Atprod(solver) == niter + @test solution(solver, 1) === solver.x + @test solution(solver, 2) === solver.y + @test nsolution(solver) == 2 + @test issolved_primal(solver) + @test issolved_dual(solver) + end + + if method ∈ (:tricg, :trimr, :gpmr) + method == :gpmr ? solve!(solver, Ao, Au, b, c) : solve!(solver, Au, c, b) + niter = niterations(solver) + @test Aprod(solver) == niter + method != :gpmr && (@test Atprod(solver) == niter) + method == :gpmr && (@test Bprod(solver) == niter) + @test solution(solver, 1) === solver.x + @test solution(solver, 2) === solver.y + @test nsolution(solver) == 2 + end + + if method ∈ (:usymlq, :usymqr) + method == :usymlq ? solve!(solver, Au, c, b) : solve!(solver, Ao, b, c) + niter = niterations(solver) + @test Aprod(solver) == niter + @test Atprod(solver) == niter + @test solution(solver) === solver.x + @test nsolution(solver) == 1 + end + + @test niter > 0 + @test statistics(solver) === solver.stats + @test issolved(solver) + end + + io = IOBuffer() + show(io, solver, show_stats=false) + showed = String(take!(io)) + + # Test that the lines have the same length + str = split(showed, "\n", keepempty=false) + len_row = length(str[1]) + @test mapreduce(x -> length(x) - mapreduce(y -> occursin(y, x), |, ["w̅","w̄","d̅"]) == len_row, &, str) + + # Test that the columns have the same length + str2 = split(showed, ['│','┌','┬','┐','├','┼','┤','└','┴','┴','┘','\n'], keepempty=false) + len_col1 = length(str2[1]) + len_col2 = length(str2[2]) + len_col3 = length(str2[3]) + @test mapreduce(x -> length(x) - mapreduce(y -> occursin(y, x), |, ["w̅","w̄","d̅"]) == len_col1, &, str2[1:3:end-2]) + @test mapreduce(x -> length(x) - mapreduce(y -> occursin(y, x), |, ["w̅","w̄","d̅"]) == len_col2, &, str2[2:3:end-1]) + @test mapreduce(x -> length(x) - mapreduce(y -> occursin(y, x), |, ["w̅","w̄","d̅"]) == len_col3, &, str2[3:3:end]) + end end - - io = IOBuffer() - show(io, cg_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │ CgSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ r│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Ap│ Vector{$FC}│ 64│ - │ z│ Vector{$FC}│ 0│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, symmlq_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌────────────┬───────────────┬─────────────────┐ - │SymmlqSolver│Precision: $FC │Architecture: CPU│ - ├────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├────────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ Mvold│ Vector{$FC}│ 64│ - │ Mv│ Vector{$FC}│ 64│ - │ Mv_next│ Vector{$FC}│ 64│ - │ w̅│ Vector{$FC}│ 64│ - │ v│ Vector{$FC}│ 0│ - │ clist│ Vector{$T}│ 5│ - │ zlist│ Vector{$T}│ 5│ - │ sprod│ Vector{$T}│ 5│ - │ warm_start│ Bool│ 0│ - └────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, minres_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌────────────┬───────────────┬─────────────────┐ - │MinresSolver│Precision: $FC │Architecture: CPU│ - ├────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├────────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ r1│ Vector{$FC}│ 64│ - │ r2│ Vector{$FC}│ 64│ - │ w1│ Vector{$FC}│ 64│ - │ w2│ Vector{$FC}│ 64│ - │ y│ Vector{$FC}│ 64│ - │ v│ Vector{$FC}│ 0│ - │ err_vec│ Vector{$T}│ 5│ - │ warm_start│ Bool│ 0│ - └────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, cg_lanczos_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌───────────────┬───────────────┬─────────────────┐ - │CgLanczosSolver│Precision: $FC │Architecture: CPU│ - ├───────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├───────────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ Mv│ Vector{$FC}│ 64│ - │ Mv_prev│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Mv_next│ Vector{$FC}│ 64│ - │ v│ Vector{$FC}│ 0│ - │ warm_start│ Bool│ 0│ - └───────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, cg_lanczos_shift_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌────────────────────┬───────────────────┬─────────────────┐ - │CgLanczosShiftSolver│ Precision: $FC │Architecture: CPU│ - ├────────────────────┼───────────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├────────────────────┼───────────────────┼─────────────────┤ - │ Mv│ Vector{$FC}│ 64│ - │ Mv_prev│ Vector{$FC}│ 64│ - │ Mv_next│ Vector{$FC}│ 64│ - │ v│ Vector{$FC}│ 0│ - │ x│Vector{Vector{$FC}}│ 5 x 64│ - │ p│Vector{Vector{$FC}}│ 5 x 64│ - │ σ│ Vector{$T}│ 5│ - │ δhat│ Vector{$T}│ 5│ - │ ω│ Vector{$T}│ 5│ - │ γ│ Vector{$T}│ 5│ - │ rNorms│ Vector{$T}│ 5│ - │ converged│ BitVector│ 5│ - │ not_cv│ BitVector│ 5│ - └────────────────────┴───────────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, diom_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────────┬─────────────────┐ - │DiomSolver│ Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ t│ Vector{$FC}│ 64│ - │ z│ Vector{$FC}│ 0│ - │ w│ Vector{$FC}│ 0│ - │ P│Vector{Vector{$FC}}│ 9 x 64│ - │ V│Vector{Vector{$FC}}│ 10 x 64│ - │ L│ Vector{$FC}│ 9│ - │ H│ Vector{$FC}│ 10│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, fom_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────────┬─────────────────┐ - │ FomSolver│ Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ w│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 0│ - │ q│ Vector{$FC}│ 0│ - │ V│Vector{Vector{$FC}}│ 10 x 64│ - │ l│ Vector{$FC}│ 10│ - │ z│ Vector{$FC}│ 10│ - │ U│ Vector{$FC}│ 55│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, dqgmres_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌─────────────┬───────────────────┬─────────────────┐ - │DqgmresSolver│ Precision: $FC │Architecture: CPU│ - ├─────────────┼───────────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├─────────────┼───────────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ t│ Vector{$FC}│ 64│ - │ z│ Vector{$FC}│ 0│ - │ w│ Vector{$FC}│ 0│ - │ P│Vector{Vector{$FC}}│ 10 x 64│ - │ V│Vector{Vector{$FC}}│ 10 x 64│ - │ c│ Vector{$T}│ 10│ - │ s│ Vector{$FC}│ 10│ - │ H│ Vector{$FC}│ 11│ - │ warm_start│ Bool│ 0│ - └─────────────┴───────────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, gmres_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌───────────┬───────────────────┬─────────────────┐ - │GmresSolver│ Precision: $FC │Architecture: CPU│ - ├───────────┼───────────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├───────────┼───────────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ w│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 0│ - │ q│ Vector{$FC}│ 0│ - │ V│Vector{Vector{$FC}}│ 10 x 64│ - │ c│ Vector{$T}│ 10│ - │ s│ Vector{$FC}│ 10│ - │ z│ Vector{$FC}│ 10│ - │ R│ Vector{$FC}│ 55│ - │ warm_start│ Bool│ 0│ - │ inner_iter│ Int64│ 0│ - └───────────┴───────────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, fgmres_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌────────────┬───────────────────┬─────────────────┐ - │FgmresSolver│ Precision: $FC │Architecture: CPU│ - ├────────────┼───────────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├────────────┼───────────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ w│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 0│ - │ V│Vector{Vector{$FC}}│ 10 x 64│ - │ Z│Vector{Vector{$FC}}│ 10 x 64│ - │ c│ Vector{$T}│ 10│ - │ s│ Vector{$FC}│ 10│ - │ z│ Vector{$FC}│ 10│ - │ R│ Vector{$FC}│ 55│ - │ warm_start│ Bool│ 0│ - │ inner_iter│ Int64│ 0│ - └────────────┴───────────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, cr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │ CrSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ r│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ Ar│ Vector{$FC}│ 64│ - │ Mq│ Vector{$FC}│ 0│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, crmr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │CrmrSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Aᴴr│ Vector{$FC}│ 64│ - │ r│ Vector{$FC}│ 32│ - │ q│ Vector{$FC}│ 32│ - │ Nq│ Vector{$FC}│ 0│ - │ s│ Vector{$FC}│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, cgs_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │ CgsSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │Attribute │ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ r│ Vector{$FC}│ 64│ - │ u│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ ts│ Vector{$FC}│ 64│ - │ yz│ Vector{$FC}│ 0│ - │ vw│ Vector{$FC}│ 0│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, bicgstab_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────────┬───────────────┬─────────────────┐ - │BicgstabSolver│Precision: $FC │Architecture: CPU│ - ├──────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ r│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ v│ Vector{$FC}│ 64│ - │ s│ Vector{$FC}│ 64│ - │ qd│ Vector{$FC}│ 64│ - │ yz│ Vector{$FC}│ 0│ - │ t│ Vector{$FC}│ 0│ - │ warm_start│ Bool│ 0│ - └──────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, craigmr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌─────────────┬───────────────┬─────────────────┐ - │CraigmrSolver│Precision: $FC │Architecture: CPU│ - ├─────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├─────────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 64│ - │ Nv│ Vector{$FC}│ 64│ - │ Aᴴu│ Vector{$FC}│ 64│ - │ d│ Vector{$FC}│ 64│ - │ y│ Vector{$FC}│ 32│ - │ Mu│ Vector{$FC}│ 32│ - │ w│ Vector{$FC}│ 32│ - │ wbar│ Vector{$FC}│ 32│ - │ Av│ Vector{$FC}│ 32│ - │ u│ Vector{$FC}│ 0│ - │ v│ Vector{$FC}│ 0│ - │ q│ Vector{$FC}│ 0│ - └─────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, cgne_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │CgneSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Aᴴz│ Vector{$FC}│ 64│ - │ r│ Vector{$FC}│ 32│ - │ q│ Vector{$FC}│ 32│ - │ s│ Vector{$FC}│ 0│ - │ z│ Vector{$FC}│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, lnlq_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │LnlqSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 64│ - │ Nv│ Vector{$FC}│ 64│ - │ Aᴴu│ Vector{$FC}│ 64│ - │ y│ Vector{$FC}│ 32│ - │ w̄│ Vector{$FC}│ 32│ - │ Mu│ Vector{$FC}│ 32│ - │ Av│ Vector{$FC}│ 32│ - │ u│ Vector{$FC}│ 0│ - │ v│ Vector{$FC}│ 0│ - │ q│ Vector{$FC}│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, craig_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌───────────┬───────────────┬─────────────────┐ - │CraigSolver│Precision: $FC │Architecture: CPU│ - ├───────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├───────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 64│ - │ Nv│ Vector{$FC}│ 64│ - │ Aᴴu│ Vector{$FC}│ 64│ - │ y│ Vector{$FC}│ 32│ - │ w│ Vector{$FC}│ 32│ - │ Mu│ Vector{$FC}│ 32│ - │ Av│ Vector{$FC}│ 32│ - │ u│ Vector{$FC}│ 0│ - │ v│ Vector{$FC}│ 0│ - │ w2│ Vector{$FC}│ 0│ - └───────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, lslq_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │LslqSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 32│ - │ Nv│ Vector{$FC}│ 32│ - │ Aᴴu│ Vector{$FC}│ 32│ - │ w̄│ Vector{$FC}│ 32│ - │ Mu│ Vector{$FC}│ 64│ - │ Av│ Vector{$FC}│ 64│ - │ u│ Vector{$FC}│ 0│ - │ v│ Vector{$FC}│ 0│ - │ err_vec│ Vector{$T}│ 5│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, cgls_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │CglsSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 32│ - │ p│ Vector{$FC}│ 32│ - │ s│ Vector{$FC}│ 32│ - │ r│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ Mr│ Vector{$FC}│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, lsqr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │LsqrSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 32│ - │ Nv│ Vector{$FC}│ 32│ - │ Aᴴu│ Vector{$FC}│ 32│ - │ w│ Vector{$FC}│ 32│ - │ Mu│ Vector{$FC}│ 64│ - │ Av│ Vector{$FC}│ 64│ - │ u│ Vector{$FC}│ 0│ - │ v│ Vector{$FC}│ 0│ - │ err_vec│ Vector{$T}│ 5│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, crls_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │CrlsSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 32│ - │ p│ Vector{$FC}│ 32│ - │ Ar│ Vector{$FC}│ 32│ - │ q│ Vector{$FC}│ 32│ - │ r│ Vector{$FC}│ 64│ - │ Ap│ Vector{$FC}│ 64│ - │ s│ Vector{$FC}│ 64│ - │ Ms│ Vector{$FC}│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, lsmr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │LsmrSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ x│ Vector{$FC}│ 32│ - │ Nv│ Vector{$FC}│ 32│ - │ Aᴴu│ Vector{$FC}│ 32│ - │ h│ Vector{$FC}│ 32│ - │ hbar│ Vector{$FC}│ 32│ - │ Mu│ Vector{$FC}│ 64│ - │ Av│ Vector{$FC}│ 64│ - │ u│ Vector{$FC}│ 0│ - │ v│ Vector{$FC}│ 0│ - │ err_vec│ Vector{$T}│ 5│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, usymqr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌────────────┬───────────────┬─────────────────┐ - │UsymqrSolver│Precision: $FC │Architecture: CPU│ - ├────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├────────────┼───────────────┼─────────────────┤ - │ vₖ₋₁│ Vector{$FC}│ 64│ - │ vₖ│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 32│ - │ wₖ₋₂│ Vector{$FC}│ 32│ - │ wₖ₋₁│ Vector{$FC}│ 32│ - │ uₖ₋₁│ Vector{$FC}│ 32│ - │ uₖ│ Vector{$FC}│ 32│ - │ p│ Vector{$FC}│ 32│ - │ warm_start│ Bool│ 0│ - └────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, trilqr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌────────────┬───────────────┬─────────────────┐ - │TrilqrSolver│Precision: $FC │Architecture: CPU│ - ├────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├────────────┼───────────────┼─────────────────┤ - │ uₖ₋₁│ Vector{$FC}│ 64│ - │ uₖ│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ d̅│ Vector{$FC}│ 64│ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ vₖ₋₁│ Vector{$FC}│ 64│ - │ vₖ│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ Δy│ Vector{$FC}│ 0│ - │ y│ Vector{$FC}│ 64│ - │ wₖ₋₃│ Vector{$FC}│ 64│ - │ wₖ₋₂│ Vector{$FC}│ 64│ - │ warm_start│ Bool│ 0│ - └────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, bilq_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │BilqSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ uₖ₋₁│ Vector{$FC}│ 64│ - │ uₖ│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ vₖ₋₁│ Vector{$FC}│ 64│ - │ vₖ│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ d̅│ Vector{$FC}│ 64│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, bilqr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌───────────┬───────────────┬─────────────────┐ - │BilqrSolver│Precision: $FC │Architecture: CPU│ - ├───────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├───────────┼───────────────┼─────────────────┤ - │ uₖ₋₁│ Vector{$FC}│ 64│ - │ uₖ│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ vₖ₋₁│ Vector{$FC}│ 64│ - │ vₖ│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ Δy│ Vector{$FC}│ 0│ - │ y│ Vector{$FC}│ 64│ - │ d̅│ Vector{$FC}│ 64│ - │ wₖ₋₃│ Vector{$FC}│ 64│ - │ wₖ₋₂│ Vector{$FC}│ 64│ - │ warm_start│ Bool│ 0│ - └───────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, minres_qlp_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌───────────────┬───────────────┬─────────────────┐ - │MinresQlpSolver│Precision: $FC │Architecture: CPU│ - ├───────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├───────────────┼───────────────┼─────────────────┤ - │ Δx│ Vector{$FC}│ 0│ - │ wₖ₋₁│ Vector{$FC}│ 64│ - │ wₖ│ Vector{$FC}│ 64│ - │ M⁻¹vₖ₋₁│ Vector{$FC}│ 64│ - │ M⁻¹vₖ│ Vector{$FC}│ 64│ - │ x│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ vₖ│ Vector{$FC}│ 0│ - │ warm_start│ Bool│ 0│ - └───────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, qmr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────┬─────────────────┐ - │ QmrSolver│Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────┼─────────────────┤ - │ uₖ₋₁│ Vector{$FC}│ 64│ - │ uₖ│ Vector{$FC}│ 64│ - │ q│ Vector{$FC}│ 64│ - │ vₖ₋₁│ Vector{$FC}│ 64│ - │ vₖ│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ wₖ₋₂│ Vector{$FC}│ 64│ - │ wₖ₋₁│ Vector{$FC}│ 64│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, usymlq_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌────────────┬───────────────┬─────────────────┐ - │UsymlqSolver│Precision: $FC │Architecture: CPU│ - ├────────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├────────────┼───────────────┼─────────────────┤ - │ uₖ₋₁│ Vector{$FC}│ 64│ - │ uₖ│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ Δx│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ d̅│ Vector{$FC}│ 64│ - │ vₖ₋₁│ Vector{$FC}│ 32│ - │ vₖ│ Vector{$FC}│ 32│ - │ q│ Vector{$FC}│ 32│ - │ warm_start│ Bool│ 0│ - └────────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, tricg_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌───────────┬───────────────┬─────────────────┐ - │TricgSolver│Precision: $FC │Architecture: CPU│ - ├───────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├───────────┼───────────────┼─────────────────┤ - │ y│ Vector{$FC}│ 64│ - │ N⁻¹uₖ₋₁│ Vector{$FC}│ 64│ - │ N⁻¹uₖ│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ gy₂ₖ₋₁│ Vector{$FC}│ 64│ - │ gy₂ₖ│ Vector{$FC}│ 64│ - │ x│ Vector{$FC}│ 32│ - │ M⁻¹vₖ₋₁│ Vector{$FC}│ 32│ - │ M⁻¹vₖ│ Vector{$FC}│ 32│ - │ q│ Vector{$FC}│ 32│ - │ gx₂ₖ₋₁│ Vector{$FC}│ 32│ - │ gx₂ₖ│ Vector{$FC}│ 32│ - │ Δx│ Vector{$FC}│ 0│ - │ Δy│ Vector{$FC}│ 0│ - │ uₖ│ Vector{$FC}│ 0│ - │ vₖ│ Vector{$FC}│ 0│ - │ warm_start│ Bool│ 0│ - └───────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, trimr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌───────────┬───────────────┬─────────────────┐ - │TrimrSolver│Precision: $FC │Architecture: CPU│ - ├───────────┼───────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├───────────┼───────────────┼─────────────────┤ - │ y│ Vector{$FC}│ 64│ - │ N⁻¹uₖ₋₁│ Vector{$FC}│ 64│ - │ N⁻¹uₖ│ Vector{$FC}│ 64│ - │ p│ Vector{$FC}│ 64│ - │ gy₂ₖ₋₃│ Vector{$FC}│ 64│ - │ gy₂ₖ₋₂│ Vector{$FC}│ 64│ - │ gy₂ₖ₋₁│ Vector{$FC}│ 64│ - │ gy₂ₖ│ Vector{$FC}│ 64│ - │ x│ Vector{$FC}│ 32│ - │ M⁻¹vₖ₋₁│ Vector{$FC}│ 32│ - │ M⁻¹vₖ│ Vector{$FC}│ 32│ - │ q│ Vector{$FC}│ 32│ - │ gx₂ₖ₋₃│ Vector{$FC}│ 32│ - │ gx₂ₖ₋₂│ Vector{$FC}│ 32│ - │ gx₂ₖ₋₁│ Vector{$FC}│ 32│ - │ gx₂ₖ│ Vector{$FC}│ 32│ - │ Δx│ Vector{$FC}│ 0│ - │ Δy│ Vector{$FC}│ 0│ - │ uₖ│ Vector{$FC}│ 0│ - │ vₖ│ Vector{$FC}│ 0│ - │ warm_start│ Bool│ 0│ - └───────────┴───────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) - - io = IOBuffer() - show(io, gpmr_solver, show_stats=false) - showed = String(take!(io)) - expected = """ - ┌──────────┬───────────────────┬─────────────────┐ - │GpmrSolver│ Precision: $FC │Architecture: CPU│ - ├──────────┼───────────────────┼─────────────────┤ - │ Attribute│ Type│ Size│ - ├──────────┼───────────────────┼─────────────────┤ - │ wA│ Vector{$FC}│ 0│ - │ wB│ Vector{$FC}│ 0│ - │ dA│ Vector{$FC}│ 64│ - │ dB│ Vector{$FC}│ 32│ - │ Δx│ Vector{$FC}│ 0│ - │ Δy│ Vector{$FC}│ 0│ - │ x│ Vector{$FC}│ 64│ - │ y│ Vector{$FC}│ 32│ - │ q│ Vector{$FC}│ 0│ - │ p│ Vector{$FC}│ 0│ - │ V│Vector{Vector{$FC}}│ 10 x 64│ - │ U│Vector{Vector{$FC}}│ 10 x 32│ - │ gs│ Vector{$FC}│ 40│ - │ gc│ Vector{$T}│ 40│ - │ zt│ Vector{$FC}│ 20│ - │ R│ Vector{$FC}│ 210│ - │warm_start│ Bool│ 0│ - └──────────┴───────────────────┴─────────────────┘ - """ - @test reduce(replace, [" " => "", "\n" => "", "─" => ""], init=showed) == reduce(replace, [" " => "", "\n" => "", "─" => ""], init=expected) end @testset "solvers" begin