Skip to content

Improve graph structure a little bit#114

Merged
gdalle merged 9 commits intomainfrom
gd/newgraph
Sep 26, 2024
Merged

Improve graph structure a little bit#114
gdalle merged 9 commits intomainfrom
gd/newgraph

Conversation

@gdalle
Copy link
Copy Markdown
Member

@gdalle gdalle commented Sep 26, 2024

  • Store size information in the Graph structure
  • Define nb_vertices and nb_edges in lieu of length and nnz to avoid confusion
  • Redefine transpose_graph(::AbstractMatrix) from Manual graph transposition #107 as Base.transpose(::Graph)
  • Use a simpler implementation which does just one allocation too many (a new vector of nzval), instead of a custom handwritten loop (at least I think so)
  • Add better transposition tests

@gdalle gdalle changed the title Improve transposition a little bit Improve graph structure a little bit Sep 26, 2024
@codecov
Copy link
Copy Markdown

codecov Bot commented Sep 26, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (1abd62e) to head (19eb0e4).
Report is 2 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main      #114   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           10         9    -1     
  Lines          764       770    +6     
=========================================
+ Hits           764       770    +6     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Comment thread src/graph.jl
"""
function Base.transpose(g::Graph{loops,T}) where {loops,T}
S = SparseMatrixCSC{T,T}(g.m, g.n, g.colptr, g.rowval, g.rowval)
Sᵀ = convert(SparseMatrixCSC, transpose(S)) # TODO: use ftranspose! without segfault?
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@amontoison my initial idea was to use ftranspose! as follows:

new_colptr = Vector{T}(undef, g.m + 1)
new_rowval = similar(g.rowval) 
Sᵀ = SparseMatrixCSC{T,T}(g.n, g.m, new_colptr, new_rowval, g.rowval)
ftranspose!(Sᵀ, S, identity)

This would avoid any non-necessary allocation, but unfortunately it causes segfaults. Presumably because Sᵀ and S share their vector of nzval, which I thought wouldn't be a problem but it is.

@gdalle gdalle added the benchmark Run benchmarks on PR label Sep 26, 2024
@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

main 19eb0e4... main/19eb0e45483c5d...
coloring/nonsymmetric/column/direct/n=1000/p=0.002 0.0877 ± 0.0041 ms 0.0925 ± 0.0045 ms 0.948
coloring/nonsymmetric/column/direct/n=1000/p=0.005 0.192 ± 0.0081 ms 0.199 ± 0.0085 ms 0.966
coloring/nonsymmetric/column/direct/n=1000/p=0.01 0.404 ± 0.014 ms 0.408 ± 0.014 ms 0.989
coloring/nonsymmetric/column/direct/n=100000/p=0.0001 0.0784 ± 0.0059 s 0.0764 ± 0.0049 s 1.03
coloring/nonsymmetric/column/direct/n=100000/p=2.0e-5 13.9 ± 0.26 ms 14.1 ± 0.37 ms 0.986
coloring/nonsymmetric/column/direct/n=100000/p=5.0e-5 0.0336 ± 0.0009 s 0.0333 ± 0.00076 s 1.01
coloring/nonsymmetric/row/direct/n=1000/p=0.002 0.102 ± 0.0048 ms 0.108 ± 0.0052 ms 0.945
coloring/nonsymmetric/row/direct/n=1000/p=0.005 0.217 ± 0.0087 ms 0.225 ± 0.0096 ms 0.966
coloring/nonsymmetric/row/direct/n=1000/p=0.01 0.449 ± 0.015 ms 0.457 ± 0.015 ms 0.984
coloring/nonsymmetric/row/direct/n=100000/p=0.0001 0.0861 ± 0.0042 s 0.0886 ± 0.0033 s 0.972
coloring/nonsymmetric/row/direct/n=100000/p=2.0e-5 16.2 ± 0.25 ms 16.5 ± 0.46 ms 0.98
coloring/nonsymmetric/row/direct/n=100000/p=5.0e-5 0.0372 ± 0.00076 s 0.0373 ± 0.00081 s 0.997
coloring/symmetric/column/direct/n=1000/p=0.002 0.268 ± 0.014 ms 0.277 ± 0.015 ms 0.969
coloring/symmetric/column/direct/n=1000/p=0.005 0.727 ± 0.028 ms 0.745 ± 0.028 ms 0.975
coloring/symmetric/column/direct/n=1000/p=0.01 1.76 ± 0.054 ms 1.81 ± 0.053 ms 0.973
coloring/symmetric/column/direct/n=100000/p=0.0001 0.422 ± 0.029 s 0.441 ± 0.036 s 0.959
coloring/symmetric/column/direct/n=100000/p=2.0e-5 0.0381 ± 0.0012 s 0.0381 ± 0.0015 s 1
coloring/symmetric/column/direct/n=100000/p=5.0e-5 0.134 ± 0.0063 s 0.128 ± 0.0067 s 1.05
coloring/symmetric/column/substitution/n=1000/p=0.002 0.616 ± 0.032 ms 0.623 ± 0.031 ms 0.989
coloring/symmetric/column/substitution/n=1000/p=0.005 1.6 ± 0.057 ms 1.62 ± 0.06 ms 0.991
coloring/symmetric/column/substitution/n=1000/p=0.01 3.45 ± 0.099 ms 3.49 ± 0.098 ms 0.989
coloring/symmetric/column/substitution/n=100000/p=0.0001 0.835 ± 0.065 s 0.968 ± 0.081 s 0.863
coloring/symmetric/column/substitution/n=100000/p=2.0e-5 0.103 ± 0.013 s 0.108 ± 0.012 s 0.953
coloring/symmetric/column/substitution/n=100000/p=5.0e-5 0.329 ± 0.024 s 0.354 ± 0.045 s 0.93
decompress/nonsymmetric/column/direct/n=1000/p=0.002 4.05 ± 0.36 μs 4.15 ± 0.36 μs 0.976
decompress/nonsymmetric/column/direct/n=1000/p=0.005 8.25 ± 0.66 μs 8.92 ± 0.85 μs 0.924
decompress/nonsymmetric/column/direct/n=1000/p=0.01 19.8 ± 3 μs 19.4 ± 4.6 μs 1.02
decompress/nonsymmetric/column/direct/n=100000/p=0.0001 4.67 ± 0.36 ms 4.81 ± 0.51 ms 0.971
decompress/nonsymmetric/column/direct/n=100000/p=2.0e-5 0.986 ± 0.11 ms 0.963 ± 0.15 ms 1.02
decompress/nonsymmetric/column/direct/n=100000/p=5.0e-5 2.51 ± 0.43 ms 2.32 ± 0.25 ms 1.08
decompress/nonsymmetric/row/direct/n=1000/p=0.002 4.19 ± 0.42 μs 4.24 ± 0.36 μs 0.989
decompress/nonsymmetric/row/direct/n=1000/p=0.005 7.84 ± 0.62 μs 8 ± 0.61 μs 0.981
decompress/nonsymmetric/row/direct/n=1000/p=0.01 17.1 ± 2.4 μs 16 ± 2.2 μs 1.07
decompress/nonsymmetric/row/direct/n=100000/p=0.0001 2.19 ± 1.1 ms 2.21 ± 0.65 ms 0.991
decompress/nonsymmetric/row/direct/n=100000/p=2.0e-5 0.494 ± 0.17 ms 0.496 ± 0.12 ms 0.997
decompress/nonsymmetric/row/direct/n=100000/p=5.0e-5 1.1 ± 0.1 ms 1.05 ± 0.15 ms 1.04
decompress/symmetric/column/direct/n=1000/p=0.002 4.21 ± 0.36 μs 4.44 ± 0.39 μs 0.947
decompress/symmetric/column/direct/n=1000/p=0.005 8.12 ± 0.57 μs 8.82 ± 0.53 μs 0.92
decompress/symmetric/column/direct/n=1000/p=0.01 16.8 ± 2 μs 17.7 ± 1.2 μs 0.946
decompress/symmetric/column/direct/n=100000/p=0.0001 5.11 ± 0.39 ms 4.83 ± 0.36 ms 1.06
decompress/symmetric/column/direct/n=100000/p=2.0e-5 0.966 ± 0.12 ms 0.94 ± 0.067 ms 1.03
decompress/symmetric/column/direct/n=100000/p=5.0e-5 2.47 ± 0.19 ms 2.41 ± 0.71 ms 1.02
decompress/symmetric/column/substitution/n=1000/p=0.002 0.0641 ± 0.0034 ms 0.0635 ± 0.0038 ms 1.01
decompress/symmetric/column/substitution/n=1000/p=0.005 0.16 ± 0.0078 ms 0.16 ± 0.0071 ms 1.01
decompress/symmetric/column/substitution/n=1000/p=0.01 0.342 ± 0.014 ms 0.341 ± 0.013 ms 1
decompress/symmetric/column/substitution/n=100000/p=0.0001 0.0974 ± 0.0047 s 0.084 ± 0.0036 s 1.16
decompress/symmetric/column/substitution/n=100000/p=2.0e-5 14.1 ± 0.8 ms 12.8 ± 0.72 ms 1.11
decompress/symmetric/column/substitution/n=100000/p=5.0e-5 0.037 ± 0.0052 s 30.5 ± 1.9 ms 1.21
time_to_load 0.225 ± 0.0027 s 0.219 ± 0.0023 s 1.03

@gdalle gdalle merged commit 939c9df into main Sep 26, 2024
@gdalle gdalle deleted the gd/newgraph branch September 26, 2024 19:41
@amontoison
Copy link
Copy Markdown
Collaborator

@gdalle Please wait that I have a have a look before merging...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

benchmark Run benchmarks on PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants