Path: blob/devel/elmergrid/src/metis-5.1.0/programs/stat.c
3206 views
/*!1\file gklib.c2\brief Functions for printing various statistics for the computed partitionings3and orderings.45\date Started 7/25/19976\author George7\author Copyright 1997-2009, Regents of the University of Minnesota8\version\verbatim $Id: stat.c 10046 2011-06-01 14:13:40Z karypis $ \endverbatim9*/10111213#include "metisbin.h"141516/****************************************************************************/17/*! This function computes various information associated with a partition */18/****************************************************************************/19void ComputePartitionInfo(params_t *params, graph_t *graph, idx_t *where)20{21idx_t i, ii, j, k, nvtxs, ncon, nparts, tvwgt;22idx_t *xadj, *adjncy, *vwgt, *adjwgt, *kpwgts;23real_t *tpwgts, unbalance;24idx_t pid, ndom, maxndom, minndom, tndom, *pptr, *pind, *pdom;25idx_t ncmps, nover, *cptr, *cind, *cpwgts;2627nvtxs = graph->nvtxs;28ncon = graph->ncon;29xadj = graph->xadj;30adjncy = graph->adjncy;31vwgt = graph->vwgt;32adjwgt = graph->adjwgt;3334nparts = params->nparts;35tpwgts = params->tpwgts;3637/* Compute objective-related infomration */38printf(" - Edgecut: %"PRIDX", communication volume: %"PRIDX".\n\n",39ComputeCut(graph, where), ComputeVolume(graph, where));404142/* Compute constraint-related information */43kpwgts = ismalloc(ncon*nparts, 0, "ComputePartitionInfo: kpwgts");4445for (i=0; i<nvtxs; i++) {46for (j=0; j<ncon; j++)47kpwgts[where[i]*ncon+j] += vwgt[i*ncon+j];48}4950/* Report on balance */51printf(" - Balance:\n");52for (j=0; j<ncon; j++) {53tvwgt = isum(nparts, kpwgts+j, ncon);54for (k=0, unbalance=1.0*kpwgts[k*ncon+j]/(tpwgts[k*ncon+j]*tvwgt), i=1; i<nparts; i++) {55if (unbalance < 1.0*kpwgts[i*ncon+j]/(tpwgts[i*ncon+j]*tvwgt)) {56unbalance = 1.0*kpwgts[i*ncon+j]/(tpwgts[i*ncon+j]*tvwgt);57k = i;58}59}60printf(" constraint #%"PRIDX": %5.3"PRREAL" out of %5.3"PRREAL"\n",61j, unbalance,621.0*nparts*vwgt[ncon*iargmax_strd(nvtxs, vwgt+j, ncon)+j]/63(1.0*isum(nparts, kpwgts+j, ncon)));64}65printf("\n");6667if (ncon == 1) {68tvwgt = isum(nparts, kpwgts, 1);69for (k=0, unbalance=kpwgts[k]/(tpwgts[k]*tvwgt), i=1; i<nparts; i++) {70if (unbalance < kpwgts[i]/(tpwgts[i]*tvwgt)) {71unbalance = kpwgts[i]/(tpwgts[i]*tvwgt);72k = i;73}74}7576printf(" - Most overweight partition:\n"77" pid: %"PRIDX", actual: %"PRIDX", desired: %"PRIDX", ratio: %.2"PRREAL".\n\n",78k, kpwgts[k], (idx_t)(tvwgt*tpwgts[k]), unbalance);79}8081gk_free((void **)&kpwgts, LTERM);828384/* Compute subdomain adjacency information */85pptr = imalloc(nparts+1, "ComputePartitionInfo: pptr");86pind = imalloc(nvtxs, "ComputePartitionInfo: pind");87pdom = imalloc(nparts, "ComputePartitionInfo: pdom");8889iarray2csr(nvtxs, nparts, where, pptr, pind);9091maxndom = nparts+1;92minndom = 0;93for (tndom=0, pid=0; pid<nparts; pid++) {94iset(nparts, 0, pdom);95for (ii=pptr[pid]; ii<pptr[pid+1]; ii++) {96i = pind[ii];97for (j=xadj[i]; j<xadj[i+1]; j++)98pdom[where[adjncy[j]]] += adjwgt[j];99}100pdom[pid] = 0;101for (ndom=0, i=0; i<nparts; i++)102ndom += (pdom[i] > 0 ? 1 : 0);103tndom += ndom;104if (pid == 0 || maxndom < ndom)105maxndom = ndom;106if (pid == 0 || minndom > ndom)107minndom = ndom;108}109110printf(" - Subdomain connectivity: max: %"PRIDX", min: %"PRIDX", avg: %.2"PRREAL"\n\n",111maxndom, minndom, 1.0*tndom/nparts);112113gk_free((void **)&pptr, &pind, &pdom, LTERM);114115116/* Compute subdomain adjacency information */117cptr = imalloc(nvtxs+1, "ComputePartitionInfo: cptr");118cind = imalloc(nvtxs, "ComputePartitionInfo: cind");119cpwgts = ismalloc(nparts, 0, "ComputePartitionInfo: cpwgts");120121ncmps = FindPartitionInducedComponents(graph, where, cptr, cind);122if (ncmps == nparts)123printf(" - Each partition is contiguous.\n");124else {125if (IsConnected(graph, 0)) {126for (nover=0, i=0; i<ncmps; i++) {127cpwgts[where[cind[cptr[i]]]]++;128if (cpwgts[where[cind[cptr[i]]]] == 2)129nover++;130}131printf(" - There are %"PRIDX" non-contiguous partitions.\n"132" Total components after removing the cut edges: %"PRIDX",\n"133" max components: %"PRIDX" for pid: %"PRIDX".\n",134nover, ncmps, imax(nparts, cpwgts), (idx_t)iargmax(nparts, cpwgts));135}136else {137printf(" - The original graph had %"PRIDX" connected components and the resulting\n"138" partitioning after removing the cut edges has %"PRIDX" components.",139FindPartitionInducedComponents(graph, NULL, NULL, NULL), ncmps);140}141}142143gk_free((void **)&cptr, &cind, &cpwgts, LTERM);144145}146147148149150