void MMDOrder(ctrl_t *ctrl, graph_t *graph, idx_t *order, idx_t lastvtx) { idx_t i, j, k, nvtxs, nofsub, firstvtx; idx_t *xadj, *adjncy, *label; idx_t *perm, *iperm, *head, *qsize, *list, *marker; WCOREPUSH; nvtxs = graph->nvtxs; xadj = graph->xadj; adjncy = graph->adjncy; /* Relabel the vertices so that it starts from 1 */ k = xadj[nvtxs]; for (i=0; i<k; i++) adjncy[i]++; for (i=0; i<nvtxs+1; i++) xadj[i]++; perm = iwspacemalloc(ctrl, nvtxs+5); iperm = iwspacemalloc(ctrl, nvtxs+5); head = iwspacemalloc(ctrl, nvtxs+5); qsize = iwspacemalloc(ctrl, nvtxs+5); list = iwspacemalloc(ctrl, nvtxs+5); marker = iwspacemalloc(ctrl, nvtxs+5); genmmd(nvtxs, xadj, adjncy, iperm, perm, 1, head, qsize, list, marker, IDX_MAX, &nofsub); label = graph->label; firstvtx = lastvtx-nvtxs; for (i=0; i<nvtxs; i++) order[label[i]] = firstvtx+iperm[i]-1; /* Relabel the vertices so that it starts from 0 */ for (i=0; i<nvtxs+1; i++) xadj[i]--; k = xadj[nvtxs]; for (i=0; i<k; i++) adjncy[i]--; WCOREPOP; }
/*--------------------------------------*/ void reorder_mmd(csr_t *A, int *perm) { int *iperm,mxint,n,*ia,*ja; /*------------------------------------------*/ n = A->n; ia = A->ia; ja = A->ja; mxint = (1<<(8*sizeof(int)-2)); Malloc(iperm, n, int); int delta,*head,*qsize,*Nlist,*marker,nzout; delta = 1; Malloc(head, n, int); Malloc(qsize, n, int); Malloc(Nlist, n, int); Malloc(marker, n, int); genmmd(n, ia, ja, perm, iperm, delta, head, qsize, Nlist, marker, mxint, &nzout); free(iperm); free(head); free(qsize); free(Nlist); free(marker); }
/************************************************************************* * This function uses MMD to order the graph. The vertices are numbered * from lastvtx downwards **************************************************************************/ void MMDOrder(CtrlType *ctrl, GraphType *graph, idxtype *order, int lastvtx) { int i, j, k, nvtxs, nofsub, firstvtx; idxtype *xadj, *adjncy, *label; idxtype *perm, *iperm, *head, *qsize, *list, *marker; nvtxs = graph->nvtxs; xadj = graph->xadj; adjncy = graph->adjncy; /* Relabel the vertices so that it starts from 1 */ k = xadj[nvtxs]; for (i=0; i<k; i++) adjncy[i]++; for (i=0; i<nvtxs+1; i++) xadj[i]++; perm = idxmalloc(6*(nvtxs+5), "MMDOrder: perm"); iperm = perm + nvtxs + 5; head = iperm + nvtxs + 5; qsize = head + nvtxs + 5; list = qsize + nvtxs + 5; marker = list + nvtxs + 5; genmmd(nvtxs, xadj, adjncy, iperm, perm, 1, head, qsize, list, marker, MAXIDX, &nofsub); label = graph->label; firstvtx = lastvtx-nvtxs; for (i=0; i<nvtxs; i++) order[label[i]] = firstvtx+iperm[i]-1; free(perm); /* Relabel the vertices so that it starts from 0 */ for (i=0; i<nvtxs+1; i++) xadj[i]--; k = xadj[nvtxs]; for (i=0; i<k; i++) adjncy[i]--; }