/* * Copyright 1997, Regents of the University of Minnesota * * compress.c * * This file contains code for compressing nodes with identical adjacency * structure and for prunning dense columns * * Started 9/17/97 * George */ #include /************************************************************************* * This function compresses a graph by merging identical vertices * The compression should lead to at least 10% reduction. **************************************************************************/ void CompressGraph(CtrlType *ctrl, GraphType *graph, idxtype nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *cptr, idxtype *cind) { idxtype i, ii, iii, j, jj, k, l, cnvtxs, cnedges; idxtype *cxadj, *cadjncy, *cvwgt, *mark, *map; KeyValueType *keys; mark = idxsmalloc(nvtxs, -1, "CompressGraph: mark"); map = idxsmalloc(nvtxs, -1, "CompressGraph: map"); keys = (KeyValueType *)gk_malloc(nvtxs*sizeof(KeyValueType), "CompressGraph: keys"); /* Compute a key for each adjacency list */ for (i=0; i= COMPRESSION_FRACTION*nvtxs) { graph->nvtxs = nvtxs; graph->nedges = xadj[nvtxs]; graph->ncon = 1; graph->xadj = xadj; graph->free_xadj = 0; graph->adjncy = adjncy; graph->free_adjncy = 0; graph->vwgt = idxmalloc(nvtxs, "CompressGraph: vwgt"); graph->adjwgtsum = idxmalloc(nvtxs, "CompressGraph: adjwgtsum"); graph->cmap = idxmalloc(nvtxs, "CompressGraph: cmap"); graph->adjwgt = idxmalloc(graph->nedges, "CompressGraph: adjwgt"); idxset(nvtxs, 1, graph->vwgt); idxset(graph->nedges, 1, graph->adjwgt); for (i=0; iadjwgtsum[i] = xadj[i+1]-xadj[i]; graph->label = idxmalloc(nvtxs, "CompressGraph: label"); for (i=0; ilabel[i] = i; } else { /* Ok, form the compressed graph */ cnedges = 0; for (i=0; ixadj = idxmalloc(cnvtxs+1, "CompressGraph: xadj"); cvwgt = graph->vwgt = idxmalloc(cnvtxs, "CompressGraph: vwgt"); graph->adjwgtsum = idxmalloc(cnvtxs, "CompressGraph: adjwgtsum"); graph->cmap = idxmalloc(cnvtxs, "CompressGraph: cmap"); cadjncy = graph->adjncy = idxmalloc(cnedges, "CompressGraph: adjncy"); graph->adjwgt = idxmalloc(cnedges, "CompressGraph: adjwgt"); /* Now go and compress the graph */ idxset(nvtxs, -1, mark); l = cxadj[0] = 0; for (i=0; invtxs = cnvtxs; graph->nedges = l; graph->ncon = 1; idxset(graph->nedges, 1, graph->adjwgt); for (i=0; iadjwgtsum[i] = cxadj[i+1]-cxadj[i]; graph->label = idxmalloc(cnvtxs, "CompressGraph: label"); for (i=0; ilabel[i] = i; } gk_free((void **)&keys, &map, &mark, LTERM); } /************************************************************************* * This function prunes all the vertices in a graph with degree greater * than factor*average **************************************************************************/ void PruneGraph(CtrlType *ctrl, GraphType *graph, idxtype nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *iperm, float factor) { idxtype i, j, k, l, nlarge, pnvtxs, pnedges; idxtype *pxadj, *padjncy, *padjwgt; idxtype *perm; perm = idxmalloc(nvtxs, "PruneGraph: perm"); factor = factor*xadj[nvtxs]/nvtxs; pnvtxs = pnedges = nlarge = 0; for (i=0; invtxs = nvtxs; graph->nedges = xadj[nvtxs]; graph->ncon = 1; graph->xadj = xadj; graph->free_xadj = 0; graph->adjncy = adjncy; graph->free_adjncy = 0; graph->vwgt = idxmalloc(nvtxs, "PruneGraph: vwgt"); graph->adjwgtsum = idxmalloc(nvtxs, "PruneGraph: adjwgtsum"); graph->cmap = idxmalloc(nvtxs, "PruneGraph: cmap"); graph->adjwgt = idxmalloc(graph->nedges, "PruneGraph: adjwgt"); idxset(nvtxs, 1, graph->vwgt); idxset(graph->nedges, 1, graph->adjwgt); for (i=0; iadjwgtsum[i] = xadj[i+1]-xadj[i]; graph->label = idxmalloc(nvtxs, "CompressGraph: label"); for (i=0; ilabel[i] = i; } else { /* Prune the graph */ /* Allocate memory for the prunned graph*/ pxadj = graph->xadj = idxmalloc(pnvtxs+1, "PruneGraph: xadj"); graph->vwgt = idxmalloc(pnvtxs, "PruneGraph: vwgt"); graph->adjwgtsum = idxmalloc(pnvtxs, "PruneGraph: adjwgtsum"); graph->cmap = idxmalloc(pnvtxs, "PruneGraph: cmap"); padjncy = graph->adjncy = idxmalloc(pnedges, "PruneGraph: adjncy"); graph->adjwgt = idxmalloc(pnedges, "PruneGraph: adjwgt"); pxadj[0] = pnedges = l = 0; for (i=0; invtxs = pnvtxs; graph->nedges = pnedges; graph->ncon = 1; idxset(pnvtxs, 1, graph->vwgt); idxset(pnedges, 1, graph->adjwgt); for (i=0; iadjwgtsum[i] = pxadj[i+1]-pxadj[i]; graph->label = idxmalloc(pnvtxs, "CompressGraph: label"); for (i=0; ilabel[i] = i; } gk_free((void **)&perm, LTERM); }