From 1f24c273fac7771223585a3baae7f6c5e083a8b3 Mon Sep 17 00:00:00 2001 From: Guillaume Dalle <22795598+gdalle@users.noreply.github.com> Date: Tue, 4 Jun 2024 18:03:48 +0200 Subject: [PATCH 1/2] Compare against ColPack --- test/Project.toml | 1 + test/colpack.jl | 44 ++++++++++++++++++++++++++++++++++++++++++++ test/runtests.jl | 3 +++ 3 files changed, 48 insertions(+) create mode 100644 test/colpack.jl diff --git a/test/Project.toml b/test/Project.toml index c685ee33..ba68dbd4 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -2,6 +2,7 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" Chairmarks = "0ca39b1e-fe0b-4e98-acfc-b1656634c4de" +ColPack = "ffa27691-3a59-46ab-a8d4-551f45b8d401" Compat = "34da2185-b29b-5c13-b0c7-acf172513d20" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" diff --git a/test/colpack.jl b/test/colpack.jl new file mode 100644 index 00000000..b2657a38 --- /dev/null +++ b/test/colpack.jl @@ -0,0 +1,44 @@ +using Chairmarks +using ColPack: ColPack +using LinearAlgebra +using SparseMatrixColorings +using SparseMatrixColorings: NaturalOrder +using SparseArrays +using StableRNGs +using Test + +rng = StableRNG(63) + +function my_symmetric_coloring(H) + return symmetric_coloring(H, GreedyColoringAlgorithm(NaturalOrder())) +end + +function colpack_symmetric_coloring(H) + method = ColPack.star_coloring() + ordering = ColPack.natural_ordering() + coloring = ColPack.ColPackColoring(H, method, ordering) + return ColPack.get_colors(coloring) +end + +n_values = floor.(Int, 10 .^ (1:5)) +p_values(n) = (2:5:min(n, 30)) ./ n + +@testset verbose = true "Star coloring" begin + @testset "Correctness" begin + @testset "n=$n - p=$p" for n in n_values, p in p_values(n) + H = sparse(Symmetric(sprand(rng, n, n, p))) + color1 = my_symmetric_coloring(H) + color2 = colpack_symmetric_coloring(H) + @test color1 == color2 + end + end + @testset "Performance" begin + @testset "n=$n - p=$p" for n in n_values, p in p_values(n) + bench1 = @be sparse(Symmetric(sprand(rng, n, n, p))) my_symmetric_coloring + bench2 = @be sparse(Symmetric(sprand(rng, n, n, p))) colpack_symmetric_coloring + time1 = minimum(bench1).time + time2 = minimum(bench2).time + @test time2 > time1 + end + end +end; diff --git a/test/runtests.jl b/test/runtests.jl index 79d8e0c3..b68924b1 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -54,6 +54,9 @@ include("reference/figures.jl") end end @testset verbose = true "Comparison" begin + @testset "ColPack.jl" begin + include("colpack.jl") + end @testset "SuiteSparse" begin include("suitesparse.jl") end From f684475811cbcdb766d487d37d533a9dfc951f21 Mon Sep 17 00:00:00 2001 From: Guillaume Dalle <22795598+gdalle@users.noreply.github.com> Date: Tue, 4 Jun 2024 18:13:17 +0200 Subject: [PATCH 2/2] Only test correctness --- test/Project.toml | 3 +++ test/colpack.jl | 56 ++++++++++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index ba68dbd4..26b0a255 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -13,3 +13,6 @@ MatrixDepot = "b51810bb-c9f3-55da-ae3c-350fc1fbce05" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[compat] +ColPack = "0.4" \ No newline at end of file diff --git a/test/colpack.jl b/test/colpack.jl index b2657a38..c1ba3a8c 100644 --- a/test/colpack.jl +++ b/test/colpack.jl @@ -1,5 +1,4 @@ -using Chairmarks -using ColPack: ColPack +using ColPack: ColPack, ColPackColoring using LinearAlgebra using SparseMatrixColorings using SparseMatrixColorings: NaturalOrder @@ -9,36 +8,53 @@ using Test rng = StableRNG(63) -function my_symmetric_coloring(H) - return symmetric_coloring(H, GreedyColoringAlgorithm(NaturalOrder())) +my_column_coloring(J) = column_coloring(J, GreedyColoringAlgorithm(NaturalOrder())) +my_row_coloring(J) = row_coloring(J, GreedyColoringAlgorithm(NaturalOrder())) +my_symmetric_coloring(H) = symmetric_coloring(H, GreedyColoringAlgorithm(NaturalOrder())) + +function colpack_column_coloring(J) + A = ColPack.matrix2adjmatrix(J; partition_by_rows=false) + coloring = ColPackColoring(A, ColPack.d1_coloring(), ColPack.natural_ordering()) + return ColPack.get_colors(coloring) +end + +function colpack_row_coloring(J) + A = ColPack.matrix2adjmatrix(J; partition_by_rows=true) + coloring = ColPackColoring(A, ColPack.d1_coloring(), ColPack.natural_ordering()) + return ColPack.get_colors(coloring) end function colpack_symmetric_coloring(H) - method = ColPack.star_coloring() - ordering = ColPack.natural_ordering() - coloring = ColPack.ColPackColoring(H, method, ordering) + coloring = ColPackColoring(H, ColPack.star_coloring(), ColPack.natural_ordering()) return ColPack.get_colors(coloring) end -n_values = floor.(Int, 10 .^ (1:5)) -p_values(n) = (2:5:min(n, 30)) ./ n +n_values = floor.(Int, 10 .^ (1:3)) +p_values(n) = (2:4:min(n, 20)) ./ n -@testset verbose = true "Star coloring" begin - @testset "Correctness" begin +@testset verbose = true "Correctness" begin + @testset "Column coloring" begin @testset "n=$n - p=$p" for n in n_values, p in p_values(n) - H = sparse(Symmetric(sprand(rng, n, n, p))) - color1 = my_symmetric_coloring(H) - color2 = colpack_symmetric_coloring(H) + J = sprand(rng, n, n + 1, p) + color1 = my_column_coloring(J) + color2 = colpack_column_coloring(J) @test color1 == color2 end end - @testset "Performance" begin + @testset "Row coloring" begin @testset "n=$n - p=$p" for n in n_values, p in p_values(n) - bench1 = @be sparse(Symmetric(sprand(rng, n, n, p))) my_symmetric_coloring - bench2 = @be sparse(Symmetric(sprand(rng, n, n, p))) colpack_symmetric_coloring - time1 = minimum(bench1).time - time2 = minimum(bench2).time - @test time2 > time1 + J = sprand(rng, n, n + 1, p) + color1 = my_row_coloring(J) + color2 = colpack_row_coloring(J) + @test color1 == color2 + end + end + @testset "Symmetric coloring" begin + @testset "n=$n - p=$p" for n in n_values, p in p_values(n) + H = sparse(Symmetric(sprand(rng, n, n, p))) + color1 = my_symmetric_coloring(H) + color2 = colpack_symmetric_coloring(H) + @test color1 == color2 end end end;