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)