609 PORD_INT *xadj, *adjncy, *vwght, *vtype, *color, *cwght;
610 PORD_INT *tmp_color, *deltaS, *deltaB, *deltaW;
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;
615
616
617
618
619
620
621
622
623
631
636
637OUTER_LOOP_START:
638
639
640
641
643 tmp_B = cwght[
BLACK];
644 tmp_W = cwght[
WHITE];
645 bestglobalpos = badflips = 0;
646 bestglobalvalue =
F(tmp_S, tmp_B, tmp_W);
647
650
651 fhead = 0; ftail = -1;
652 pos = 0;
653
654
655
656
657 for (u = 0; u < nvtx; u++)
658 if (vtype[u] == 2)
659 { deltaB[u] = deltaW[u] = 0;
660 istart = xadj[u];
661 istop = xadj[u+1];
662 for (i = istart; i < istop; i++)
663 { v = adjncy[i];
664 if (color[v] ==
BLACK) deltaB[u]++;
665 else deltaW[u]++;
666 }
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];
672 }
673
674
675
676
677 for (u = 0; u < nvtx; u++)
678 if (vtype[u] == 1)
679 { tmp_color[u] = color[u];
680 if (tmp_color[u] ==
BLACK)
681 { deltaW[u] = vwght[u]; deltaB[u] = -deltaW[u]; deltaS[u] = 0;
682 istart = xadj[u];
683 istop = xadj[u+1];
684 for (i = istart; i < istop; i++)
685 { v = adjncy[i];
687 if (tmp_color[v] ==
BLACK)
690 }
691 else if (deltaB[v] == 1)
694 deltaB[v] = -(u+1);
695 }
696 }
698 }
699 if (tmp_color[u] ==
WHITE)
700 { deltaB[u] = vwght[u]; deltaW[u] = -deltaB[u]; deltaS[u] = 0;
701 istart = xadj[u];
702 istop = xadj[u+1];
703 for (i = istart; i < istop; i++)
704 { v = adjncy[i];
706 if (tmp_color[v] ==
WHITE)
709 }
710 else if (deltaW[v] == 1)
713 deltaW[v] = -(u+1);
714 }
715 }
717 }
718 }
719
720#ifdef DEBUG
721 printf("starting inner loop: b_bucket->nobj %d, w_bucket->nobj %d\n",
724#endif
725
726INNER_LOOP_START:
727
728
729
730
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]));
735
736#ifdef DEBUG
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);
740#endif
741 }
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]));
745
746#ifdef DEBUG
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);
750#endif
751 }
752
753 if ((b_domain ==
ERR) && (w_domain ==
ERR))
goto INNER_LOOP_END;
754
755 if (b_value +
EPS < w_value)
756 { domain = b_domain; value = b_value;
758 }
759 else
760 { domain = w_domain; value = w_value;
762 }
763
764#ifdef DEBUG
765 printf(" domain %d removed from bucket\n", domain);
766#endif
767
768
769
770
771 if (ftail != -1)
772 vtype[ftail] = -(domain+1);
773 else fhead = -(domain+1);
774 vtype[domain] = 0;
775 ftail = domain;
776
777 if (tmp_color[domain] ==
BLACK)
778 { tmp_color[domain] =
WHITE;
779 updateB2W(w_bucket,b_bucket,dd,domain,tmp_color,deltaW,deltaB,deltaS);
780 }
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);
784 }
785 tmp_S += deltaS[domain];
786 tmp_B += deltaB[domain];
787 tmp_W += deltaW[domain];
788
789 pos++;
790 if (value +
EPS < bestglobalvalue)
791 { bestglobalvalue = value;
792 bestglobalpos = pos;
793 badflips = 0;
794 }
795 else badflips++;
797
798INNER_LOOP_END:
799
800
801
802
803 pos = 0;
804 nxtdomain = fhead;
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];
813 pos++;
814 }
815 nxtdomain = vtype[domain];
816 vtype[domain] = 1;
817 }
818
819
820
821
822#ifdef DEBUG
823 printf(" INNER_LOOP_END (#pyhs. flips %d): S %d, B %d, W %d (%7.2f)\n",
825 bestglobalvalue);
827#endif
828
829
830
831
832
833
834
837
838 if (bestglobalpos > 0) goto OUTER_LOOP_START;
839 free(tmp_color); free(deltaS); free(deltaB); free(deltaW);
840}
void updateW2B(bucket_t *w_bucket, bucket_t *b_bucket, domdec_t *dd, PORD_INT domain, PORD_INT *tmp_color, PORD_INT *deltaW, PORD_INT *deltaB, PORD_INT *deltaS)
void updateB2W(bucket_t *w_bucket, bucket_t *b_bucket, domdec_t *dd, PORD_INT domain, PORD_INT *tmp_color, PORD_INT *deltaW, PORD_INT *deltaB, PORD_INT *deltaS)
PORD_INT minBucket(bucket_t *)
void insertBucket(bucket_t *, PORD_INT, PORD_INT)
void freeBucket(bucket_t *)
void removeBucket(bucket_t *, PORD_INT)
bucket_t * setupBucket(PORD_INT, PORD_INT, PORD_INT)