69{
PORD_INT *xadj, *adjncy, *vwght, *vtype, *color, *cwght;
70 PORD_INT nvtx, err, u, v, i, istart, istop, nBdom, nWdom;
82 printf(
"checking separator of domain decomposition (S %d, B %d, W %d)\n",
85 checkS = checkB = checkW = 0;
86 for (u = 0; u < nvtx; u++)
92 for (i = istart; i < istop; i++)
94 if (color[v] ==
BLACK) nBdom++;
95 if (color[v] ==
WHITE) nWdom++;
100 if ((nBdom == 0) || (nWdom == 0))
101 printf(
"WARNING: multisec %d belongs to S, but nBdom = %d and "
102 "nWdom = %d\n", u, nBdom, nWdom);
107 { printf(
"ERROR: black multisec %d adjacent to white domain\n", u);
114 { printf(
"ERROR: white multisec %d adjacent to black domain\n", u);
119 printf(
"ERROR: multisec %d has unrecognized color %d\n", u,
129 checkB += vwght[u];
break;
131 checkW += vwght[u];
break;
133 printf(
"ERROR: domain %d has unrecognized color %d\n", u, color[u]);
138 if ((checkS != cwght[
GRAY]) || (checkB != cwght[
BLACK])
139 || (checkW != cwght[
WHITE]))
140 { printf(
"ERROR in partitioning: checkS %d (S %d), checkB %d (B %d), "
141 "checkW %d (W %d)\n", checkS, cwght[
GRAY], checkB, cwght[
BLACK],
142 checkW, cwght[
WHITE]);
153{
PORD_INT *xadj, *adjncy, *vtype, *level, *queue;
154 PORD_INT nvtx, qhead, qtail, nlev, lastdomain, u, v, i, istart, istop;
170 nlev = 0; lastdomain = domain;
172 {
for (u = 0; u < nvtx; u++)
174 queue[0] = domain; level[domain] = 0;
175 qhead = 0; qtail = 1;
176 while (qhead != qtail)
177 { u = queue[qhead++];
182 for (i = istart; i < istop; i++)
185 { queue[qtail++] = v;
186 level[v] = level[u] + 1;
190 if (level[lastdomain] > nlev)
191 { nlev = level[lastdomain];
200 free(level); free(queue);
209{
PORD_INT *xadj, *adjncy, *vwght, *vtype, *color, *cwght;
210 PORD_INT *queue, *deltaS, *deltaB, *deltaW;
211 PORD_INT nvtx, bestvalue, weight, qhead, qtail, qopt, q, dS, dB, dW;
212 PORD_INT u, v, w, i, istart, istop, j, jstart, jstop;
241 for (u = 0; u < nvtx; u++)
242 { deltaS[u] = deltaB[u] = deltaW[u] = 0;
244 deltaW[u] = xadj[u+1] - xadj[u];
252 qhead = 0; qtail = 1;
254 while ((cwght[
BLACK] < cwght[
WHITE]) && (qhead != qtail))
261 for (q = qhead; q < qtail; q++)
264 { dB = vwght[u]; dW = -dB; dS = 0;
267 for (i = istart; i < istop; i++)
270 if (color[v] ==
WHITE)
271 { dW -= weight; dS += weight; }
272 else if (deltaW[v] == 1)
273 { dB += weight; dS -= weight; }
275 deltaS[u] = dS; deltaB[u] = dB; deltaW[u] = dW;
278 if (cwght[
GRAY] + deltaS[u] < bestvalue)
279 { bestvalue = cwght[
GRAY] + deltaS[u];
288 swap(queue[qopt], queue[qhead], v);
291 cwght[
GRAY] += deltaS[u];
292 cwght[
BLACK] += deltaB[u];
293 cwght[
WHITE] += deltaW[u];
302 for (i = istart; i < istop; i++)
304 deltaB[v]++; deltaW[v]--;
307 else if (deltaB[v] == 1)
311 for (j = jstart; j < jstop; j++)
314 { queue[qtail++] = w;
317 else if (vtype[w] == -2)
321 else if (deltaW[v] == 1)
324 for (j = jstart; j < jstop; j++)
336 for (i = 0; i < qtail; i++)
341 free(deltaS); free(deltaB); free(deltaW);
385{
PORD_INT *xadj, *adjncy, *vwght, *vtype;
386 PORD_INT weight, u, v, i, istart, istop, j, jstart, jstop;
393 istart = xadj[domain];
394 istop = xadj[domain+1];
395 for (i = istart; i < istop; i++)
406 { v = -(deltaW[u]+1);
410 printf(
" B2W case (1): (via multisec %d) removing domain %d from "
415 deltaB[v] -= weight; deltaS[v] += weight;
424 { tmp_color[u] =
GRAY;
425 for (j = jstart; j < jstop; j++)
430 printf(
" B2W case (2): (via multisec %d) removing domain %d from "
435 deltaB[v] += weight; deltaS[v] -= weight;
441 if (deltaB[u] < 0) deltaB[u] = 1;
442 deltaB[u]--; deltaW[u]++;
450 {
for (j = jstart; j < jstop; j++)
452 if ((tmp_color[v] ==
BLACK) && (vtype[v] == 1))
455 printf(
" B2W case (3): (via multisec %d) removing domain %d from "
460 deltaW[v] += weight; deltaS[v] -= weight;
472 { tmp_color[u] =
WHITE;
473 for (j = jstart; j < jstop; j++)
478 printf(
" B2W case (4): (via multisec %d) removing domain %d from "
483 deltaW[v] -= weight; deltaS[v] += weight;
497{
PORD_INT *xadj, *adjncy, *vwght, *vtype;
498 PORD_INT weight, u, v, i, istart, istop, j, jstart, jstop;
505 istart = xadj[domain];
506 istop = xadj[domain+1];
507 for (i = istart; i < istop; i++)
518 { v = -(deltaB[u]+1);
522 printf(
" W2B case (1): (via multisec %d) removing domain %d from "
527 deltaW[v] -= weight; deltaS[v] += weight;
536 { tmp_color[u] =
GRAY;
537 for (j = jstart; j < jstop; j++)
542 printf(
" W2B case (2): (via multisec %d) removing domain %d from "
547 deltaW[v] += weight; deltaS[v] -= weight;
553 if (deltaW[u] < 0) deltaW[u] = 1;
554 deltaB[u]++; deltaW[u]--;
562 {
for (j = jstart; j < jstop; j++)
564 if ((tmp_color[v] ==
WHITE) && (vtype[v] == 1))
567 printf(
" W2B case (3): (via multisec %d) removing domain %d from "
572 deltaB[v] += weight; deltaS[v] -= weight;
584 { tmp_color[u] =
BLACK;
585 for (j = jstart; j < jstop; j++)
590 printf(
" W2B case (4): (via multisec %d) removing domain %d from "
595 deltaB[v] -= weight; deltaS[v] += weight;
609 PORD_INT *xadj, *adjncy, *vwght, *vtype, *color, *cwght;
610 PORD_INT *tmp_color, *deltaS, *deltaB, *deltaW;
611 PORD_INT nvtx, weight, tmp_S, tmp_B, tmp_W;
612 PORD_INT pos, bestglobalpos, badflips, b_domain, w_domain, domain, nxtdomain;
613 PORD_INT fhead, ftail, u, v, i, istart, istop;
614 FLOAT bestglobalvalue, b_value, w_value, value;
643 tmp_B = cwght[
BLACK];
644 tmp_W = cwght[
WHITE];
645 bestglobalpos = badflips = 0;
646 bestglobalvalue =
F(tmp_S, tmp_B, tmp_W);
651 fhead = 0; ftail = -1;
657 for (u = 0; u < nvtx; u++)
659 { deltaB[u] = deltaW[u] = 0;
662 for (i = istart; i < istop; i++)
664 if (color[v] ==
BLACK) deltaB[u]++;
667 if ((deltaB[u] > 0) && (deltaW[u] > 0))
669 else if (deltaB[u] > 0) tmp_color[u] =
BLACK;
670 else tmp_color[u] =
WHITE;
671 color[u] = tmp_color[u];
677 for (u = 0; u < nvtx; u++)
679 { tmp_color[u] = color[u];
680 if (tmp_color[u] ==
BLACK)
681 { deltaW[u] = vwght[u]; deltaB[u] = -deltaW[u]; deltaS[u] = 0;
684 for (i = istart; i < istop; i++)
687 if (tmp_color[v] ==
BLACK)
688 { deltaB[u] -= weight;
691 else if (deltaB[v] == 1)
692 { deltaW[u] += weight;
699 if (tmp_color[u] ==
WHITE)
700 { deltaB[u] = vwght[u]; deltaW[u] = -deltaB[u]; deltaS[u] = 0;
703 for (i = istart; i < istop; i++)
706 if (tmp_color[v] ==
WHITE)
707 { deltaW[u] -= weight;
710 else if (deltaW[v] == 1)
711 { deltaB[u] += weight;
721 printf(
"starting inner loop: b_bucket->nobj %d, w_bucket->nobj %d\n",
732 if ((b_domain =
minBucket(b_bucket)) != -1)
733 { b_value =
F((tmp_S+deltaS[b_domain]), (tmp_B+deltaB[b_domain]),
734 (tmp_W+deltaW[b_domain]));
737 printf(
"best black domain: %d, deltaS %d, deltaB %d, deltaW %d, "
738 "cost %7.2f\n", b_domain, deltaS[b_domain], deltaB[b_domain],
739 deltaW[b_domain], b_value);
742 if ((w_domain =
minBucket(w_bucket)) != -1)
743 { w_value =
F((tmp_S+deltaS[w_domain]), (tmp_B+deltaB[w_domain]),
744 (tmp_W+deltaW[w_domain]));
747 printf(
"best white domain: %d, deltaS %d, deltaB %d, deltaW %d, "
748 "cost %7.2f\n", w_domain, deltaS[w_domain], deltaB[w_domain],
749 deltaW[w_domain], w_value);
753 if ((b_domain ==
ERR) && (w_domain ==
ERR))
goto INNER_LOOP_END;
755 if (b_value +
EPS < w_value)
756 { domain = b_domain; value = b_value;
760 { domain = w_domain; value = w_value;
765 printf(
" domain %d removed from bucket\n", domain);
772 vtype[ftail] = -(domain+1);
773 else fhead = -(domain+1);
777 if (tmp_color[domain] ==
BLACK)
778 { tmp_color[domain] =
WHITE;
779 updateB2W(w_bucket,b_bucket,dd,domain,tmp_color,deltaW,deltaB,deltaS);
781 else if (tmp_color[domain] ==
WHITE)
782 { tmp_color[domain] =
BLACK;
783 updateW2B(w_bucket,b_bucket,dd,domain,tmp_color,deltaW,deltaB,deltaS);
785 tmp_S += deltaS[domain];
786 tmp_B += deltaB[domain];
787 tmp_W += deltaW[domain];
790 if (value +
EPS < bestglobalvalue)
791 { bestglobalvalue = value;
805 while (nxtdomain != 0)
806 { domain = -nxtdomain - 1;
807 if (pos < bestglobalpos)
808 {
if (color[domain] ==
BLACK) color[domain] =
WHITE;
809 else color[domain] =
BLACK;
810 cwght[
GRAY] += deltaS[domain];
811 cwght[
BLACK] += deltaB[domain];
812 cwght[
WHITE] += deltaW[domain];
815 nxtdomain = vtype[domain];
823 printf(
" INNER_LOOP_END (#pyhs. flips %d): S %d, B %d, W %d (%7.2f)\n",
838 if (bestglobalpos > 0)
goto OUTER_LOOP_START;
839 free(tmp_color); free(deltaS); free(deltaB); free(deltaW);