Benchmark on MatrixDepot matrices

using RandomLinearAlgebraSolvers, Random, LinearAlgebra, SparseArrays
Random.seed!(1234)
MersenneTwister(1234)

We use here MatrixDepot a collection of 49 matrices (some are scalable).

using MatrixDepot

Benchmark of methods to solve Ax = b with b = A * xref.

using DataFrames, Printf, SolverBenchmark, Stopping
N = 40 # number of problems
matrix_problems = mdlist(builtin(1:N))
param = 50

Names of solvers:

names = [:RandomizedKaczmarz, :RandomizedBlockKaczmarz, :RandomizedCD]
3-element Vector{Symbol}:
 :RandomizedKaczmarz
 :RandomizedBlockKaczmarz
 :RandomizedCD
#Initialization of the DataFrame for n problems.
stats = Dict(name => DataFrame(
         :id     => 1:N,
         :nvar   => zeros(Int64, N),
         :status => [:Unknown for i = 1:N],
         :time   => NaN*ones(N),
         :iter   => zeros(Int64, N),
         :score  => NaN*ones(N)) for name in names)
Dict{Symbol, DataFrames.DataFrame} with 3 entries:
  :RandomizedBlockKaczmarz => 40×6 DataFrame…
  :RandomizedCD            => 40×6 DataFrame…
  :RandomizedKaczmarz      => 40×6 DataFrame…
for i=1:N

  A = matrixdepot(matrix_problems[i], param)
  m, n = size(A)
  xref = 100 * rand(n)
  b = A * xref

  x0 = zeros(size(A,2))
  la_stop = RLAStopping(A, b, max_iter = 100000, rtol = sqrt(eps()), atol = sqrt(eps()))
  for name in names

    #solve the problem
    reinit!(la_stop, rstate = true, x = x0, res = similar(b))
    la_stop.meta.start_time = time()
    @time eval(name)(la_stop, r = 80, is_zero_start=true)
    sol = la_stop.current_state.x

    #update the stats from the Stopping
    stats[name].nvar[i]   = n
    stats[name].status[i] = status(la_stop)
    stop_has_time = (la_stop.current_state.current_time != nothing)
    stats[name].time[i]   =  stop_has_time ? la_stop.current_state.current_time - la_stop.meta.start_time : time() - la_stop.meta.start_time
    stats[name].iter[i]   = la_stop.meta.nb_of_stop
    stats[name].score[i]  = norm(la_stop.current_state.current_score, Inf)

  end

end
for name in names
    @show name
    @show stats[name]
end
name = :RandomizedKaczmarz
stats[name] = 40×6 DataFrame
 Row │ id     nvar   status   time     iter   score
     │ Int64  Int64  Symbol   Float64  Int64  Float64
─────┼────────────────────────────────────────────────
   1 │     1      0  Unknown      NaN      0      NaN
   2 │     2      0  Unknown      NaN      0      NaN
   3 │     3      0  Unknown      NaN      0      NaN
   4 │     4      0  Unknown      NaN      0      NaN
   5 │     5      0  Unknown      NaN      0      NaN
   6 │     6      0  Unknown      NaN      0      NaN
   7 │     7      0  Unknown      NaN      0      NaN
   8 │     8      0  Unknown      NaN      0      NaN
   9 │     9      0  Unknown      NaN      0      NaN
  10 │    10      0  Unknown      NaN      0      NaN
  11 │    11      0  Unknown      NaN      0      NaN
  12 │    12      0  Unknown      NaN      0      NaN
  13 │    13      0  Unknown      NaN      0      NaN
  14 │    14      0  Unknown      NaN      0      NaN
  15 │    15      0  Unknown      NaN      0      NaN
  16 │    16      0  Unknown      NaN      0      NaN
  17 │    17      0  Unknown      NaN      0      NaN
  18 │    18      0  Unknown      NaN      0      NaN
  19 │    19      0  Unknown      NaN      0      NaN
  20 │    20      0  Unknown      NaN      0      NaN
  21 │    21      0  Unknown      NaN      0      NaN
  22 │    22      0  Unknown      NaN      0      NaN
  23 │    23      0  Unknown      NaN      0      NaN
  24 │    24      0  Unknown      NaN      0      NaN
  25 │    25      0  Unknown      NaN      0      NaN
  26 │    26      0  Unknown      NaN      0      NaN
  27 │    27      0  Unknown      NaN      0      NaN
  28 │    28      0  Unknown      NaN      0      NaN
  29 │    29      0  Unknown      NaN      0      NaN
  30 │    30      0  Unknown      NaN      0      NaN
  31 │    31      0  Unknown      NaN      0      NaN
  32 │    32      0  Unknown      NaN      0      NaN
  33 │    33      0  Unknown      NaN      0      NaN
  34 │    34      0  Unknown      NaN      0      NaN
  35 │    35      0  Unknown      NaN      0      NaN
  36 │    36      0  Unknown      NaN      0      NaN
  37 │    37      0  Unknown      NaN      0      NaN
  38 │    38      0  Unknown      NaN      0      NaN
  39 │    39      0  Unknown      NaN      0      NaN
  40 │    40      0  Unknown      NaN      0      NaN
name = :RandomizedBlockKaczmarz
stats[name] = 40×6 DataFrame
 Row │ id     nvar   status   time     iter   score
     │ Int64  Int64  Symbol   Float64  Int64  Float64
