Skip to content

Commit 7052532

Browse files
committed
Update of agentic cpu example
1 parent cb95955 commit 7052532

File tree

3 files changed

+50
-11
lines changed

3 files changed

+50
-11
lines changed

examples/agentic/generate-cpu-linear-solver/benchmark.jl renamed to examples/agentic/generate-cpu-linear-solver/benchmark1.jl

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # rea
1818
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # reenable iterative refinement (2 is UMFPACK default max iterative refinement steps)
1919

2020
solvers = OrderedDict(
21-
"Default" => (A, b) -> (A \ b),
22-
"UMFPACK" => (A, b) -> lu(A; control = umfpack_control) \ b,
23-
"Generated" => (A, b) -> proposed_fn(A, b)
21+
"UMFPACK (Baseline Direct Solve)" => (A, b) -> (A \ b),
22+
"UMFPACK + Iterative Refinement" => (A, b) -> lu(A; control = umfpack_control) \ b,
23+
"SmartSolve-Generated Solver" => (A, b) -> proposed_fn(A, b)
2424
)
2525

2626
# Store results for plotting
@@ -52,7 +52,7 @@ for sparsity in sparsity_levels
5252
try
5353
bench = @benchmark begin
5454
x = $(solver_fn)($A, $b_bench)
55-
end seconds = 5 samples = 10
55+
end
5656

5757
time_ms = median(bench.times) / 1e9 # Convert to s
5858

@@ -67,20 +67,22 @@ for sparsity in sparsity_levels
6767
println(" Error during benchmark: $e")
6868
end
6969
end
70+
71+
GC.gc()
7072
end
7173

7274
# Create error-vs-time plot
7375
p = plot(
7476
size=(800, 800),
7577
#legend=:topright,
76-
legend=:bottomleft,
78+
legend=:topleft,
7779
xlabel="Time (s)",
7880
ylabel="Relative residual: ||Ax - b||₂ / ||b||₂",
7981
# xscale=:log10,
8082
yscale=:log10,
8183
guidefontsize=22,#18,
8284
tickfontsize=20, #16,
83-
legendfontsize=18, #14,
85+
legendfontsize=14, #14,
8486
margin=5*Plots.mm,
8587
framestyle=:box,
8688
title="Random Matrices of Size $(N)x$(N),\n Varying Sparsity Levels (ρ) and\n CPU Solvers",
@@ -92,10 +94,10 @@ p = plot(
9294
## Sparsity shapes
9395
marker_map_sparsity = OrderedDict(0.1=>:circle, 0.5=>:square, 0.9=>:utriangle)
9496
## Solver color shades
95-
color_map_solver = OrderedDict("Default"=>:red, "UMFPACK"=>:blue, "Generated"=>:green)
97+
colors = [:red, :blue, :green]
9698

9799
# Plot each point individually so marker shape shows sparsity and color shows solver.
98-
for solver_name in keys(solvers)
100+
for (i, solver_name) in enumerate(keys(solvers))
99101
for sparsity in sparsity_levels
100102
if sparsity in keys(results) && solver_name in keys(results[sparsity])
101103
t = results[sparsity][solver_name].time
@@ -104,7 +106,7 @@ for solver_name in keys(solvers)
104106
label="",
105107
marker=marker_map_sparsity[sparsity],
106108
markersize=15,
107-
color=color_map_solver[solver_name],
109+
color=colors[i],
108110
markerstrokecolor=:black,
109111
markerstrokewidth=0.0,#0.8,
110112
alpha=0.45)
@@ -113,13 +115,13 @@ for solver_name in keys(solvers)
113115
end
114116

115117
# Create a combined legend
116-
for solver_name in keys(solvers)
118+
for (i, solver_name) in enumerate(keys(solvers))
117119
for s in sparsity_levels
118120
lbl = "$(solver_name), ρ:$(s)"
119121
scatter!(p, [NaN], [NaN]; label=lbl,
120122
marker=marker_map_sparsity[s],
121123
markersize=15,
122-
color=color_map_solver[solver_name],
124+
color=colors[i],
123125
markerstrokecolor=:black,
124126
markerstrokewidth=0.0,
125127
alpha=0.45)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using LinearAlgebra
2+
using SparseArrays
3+
using BenchmarkTools
4+
5+
include("solver.jl")
6+
7+
N = 15_000
8+
A = sprand(N, N, 0.5)
9+
b = rand(N)
10+
11+
# See https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#LinearAlgebra.lu
12+
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # read Julia default configuration for a Float64 sparse matrix
13+
#SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # optional - display values
14+
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # reenable iterative refinement (2 is UMFPACK default max iterative refinement steps)
15+
16+
# warm-up
17+
x1 = A \ b # solve Ax = b
18+
x2 = lu(A; control = umfpack_control) \ b # solve Ax = b, including UMFPACK iterative refinement
19+
x3 = proposed_fn(A, b)
20+
21+
@benchmark begin
22+
x = $A \ $b # solve Ax = b
23+
end
24+
25+
@benchmark begin
26+
x = lu($A; control = $umfpack_control) \ $b # solve Ax = b, including UMFPACK iterative refinement
27+
end
28+
29+
@benchmark begin
30+
x = proposed_fn($A, $b)
31+
end
32+
33+
error1 = norm(A*x1 - b) / norm(b)
34+
35+
error2 = norm(A*x2 - b) / norm(b)
36+
37+
error3 = norm(A*x3 - b) / norm(b)
20.2 KB
Binary file not shown.

0 commit comments

Comments
 (0)