@@ -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
134132end
0 commit comments