|
29 | 29 | GrB_free(&argmax_v); \
|
30 | 30 | GrB_free(&argmax_p); \
|
31 | 31 | GrB_free(&zero_FP32); \
|
32 |
| - LAGraph_Free((void *)&pi, NULL); \ |
33 |
| - LAGraph_Free((void *)&px, NULL); \ |
34 |
| - LAGraph_Free((void *)&pi_new, NULL); \ |
35 |
| - LAGraph_Free((void *)&px_new, NULL); \ |
36 | 32 | }
|
37 | 33 |
|
38 | 34 | #define LG_FREE_ALL \
|
@@ -73,9 +69,6 @@ int LAGr_MarkovClustering(
|
73 | 69 |
|
74 | 70 | GrB_Scalar zero_FP32 = NULL;
|
75 | 71 |
|
76 |
| - GrB_Index *pi = NULL, *px = NULL; |
77 |
| - GrB_Index *pi_new = NULL, *px_new = NULL; |
78 |
| - |
79 | 72 | //--------------------------------------------------------------------------
|
80 | 73 | // check inputs
|
81 | 74 | //--------------------------------------------------------------------------
|
@@ -106,7 +99,6 @@ int LAGr_MarkovClustering(
|
106 | 99 | GRB_TRY(GrB_Vector_new(&argmax_v, GrB_FP32, n));
|
107 | 100 | GRB_TRY(GrB_Vector_new(&argmax_p, GrB_INT64, n));
|
108 | 101 | GRB_TRY(GrB_Scalar_new(&zero_FP32, GrB_FP32));
|
109 |
| - |
110 | 102 | GRB_TRY(GrB_Scalar_setElement(zero_FP32, 0));
|
111 | 103 |
|
112 | 104 | // Create identity
|
@@ -198,72 +190,22 @@ int LAGr_MarkovClustering(
|
198 | 190 | GRB_TRY(GrB_mxv(argmax_p, NULL, NULL, GxB_MIN_SECONDI_INT64, CC, ones,
|
199 | 191 | GrB_DESC_T0));
|
200 | 192 |
|
201 |
| - // pi := array of argmax_p indices, px := array of argmax_p values |
202 |
| - GrB_Index p_nvals; |
203 |
| - GRB_TRY(GrB_Vector_nvals(&p_nvals, argmax_p)); |
204 |
| - LG_TRY(LAGraph_Malloc((void **)&pi, p_nvals, sizeof(GrB_Index), msg)); |
205 |
| - LG_TRY(LAGraph_Malloc((void **)&px, p_nvals, sizeof(GrB_Index), msg)); |
206 |
| - GRB_TRY(GrB_Vector_extractTuples_INT64(pi, (int64_t *) px, &p_nvals, argmax_p)); |
207 |
| - |
208 | 193 | // Sometimes (particularly, when the pruning threshold is high), some
|
209 | 194 | // columns in the steady-state T have no values, i.e., they are not
|
210 | 195 | // attracted to any vertex. In this case, fill in the missing values with
|
211 | 196 | // the index of the vertex (these vertices will be arbitrarily put in the
|
212 | 197 | // cluster of their index).
|
| 198 | + GrB_Index p_nvals; |
| 199 | + GRB_TRY(GrB_Vector_nvals(&p_nvals, argmax_p)); |
213 | 200 | if (p_nvals < n)
|
214 | 201 | {
|
215 |
| - LG_TRY(LAGraph_Malloc((void **)&pi_new, n, sizeof(GrB_Index), msg)); |
216 |
| - LG_TRY(LAGraph_Malloc((void **)&px_new, n, sizeof(GrB_Index), msg)); |
217 |
| - |
218 |
| - GrB_Index j = 0; |
219 |
| - GrB_Index currentValue = pi[0]; |
220 |
| - |
221 |
| - for (int i = 0; i < p_nvals && j < n; ++i) |
222 |
| - { |
223 |
| - while (currentValue < pi[i] && j < n) |
224 |
| - { |
225 |
| - pi_new[j] = currentValue; |
226 |
| - px_new[j] = currentValue; // Fill skipped px values with their |
227 |
| - // index |
228 |
| - currentValue++; |
229 |
| - j++; |
230 |
| - } |
231 |
| - if (j < n) |
232 |
| - { |
233 |
| - pi_new[j] = pi[i]; |
234 |
| - px_new[j] = px[i]; |
235 |
| - currentValue++; |
236 |
| - j++; |
237 |
| - } |
238 |
| - } |
239 |
| - |
240 |
| - // Handle any skipped values at the end |
241 |
| - while (j < n) |
242 |
| - { |
243 |
| - pi_new[j] = currentValue; |
244 |
| - px_new[j] = currentValue; // Fill remaining px values |
245 |
| - currentValue++; |
246 |
| - j++; |
247 |
| - } |
248 |
| - |
249 |
| - LAGraph_Free((void **)&pi, NULL); |
250 |
| - LAGraph_Free((void **)&px, NULL); |
251 |
| - pi = pi_new; |
252 |
| - px = px_new; |
253 |
| - // Avoid double free |
254 |
| - pi_new = NULL; |
255 |
| - px_new = NULL; |
| 202 | + // argmax_p <!argmax_p> = 0:n-1 |
| 203 | + GRB_TRY (GrB_apply (argmax_p, argmax_p, NULL, GrB_ROWINDEX_INT64, |
| 204 | + ones, 0, GrB_DESC_SC)) ; |
256 | 205 | }
|
257 | 206 |
|
258 |
| - GrB_Vector c = NULL; |
259 |
| - GRB_TRY(GrB_Vector_new(&c, GrB_INT64, n)); |
260 |
| - GRB_TRY(GrB_Vector_build_INT64(c, pi, (int64_t *) px, n, NULL)); |
261 |
| - GrB_Vector_wait(c, GrB_MATERIALIZE); |
262 |
| - |
263 |
| - LAGraph_Free((void *)&pi, NULL); |
264 |
| - LAGraph_Free((void *)&px, NULL); |
265 |
| - |
266 |
| - (*c_f) = c; // Set output vector |
| 207 | + (*c_f) = argmax_p ; // Set output vector |
| 208 | + argmax_p = NULL ; |
267 | 209 |
|
268 | 210 | LG_FREE_WORK;
|
269 | 211 |
|
|
0 commit comments