Skip to content

Commit 727c2c1

Browse files
amontoisongdalle
andauthored
Improve the decompression for acyclic coloring (#54)
* Improve the decompression for acyclic coloring * Coherent naming * Upper --------- Co-authored-by: Guillaume Dalle <22795598+gdalle@users.noreply.github.com>
1 parent ac12b9a commit 727c2c1

1 file changed

Lines changed: 13 additions & 15 deletions

File tree

src/decompression.jl

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,38 +97,36 @@ function decompress_aux!(
9797
B::AbstractMatrix{R},
9898
result::AbstractColoringResult{:symmetric,:column,:substitution},
9999
) where {R<:Real}
100-
# build T such that T * upper_nonzeros(A) = B and invert the linear system
101-
# only consider the upper triangle of A because of symmetry
100+
# build T such that T * strict_upper_nonzeros(A) = B
101+
# and solve a linear least-squares problem
102+
# only consider the strict upper triangle of A because of symmetry
102103
# TODO: make more efficient
103104
A .= zero(R)
104105
S = sparse(get_matrix(result))
105106
color = column_colors(result)
106107

107108
n = checksquare(S)
108-
upper_nonzero_inds = Tuple{Int,Int}[]
109+
strict_upper_nonzero_inds = Tuple{Int,Int}[]
109110
I, J, _ = findnz(S)
110111
for (i, j) in zip(I, J)
111-
i >= j && push!(upper_nonzero_inds, (i, j))
112+
(i < j) && push!(strict_upper_nonzero_inds, (i, j))
113+
(i == j) && (A[i, i] = B[i, color[i]])
112114
end
113115

114-
T = spzeros(float(R), length(B), length(upper_nonzero_inds))
115-
for (l, (i, j)) in enumerate(upper_nonzero_inds)
116+
T = spzeros(float(R), length(B), length(strict_upper_nonzero_inds))
117+
for (l, (i, j)) in enumerate(strict_upper_nonzero_inds)
116118
ci = color[i]
117119
cj = color[j]
118120
ki = (ci - 1) * n + j # A[i, j] appears in B[j, ci]
119121
kj = (cj - 1) * n + i # A[i, j] appears in B[i, cj]
120122
T[ki, l] = one(float(R))
121-
if i != j
122-
T[kj, l] = one(float(R))
123-
end
123+
T[kj, l] = one(float(R))
124124
end
125125

126-
upper_nonzeros_A = T \ vec(B)
127-
for (l, (i, j)) in enumerate(upper_nonzero_inds)
128-
A[i, j] = upper_nonzeros_A[l]
129-
if i != j
130-
A[j, i] = upper_nonzeros_A[l]
131-
end
126+
strict_upper_nonzeros_A = T \ vec(B)
127+
for (l, (i, j)) in enumerate(strict_upper_nonzero_inds)
128+
A[i, j] = strict_upper_nonzeros_A[l]
129+
A[j, i] = strict_upper_nonzeros_A[l]
132130
end
133131
return A
134132
end

0 commit comments

Comments
 (0)