23 int i, j, k, nvtxs, ncon, mustfree=0;
24 idxtype *xadj, *adjncy, *vwgt, *adjwgt, *kpwgts, *tmpptr;
25 idxtype *padjncy, *padjwgt, *padjcut;
46 kpwgts =
idxsmalloc(ncon*nparts, 0,
"ComputePartitionInfo: kpwgts");
48 for (i=0; i<nvtxs; i++) {
49 for (j=0; j<ncon; j++)
50 kpwgts[where[i]*ncon+j] += vwgt[i*ncon+j];
54 printf(
"\tBalance: %5.3f out of %5.3f\n",
55 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)),
56 1.0*nparts*vwgt[
idxamax(nvtxs, vwgt)]/(1.0*
idxsum(nparts, kpwgts)));
60 for (j=0; j<ncon; j++)
61 printf(
" (%5.3f out of %5.3f)",
69 padjncy =
idxsmalloc(nparts*nparts, 0,
"ComputePartitionInfo: padjncy");
70 padjwgt =
idxsmalloc(nparts*nparts, 0,
"ComputePartitionInfo: padjwgt");
71 padjcut =
idxsmalloc(nparts*nparts, 0,
"ComputePartitionInfo: padjwgt");
74 for (i=0; i<nvtxs; i++) {
75 for (j=xadj[i]; j<xadj[i+1]; j++) {
76 if (where[i] != where[adjncy[j]]) {
77 padjncy[where[i]*nparts+where[adjncy[j]]] = 1;
78 padjcut[where[i]*nparts+where[adjncy[j]]] += adjwgt[j];
79 if (kpwgts[where[adjncy[j]]] == 0) {
80 padjwgt[where[i]*nparts+where[adjncy[j]]]++;
81 kpwgts[where[adjncy[j]]] = 1;
85 for (j=xadj[i]; j<xadj[i+1]; j++)
86 kpwgts[where[adjncy[j]]] = 0;
89 for (i=0; i<nparts; i++)
90 kpwgts[i] =
idxsum(nparts, padjncy+i*nparts);
91 printf(
"Min/Max/Avg/Bal # of adjacent subdomains: %5d %5d %5.2f %7.3f\n",
93 1.0*
idxsum(nparts, kpwgts)/(1.0*nparts),
94 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)));
96 for (i=0; i<nparts; i++)
97 kpwgts[i] =
idxsum(nparts, padjcut+i*nparts);
98 printf(
"Min/Max/Avg/Bal # of adjacent subdomain cuts: %5d %5d %5d %7.3f\n",
100 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)));
102 for (i=0; i<nparts; i++)
103 kpwgts[i] =
idxsum(nparts, padjwgt+i*nparts);
104 printf(
"Min/Max/Avg/Bal/Frac # of interface nodes: %5d %5d %5d %7.3f %7.3f\n",
105 kpwgts[
idxamin(nparts, kpwgts)], kpwgts[
idxamax(nparts, kpwgts)],
idxsum(nparts, kpwgts)/nparts,
106 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)), 1.0*
idxsum(nparts, kpwgts)/(1.0*nvtxs));
108 tmpptr = graph->
where;
109 graph->
where = where;
110 for (i=0; i<nparts; i++)
112 graph->
where = tmpptr;
114 if (mustfree == 1 || mustfree == 3) {
118 if (mustfree == 2 || mustfree == 3) {
123 GKfree(&kpwgts, &padjncy, &padjwgt, &padjcut,
LTERM);
132 int i, j, k, nvtxs, ncon, mustfree=0;
133 idxtype *xadj, *adjncy, *vwgt, *vsize, *adjwgt, *kpwgts, *tmpptr;
134 idxtype *padjncy, *padjwgt, *padjcut;
136 nvtxs = graph->
nvtxs;
141 vsize = graph->
vsize;
148 if (adjwgt == NULL) {
156 kpwgts =
idxsmalloc(ncon*nparts, 0,
"ComputePartitionInfo: kpwgts");
158 for (i=0; i<nvtxs; i++) {
159 for (j=0; j<ncon; j++)
160 kpwgts[where[i]*ncon+j] += vwgt[i*ncon+j];
164 printf(
"\tBalance: %5.3f out of %5.3f\n",
165 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)),
166 1.0*nparts*vwgt[
idxamax(nvtxs, vwgt)]/(1.0*
idxsum(nparts, kpwgts)));
169 printf(
"\tBalance:");
170 for (j=0; j<ncon; j++)
171 printf(
" (%5.3f out of %5.3f)",
179 padjncy =
idxsmalloc(nparts*nparts, 0,
"ComputePartitionInfo: padjncy");
180 padjwgt =
idxsmalloc(nparts*nparts, 0,
"ComputePartitionInfo: padjwgt");
181 padjcut =
idxsmalloc(nparts*nparts, 0,
"ComputePartitionInfo: padjwgt");
183 idxset(nparts, 0, kpwgts);
184 for (i=0; i<nvtxs; i++) {
185 for (j=xadj[i]; j<xadj[i+1]; j++) {
186 if (where[i] != where[adjncy[j]]) {
187 padjncy[where[i]*nparts+where[adjncy[j]]] = 1;
188 padjcut[where[i]*nparts+where[adjncy[j]]] += adjwgt[j];
189 if (kpwgts[where[adjncy[j]]] == 0) {
190 padjwgt[where[i]*nparts+where[adjncy[j]]] += vsize[i];
191 kpwgts[where[adjncy[j]]] = 1;
195 for (j=xadj[i]; j<xadj[i+1]; j++)
196 kpwgts[where[adjncy[j]]] = 0;
199 for (i=0; i<nparts; i++)
200 kpwgts[i] =
idxsum(nparts, padjncy+i*nparts);
201 printf(
"Min/Max/Avg/Bal # of adjacent subdomains: %5d %5d %5d %7.3f\n",
202 kpwgts[
idxamin(nparts, kpwgts)], kpwgts[
idxamax(nparts, kpwgts)],
idxsum(nparts, kpwgts)/nparts,
203 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)));
205 for (i=0; i<nparts; i++)
206 kpwgts[i] =
idxsum(nparts, padjcut+i*nparts);
207 printf(
"Min/Max/Avg/Bal # of adjacent subdomain cuts: %5d %5d %5d %7.3f\n",
208 kpwgts[
idxamin(nparts, kpwgts)], kpwgts[
idxamax(nparts, kpwgts)],
idxsum(nparts, kpwgts)/nparts,
209 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)));
211 for (i=0; i<nparts; i++)
212 kpwgts[i] =
idxsum(nparts, padjwgt+i*nparts);
213 printf(
"Min/Max/Avg/Bal/Frac # of interface nodes: %5d %5d %5d %7.3f %7.3f\n",
214 kpwgts[
idxamin(nparts, kpwgts)], kpwgts[
idxamax(nparts, kpwgts)],
idxsum(nparts, kpwgts)/nparts,
215 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts)), 1.0*
idxsum(nparts, kpwgts)/(1.0*nvtxs));
218 if (mustfree == 1 || mustfree == 3) {
222 if (mustfree == 2 || mustfree == 3) {
227 GKfree(&kpwgts, &padjncy, &padjwgt, &padjcut,
LTERM);
237 int i, j, nvtxs, ncon;
241 nvtxs = graph->
nvtxs;
245 kpwgts =
idxsmalloc(nparts, 0,
"ComputePartitionInfo: kpwgts");
248 for (i=0; i<nvtxs; i++)
250 ubvec[0] = 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*nvtxs);
253 for (j=0; j<ncon; j++) {
254 idxset(nparts, 0, kpwgts);
255 for (i=0; i<graph->
nvtxs; i++)
256 kpwgts[where[i]] += vwgt[i*ncon+j];
258 ubvec[j] = 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts));
276 kpwgts =
idxsmalloc(nparts, 0,
"ComputeElementBalance: kpwgts");
281 balance = 1.0*nparts*kpwgts[
idxamax(nparts, kpwgts)]/(1.0*
idxsum(nparts, kpwgts));
#define ComputeElementBalance
#define ComputePartitionBalance
#define ComputePartitionInfo
void ComputePartitionInfoBipartite(GraphType *, int, idxtype *)
#define IsConnectedSubdomain
void GKfree(void **ptr1,...)