Skip to content

Commit 4dc9e6e

Browse files
authored
Allocation-free decompression in all cases (#76)
1 parent baf5240 commit 4dc9e6e

2 files changed

Lines changed: 22 additions & 17 deletions

File tree

src/decompression.jl

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,13 @@ function decompress_aux!(
203203
A .= zero(R)
204204
S = get_matrix(result)
205205
color = column_colors(result)
206-
for j in axes(A, 2)
207-
cj = color[j]
208-
rows_j = (!iszero).(view(S, :, j))
209-
Aj = view(A, rows_j, j)
210-
Bj = view(B, rows_j, cj)
211-
copyto!(Aj, Bj)
206+
rvS = rowvals(S)
207+
for j in axes(S, 2)
208+
for k in nzrange(S, j)
209+
i = rvS[k]
210+
cj = color[j]
211+
A[i, j] = B[i, cj]
212+
end
212213
end
213214
return A
214215
end
@@ -219,12 +220,13 @@ function decompress_aux!(
219220
A .= zero(R)
220221
S = get_matrix(result)
221222
color = row_colors(result)
222-
for i in axes(A, 1)
223-
ci = color[i]
224-
cols_i = (!iszero).(view(S, i, :))
225-
Ai = view(A, i, cols_i)
226-
Bi = view(B, ci, cols_i)
227-
copyto!(Ai, Bi)
223+
rvS = rowvals(S)
224+
for j in axes(S, 2)
225+
for k in nzrange(S, j)
226+
i = rvS[k]
227+
ci = color[i]
228+
A[i, j] = B[ci, j]
229+
end
228230
end
229231
return A
230232
end
@@ -259,10 +261,13 @@ function decompress_aux!(
259261
A .= zero(R)
260262
S = get_matrix(result)
261263
color = column_colors(result)
262-
for ij in findall(!iszero, S)
263-
i, j = Tuple(ij)
264-
k, l = symmetric_coefficient(i, j, color, result.star_set)
265-
A[i, j] = B[k, l]
264+
rvS = rowvals(S)
265+
for j in axes(S, 2)
266+
for k in nzrange(S, j)
267+
i = rvS[k]
268+
k, c = symmetric_coefficient(i, j, color, result.star_set)
269+
A[i, j] = B[k, c]
270+
end
266271
end
267272
return A
268273
end

test/performance.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function test_noallocs_sparse_decompression(
8080
bench1 = @be respectful_similar(A) decompress!(_, B, result) evals = 1
8181
@test minimum(bench1).allocs == 0
8282
bench2 = @be similar(Matrix(A)) decompress!(_, B, result) evals = 1
83-
@test_skip minimum(bench2).allocs == 0
83+
@test minimum(bench2).allocs == 0
8484
end
8585
end
8686

0 commit comments

Comments
 (0)