Cloned library METIS with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

148 lines
4.7 KiB

/*!
\file gklib.c
\brief Functions for printing various statistics for the computed partitionings
and orderings.
\date Started 7/25/1997
\author George
\author Copyright 1997-2009, Regents of the University of Minnesota
\version\verbatim $Id: stat.c 17513 2014-08-05 16:20:50Z dominique $ \endverbatim
*/
#include "metisbin.h"
/****************************************************************************/
/*! This function computes various information associated with a partition */
/****************************************************************************/
void ComputePartitionInfo(params_t *params, graph_t *graph, idx_t *where)
{
idx_t i, ii, j, k, nvtxs, ncon, nparts, tvwgt;
idx_t *xadj, *adjncy, *vwgt, *adjwgt, *kpwgts;
real_t *tpwgts, unbalance;
idx_t pid, ndom, maxndom, minndom, tndom, *pptr, *pind, *pdom;
idx_t ncmps, nover, *cptr, *cind, *cpwgts;
nvtxs = graph->nvtxs;
ncon = graph->ncon;
xadj = graph->xadj;
adjncy = graph->adjncy;
vwgt = graph->vwgt;
adjwgt = graph->adjwgt;
nparts = params->nparts;
tpwgts = params->tpwgts;
/* Compute objective-related information */
printf(" - Edgecut: %"PRIDX", communication volume: %"PRIDX".\n\n",
ComputeCut(graph, where), ComputeVolume(graph, where));
/* Compute constraint-related information */
kpwgts = ismalloc(ncon*nparts, 0, "ComputePartitionInfo: kpwgts");
for (i=0; i<nvtxs; i++) {
for (j=0; j<ncon; j++)
kpwgts[where[i]*ncon+j] += vwgt[i*ncon+j];
}
/* Report on balance */
printf(" - Balance:\n");
for (j=0; j<ncon; j++) {
tvwgt = isum(nparts, kpwgts+j, ncon);
for (k=0, unbalance=1.0*kpwgts[k*ncon+j]/(tpwgts[k*ncon+j]*tvwgt), i=1; i<nparts; i++) {
if (unbalance < 1.0*kpwgts[i*ncon+j]/(tpwgts[i*ncon+j]*tvwgt)) {
unbalance = 1.0*kpwgts[i*ncon+j]/(tpwgts[i*ncon+j]*tvwgt);
k = i;
}
}
printf(" constraint #%"PRIDX": %5.3"PRREAL" out of %5.3"PRREAL"\n",
j, unbalance,
1.0*nparts*vwgt[ncon*iargmax_strd(nvtxs, vwgt+j, ncon)+j]/
(1.0*isum(nparts, kpwgts+j, ncon)));
}
printf("\n");
if (ncon == 1) {
tvwgt = isum(nparts, kpwgts, 1);
for (k=0, unbalance=kpwgts[k]/(tpwgts[k]*tvwgt), i=1; i<nparts; i++) {
if (unbalance < kpwgts[i]/(tpwgts[i]*tvwgt)) {
unbalance = kpwgts[i]/(tpwgts[i]*tvwgt);
k = i;
}
}
printf(" - Most overweight partition:\n"
" pid: %"PRIDX", actual: %"PRIDX", desired: %"PRIDX", ratio: %.2"PRREAL".\n\n",
k, kpwgts[k], (idx_t)(tvwgt*tpwgts[k]), unbalance);
}
gk_free((void **)&kpwgts, LTERM);
/* Compute subdomain adjacency information */
pptr = imalloc(nparts+1, "ComputePartitionInfo: pptr");
pind = imalloc(nvtxs, "ComputePartitionInfo: pind");
pdom = imalloc(nparts, "ComputePartitionInfo: pdom");
iarray2csr(nvtxs, nparts, where, pptr, pind);
maxndom = nparts+1;
minndom = 0;
for (tndom=0, pid=0; pid<nparts; pid++) {
iset(nparts, 0, pdom);
for (ii=pptr[pid]; ii<pptr[pid+1]; ii++) {
i = pind[ii];
for (j=xadj[i]; j<xadj[i+1]; j++)
pdom[where[adjncy[j]]] += adjwgt[j];
}
pdom[pid] = 0;
for (ndom=0, i=0; i<nparts; i++)
ndom += (pdom[i] > 0 ? 1 : 0);
tndom += ndom;
if (pid == 0 || maxndom < ndom)
maxndom = ndom;
if (pid == 0 || minndom > ndom)
minndom = ndom;
}
printf(" - Subdomain connectivity: max: %"PRIDX", min: %"PRIDX", avg: %.2"PRREAL"\n\n",
maxndom, minndom, 1.0*tndom/nparts);
gk_free((void **)&pptr, &pind, &pdom, LTERM);
/* Compute subdomain adjacency information */
cptr = imalloc(nvtxs+1, "ComputePartitionInfo: cptr");
cind = imalloc(nvtxs, "ComputePartitionInfo: cind");
cpwgts = ismalloc(nparts, 0, "ComputePartitionInfo: cpwgts");
ncmps = FindPartitionInducedComponents(graph, where, cptr, cind);
if (ncmps == nparts)
printf(" - Each partition is contiguous.\n");
else {
if (IsConnected(graph, 0)) {
for (nover=0, i=0; i<ncmps; i++) {
cpwgts[where[cind[cptr[i]]]]++;
if (cpwgts[where[cind[cptr[i]]]] == 2)
nover++;
}
printf(" - There are %"PRIDX" non-contiguous partitions.\n"
" Total components after removing the cut edges: %"PRIDX",\n"
" max components: %"PRIDX" for pid: %"PRIDX".\n",
nover, ncmps, imax(nparts, cpwgts,1), (idx_t)iargmax(nparts, cpwgts,1));
}
else {
printf(" - The original graph had %"PRIDX" connected components and the resulting\n"
" partitioning after removing the cut edges has %"PRIDX" components.",
FindPartitionInducedComponents(graph, NULL, NULL, NULL), ncmps);
}
}
gk_free((void **)&cptr, &cind, &cpwgts, LTERM);
}