─────┼────────────────────────────────────────────────
   1 │     1      0  Unknown      NaN      0      NaN
   2 │     2      0  Unknown      NaN      0      NaN
   3 │     3      0  Unknown      NaN      0      NaN
   4 │     4      0  Unknown      NaN      0      NaN
   5 │     5      0  Unknown      NaN      0      NaN
   6 │     6      0  Unknown      NaN      0      NaN
   7 │     7      0  Unknown      NaN      0      NaN
   8 │     8      0  Unknown      NaN      0      NaN
   9 │     9      0  Unknown      NaN      0      NaN
  10 │    10      0  Unknown      NaN      0      NaN
  11 │    11      0  Unknown      NaN      0      NaN
  12 │    12      0  Unknown      NaN      0      NaN
  13 │    13      0  Unknown      NaN      0      NaN
  14 │    14      0  Unknown      NaN      0      NaN
  15 │    15      0  Unknown      NaN      0      NaN
  16 │    16      0  Unknown      NaN      0      NaN
  17 │    17      0  Unknown      NaN      0      NaN
  18 │    18      0  Unknown      NaN      0      NaN
  19 │    19      0  Unknown      NaN      0      NaN
  20 │    20      0  Unknown      NaN      0      NaN
  21 │    21      0  Unknown      NaN      0      NaN
  22 │    22      0  Unknown      NaN      0      NaN
  23 │    23      0  Unknown      NaN      0      NaN
  24 │    24      0  Unknown      NaN      0      NaN
  25 │    25      0  Unknown      NaN      0      NaN
  26 │    26      0  Unknown      NaN      0      NaN
  27 │    27      0  Unknown      NaN      0      NaN
  28 │    28      0  Unknown      NaN      0      NaN
  29 │    29      0  Unknown      NaN      0      NaN
  30 │    30      0  Unknown      NaN      0      NaN
  31 │    31      0  Unknown      NaN      0      NaN
  32 │    32      0  Unknown      NaN      0      NaN
  33 │    33      0  Unknown      NaN      0      NaN
  34 │    34      0  Unknown      NaN      0      NaN
  35 │    35      0  Unknown      NaN      0      NaN
  36 │    36      0  Unknown      NaN      0      NaN
  37 │    37      0  Unknown      NaN      0      NaN
  38 │    38      0  Unknown      NaN      0      NaN
  39 │    39      0  Unknown      NaN      0      NaN
  40 │    40      0  Unknown      NaN      0      NaN
name = :RandomizedCD
stats[name] = 40×6 DataFrame
 Row │ id     nvar   status   time     iter   score
     │ Int64  Int64  Symbol   Float64  Int64  Float64
─────┼────────────────────────────────────────────────
   1 │     1      0  Unknown      NaN      0      NaN
   2 │     2      0  Unknown      NaN      0      NaN
   3 │     3      0  Unknown      NaN      0      NaN
   4 │     4      0  Unknown      NaN      0      NaN
   5 │     5      0  Unknown      NaN      0      NaN
   6 │     6      0  Unknown      NaN      0      NaN
   7 │     7      0  Unknown      NaN      0      NaN
   8 │     8      0  Unknown      NaN      0      NaN
   9 │     9      0  Unknown      NaN      0      NaN
  10 │    10      0  Unknown      NaN      0      NaN
  11 │    11      0  Unknown      NaN      0      NaN
  12 │    12      0  Unknown      NaN      0      NaN
  13 │    13      0  Unknown      NaN      0      NaN
  14 │    14      0  Unknown      NaN      0      NaN
  15 │    15      0  Unknown      NaN      0      NaN
  16 │    16      0  Unknown      NaN      0      NaN
  17 │    17      0  Unknown      NaN      0      NaN
  18 │    18      0  Unknown      NaN      0      NaN
  19 │    19      0  Unknown      NaN      0      NaN
  20 │    20      0  Unknown      NaN      0      NaN
  21 │    21      0  Unknown      NaN      0      NaN
  22 │    22      0  Unknown      NaN      0      NaN
  23 │    23      0  Unknown      NaN      0      NaN
  24 │    24      0  Unknown      NaN      0      NaN
  25 │    25      0  Unknown      NaN      0      NaN
  26 │    26      0  Unknown      NaN      0      NaN
  27 │    27      0  Unknown      NaN      0      NaN
  28 │    28      0  Unknown      NaN      0      NaN
  29 │    29      0  Unknown      NaN      0      NaN
  30 │    30      0  Unknown      NaN      0      NaN
  31 │    31      0  Unknown      NaN      0      NaN
  32 │    32      0  Unknown      NaN      0      NaN
  33 │    33      0  Unknown      NaN      0      NaN
  34 │    34      0  Unknown      NaN      0      NaN
  35 │    35      0  Unknown      NaN      0      NaN
  36 │    36      0  Unknown      NaN      0      NaN
  37 │    37      0  Unknown      NaN      0      NaN
  38 │    38      0  Unknown      NaN      0      NaN
  39 │    39      0  Unknown      NaN      0      NaN
  40 │    40      0  Unknown      NaN      0      NaN

or run a performance profile:

using Plots
gr()
cost(df) = (df.status .!= :Optimal) * Inf + df.time
p = performance_profile(stats, cost)