Path: blob/devel/elmergrid/src/metis-5.1.0/libmetis/stat.c
3206 views
/*1* Copyright 1997, Regents of the University of Minnesota2*3* stat.c4*5* This file computes various statistics6*7* Started 7/25/978* George9*10* $Id: stat.c 9942 2011-05-17 22:09:52Z karypis $11*12*/1314#include "metislib.h"151617/*************************************************************************18* This function computes cuts and balance information19**************************************************************************/20void ComputePartitionInfoBipartite(graph_t *graph, idx_t nparts, idx_t *where)21{22idx_t i, j, k, nvtxs, ncon, mustfree=0;23idx_t *xadj, *adjncy, *vwgt, *vsize, *adjwgt, *kpwgts, *tmpptr;24idx_t *padjncy, *padjwgt, *padjcut;2526nvtxs = graph->nvtxs;27ncon = graph->ncon;28xadj = graph->xadj;29adjncy = graph->adjncy;30vwgt = graph->vwgt;31vsize = graph->vsize;32adjwgt = graph->adjwgt;3334if (vwgt == NULL) {35vwgt = graph->vwgt = ismalloc(nvtxs, 1, "vwgt");36mustfree = 1;37}38if (adjwgt == NULL) {39adjwgt = graph->adjwgt = ismalloc(xadj[nvtxs], 1, "adjwgt");40mustfree += 2;41}4243printf("%"PRIDX"-way Cut: %5"PRIDX", Vol: %5"PRIDX", ", nparts, ComputeCut(graph, where), ComputeVolume(graph, where));4445/* Compute balance information */46kpwgts = ismalloc(ncon*nparts, 0, "ComputePartitionInfo: kpwgts");4748for (i=0; i<nvtxs; i++) {49for (j=0; j<ncon; j++)50kpwgts[where[i]*ncon+j] += vwgt[i*ncon+j];51}5253if (ncon == 1) {54printf("\tBalance: %5.3"PRREAL" out of %5.3"PRREAL"\n",551.0*nparts*kpwgts[iargmax(nparts, kpwgts)]/(1.0*isum(nparts, kpwgts, 1)),561.0*nparts*vwgt[iargmax(nvtxs, vwgt)]/(1.0*isum(nparts, kpwgts, 1)));57}58else {59printf("\tBalance:");60for (j=0; j<ncon; j++)61printf(" (%5.3"PRREAL" out of %5.3"PRREAL")",621.0*nparts*kpwgts[ncon*iargmax_strd(nparts, kpwgts+j, ncon)+j]/(1.0*isum(nparts, kpwgts+j, ncon)),631.0*nparts*vwgt[ncon*iargmax_strd(nvtxs, vwgt+j, ncon)+j]/(1.0*isum(nparts, kpwgts+j, ncon)));64printf("\n");65}666768/* Compute p-adjncy information */69padjncy = ismalloc(nparts*nparts, 0, "ComputePartitionInfo: padjncy");70padjwgt = ismalloc(nparts*nparts, 0, "ComputePartitionInfo: padjwgt");71padjcut = ismalloc(nparts*nparts, 0, "ComputePartitionInfo: padjwgt");7273iset(nparts, 0, kpwgts);74for (i=0; i<nvtxs; i++) {75for (j=xadj[i]; j<xadj[i+1]; j++) {76if (where[i] != where[adjncy[j]]) {77padjncy[where[i]*nparts+where[adjncy[j]]] = 1;78padjcut[where[i]*nparts+where[adjncy[j]]] += adjwgt[j];79if (kpwgts[where[adjncy[j]]] == 0) {80padjwgt[where[i]*nparts+where[adjncy[j]]] += vsize[i];81kpwgts[where[adjncy[j]]] = 1;82}83}84}85for (j=xadj[i]; j<xadj[i+1]; j++)86kpwgts[where[adjncy[j]]] = 0;87}8889for (i=0; i<nparts; i++)90kpwgts[i] = isum(nparts, padjncy+i*nparts, 1);91printf("Min/Max/Avg/Bal # of adjacent subdomains: %5"PRIDX" %5"PRIDX" %5"PRIDX" %7.3"PRREAL"\n",92kpwgts[iargmin(nparts, kpwgts)], kpwgts[iargmax(nparts, kpwgts)], isum(nparts, kpwgts, 1)/nparts,931.0*nparts*kpwgts[iargmax(nparts, kpwgts)]/(1.0*isum(nparts, kpwgts, 1)));9495for (i=0; i<nparts; i++)96kpwgts[i] = isum(nparts, padjcut+i*nparts, 1);97printf("Min/Max/Avg/Bal # of adjacent subdomain cuts: %5"PRIDX" %5"PRIDX" %5"PRIDX" %7.3"PRREAL"\n",98kpwgts[iargmin(nparts, kpwgts)], kpwgts[iargmax(nparts, kpwgts)], isum(nparts, kpwgts, 1)/nparts,991.0*nparts*kpwgts[iargmax(nparts, kpwgts)]/(1.0*isum(nparts, kpwgts, 1)));100101for (i=0; i<nparts; i++)102kpwgts[i] = isum(nparts, padjwgt+i*nparts, 1);103printf("Min/Max/Avg/Bal/Frac # of interface nodes: %5"PRIDX" %5"PRIDX" %5"PRIDX" %7.3"PRREAL" %7.3"PRREAL"\n",104kpwgts[iargmin(nparts, kpwgts)], kpwgts[iargmax(nparts, kpwgts)], isum(nparts, kpwgts, 1)/nparts,1051.0*nparts*kpwgts[iargmax(nparts, kpwgts)]/(1.0*isum(nparts, kpwgts, 1)), 1.0*isum(nparts, kpwgts, 1)/(1.0*nvtxs));106107108if (mustfree == 1 || mustfree == 3) {109gk_free((void **)&vwgt, LTERM);110graph->vwgt = NULL;111}112if (mustfree == 2 || mustfree == 3) {113gk_free((void **)&adjwgt, LTERM);114graph->adjwgt = NULL;115}116117gk_free((void **)&kpwgts, &padjncy, &padjwgt, &padjcut, LTERM);118}119120121/*************************************************************************122* This function computes the balance of the partitioning123**************************************************************************/124void ComputePartitionBalance(graph_t *graph, idx_t nparts, idx_t *where, real_t *ubvec)125{126idx_t i, j, nvtxs, ncon;127idx_t *kpwgts, *vwgt;128real_t balance;129130nvtxs = graph->nvtxs;131ncon = graph->ncon;132vwgt = graph->vwgt;133134kpwgts = ismalloc(nparts, 0, "ComputePartitionInfo: kpwgts");135136if (vwgt == NULL) {137for (i=0; i<nvtxs; i++)138kpwgts[where[i]]++;139ubvec[0] = 1.0*nparts*kpwgts[iargmax(nparts, kpwgts)]/(1.0*nvtxs);140}141else {142for (j=0; j<ncon; j++) {143iset(nparts, 0, kpwgts);144for (i=0; i<graph->nvtxs; i++)145kpwgts[where[i]] += vwgt[i*ncon+j];146147ubvec[j] = 1.0*nparts*kpwgts[iargmax(nparts, kpwgts)]/(1.0*isum(nparts, kpwgts, 1));148}149}150151gk_free((void **)&kpwgts, LTERM);152153}154155156/*************************************************************************157* This function computes the balance of the element partitioning158**************************************************************************/159real_t ComputeElementBalance(idx_t ne, idx_t nparts, idx_t *where)160{161idx_t i;162idx_t *kpwgts;163real_t balance;164165kpwgts = ismalloc(nparts, 0, "ComputeElementBalance: kpwgts");166167for (i=0; i<ne; i++)168kpwgts[where[i]]++;169170balance = 1.0*nparts*kpwgts[iargmax(nparts, kpwgts)]/(1.0*isum(nparts, kpwgts, 1));171172gk_free((void **)&kpwgts, LTERM);173174return balance;175176}177178179180181