231 PORD_INT *xadj, *adjncy, *vwght, *xadjGelim, *adjncyGelim, *vwghtGelim;
232 PORD_INT *len, *elen, *parent, *degree, *score;
233 PORD_INT nvtx, nedges, deg, u, i, istart, istop;
242 xadjGelim = Gelim->
G->
xadj;
243 adjncyGelim = Gelim->
G->
adjncy;
244 vwghtGelim = Gelim->
G->
vwght;
249 score = Gelim->
score;
256 for (u = 0; u < nvtx; u++)
257 { xadjGelim[u] = xadj[u];
258 vwghtGelim[u] = vwght[u];
260 xadjGelim[nvtx] = xadj[nvtx];
261 for (i = 0; i < nedges; i++)
262 adjncyGelim[i] = adjncy[i];
268 for (u = 0; u < nvtx; u++)
271 len[u] = istop - istart;
276 switch(Gelim->
G->
type)
281 for (i = istart; i < istop; i++)
282 deg += vwght[adjncy[i]];
285 fprintf(stderr,
"\nError in function setupElimGraph\n"
286 " unrecognized graph type %d\n", Gelim->
G->
type);
359 PORD_INT *xadj, *adjncy, *vwght, *len, *elen, *parent, *degree, *score;
360 PORD_INT degme, elenme, vlenme, mesrcptr, medeststart, medeststart2;
361 PORD_INT medestptr, ln, p, i, j, v, e;
371 score = Gelim->
score;
378 vwght[me] = -vwght[me];
382 vlenme = len[me] - elenme;
389 { medeststart = xadj[me];
390 medestptr = medeststart;
391 for (i = 0; i < vlenme; i++)
392 { v = adjncy[mesrcptr++];
395 vwght[v] = -vwght[v];
396 adjncy[medestptr++] = v;
405 { medeststart = G->
nedges;
406 medestptr = medeststart;
407 for (i = 0; i <= elenme; i++)
410 e = adjncy[mesrcptr++];
419 for (j = 0; j < ln; j++)
424 vwght[v] = -vwght[v];
430 {
if (len[me] == 0) xadj[me] = -1;
431 else xadj[me] = mesrcptr;
432 if (len[e] == 0) xadj[e] = -1;
437 { fprintf(stderr,
"\nError in function buildElement\n"
438 " unable to construct element (not enough memory)\n");
444 for (p = medeststart; p < medestptr; p++)
445 adjncy[G->
nedges++] = adjncy[p];
446 medeststart = medeststart2;
452 adjncy[medestptr++] = v;
473 xadj[me] = medeststart;
474 vwght[me] = -vwght[me];
476 len[me] = medestptr - medeststart;
485 for (i = 0; i < vlenme; i++)
486 { v = adjncy[mesrcptr++];
487 vwght[v] = -vwght[v];
496{
PORD_INT *xadj, *adjncy, *vwght, *len, *elen, *parent, *score;
497 PORD_INT u, v, e, me, i, j, jj, jdest, jfirstolde, jfirstv, jstart, jstop;
500 xadj = Gelim->
G->
xadj;
506 score = Gelim->
score;
511 for (i = 0; i < nreach; i++)
513 vwght[u] = -vwght[u];
515 jstop = xadj[u] + len[u];
516 jdest = jfirstolde = jstart;
519 printf(
"Updating adjacency list of node %d\n", u);
526 for (j = jstart; j < jstart + elen[u]; j++)
530 printf(
" >> element %d (score %d, parent %d)\n", e,score[e],parent[e]);
535 if (tmp[me] < *pflag)
536 { adjncy[jdest++] = adjncy[jfirstolde];
537 adjncy[jfirstolde++] = me;
543 { adjncy[jdest++] = e;
553 for (j = jstart + elen[u]; j < jstop; j++)
557 printf(
" >> variable %d (score %d)\n", v, score[v]);
561 {
if (tmp[v] < *pflag)
562 { adjncy[jdest++] = adjncy[jfirstv];
563 adjncy[jfirstv++] = adjncy[jfirstolde];
564 adjncy[jfirstolde++] = v;
571 elen[u] = jfirstv - jstart;
572 len[u] = jdest - jstart;
576 printf(
" node %d: neighboring elements:\n", u);
577 for (j = jstart; j < jstart + elen[u]; j++)
578 printf(
"%5d", adjncy[j]);
579 printf(
"\n node %d: neighboring variables:\n", u);
580 for (j = jstart + elen[u]; j < jstart + len[u]; j++)
581 printf(
"%5d", adjncy[j]);
589 for (i = 0; i < nreach; i++)
592 jstop = jstart + len[u];
595 for (jdest = j = jstart + elen[u]; j < jstop; j++)
602 {
for (jj = jstart; jj < jstart + elen[u]; jj++)
603 tmp[adjncy[jj]] = *pflag;
606 for (jj = xadj[v]; jj < xadj[v] + elen[v]; jj++)
607 if (tmp[adjncy[jj]] == *pflag)
615 len[u] = jdest - jstart;
619 printf(
" node %d: neighboring uncovered variables:\n", u);
620 for (j = jstart + elen[u]; j < jstart + len[u]; j++)
621 printf(
"%5d", adjncy[j]);
629 for (i = 0; i < nreach; i++)
631 vwght[u] = -vwght[u];
641{
PORD_INT *xadj, *adjncy, *vwght, *len, *elen, *parent, *score;
642 PORD_INT nvtx, chk, keepon, u, v, w, wlast, i, j, jstart, jstop, jstep, jj, jjstop;
643 nvtx = Gelim->
G->
nvtx;
644 xadj = Gelim->
G->
xadj;
650 score = Gelim->
score;
653 printf(
"Checking reachset for indistinguishable variables\n");
660 for (i = 0; i < nreach; i++)
664 jstop = jstart + len[u];
672 jstep=
max(1000000000/nvtx,1);
673 for (j = jstart; j < jstop; j+=jstep)
675 jjstop =
min(jstop, j+jstep);
676 for (jj = j; jj < jjstop; jj++)
692 for (i = 0; i < nreach; i++)
700 jstop = xadj[v] + len[v];
701 for (j = jstart; j < jstop; j++)
702 tmp[adjncy[j]] = *pflag;
707 if ((len[w] != len[v]) || (elen[w] != elen[v])
708 || ((score[w] < 0) && (score[v] >= 0))
709 || ((score[w] >= 0) && (score[v] < 0)))
712 {
for (jj = xadj[w]; jj < xadj[w] + len[w]; jj++)
713 if (tmp[adjncy[jj]] < *pflag)
725 printf(
" non-principal variable %d (score %d) mapped onto "
726 "%d (score %d)\n", w, score[w], v, score[v]);
729 vwght[v] += vwght[w];
750 for (i = 0; i < nreach; i++)
762{
PORD_INT *xadj, *adjncy, *vwght, *len, *elen, *degree;
763 PORD_INT totvwght, deg, vwghtv, u, v, w, e, me,
r, i, istart, istop;
767 xadj = Gelim->
G->
xadj;
778 for (
r = 0;
r < nreach;
r++)
787 for (
r = 0;
r < nreach;
r++)
790 { me = adjncy[xadj[u]];
793 printf(
"Updating degree of all variables in L(%d) (initiated by %d)\n",
801 istop = istart + len[me];
802 for (i = istart; i < istop; i++)
807 jstop = jstart + elen[v];
808 for (j = jstart; j < jstop; j++)
811 {
if (bin[e] > 0) bin[e] -= vwghtv;
812 else bin[e] = degree[e] - vwghtv;
819 for (i = istart; i < istop; i++)
822 for (j = xadj[v]; j < xadj[v] + elen[v]; j++)
825 printf(
" >> element %d: degree %d, outer degree %d\n", e,
834 for (i = istart; i < istop; i++)
840 jstop = jstart + len[v];
843 for (j = jstart; j < jstart + elen[v]; j++)
845 if (e != me) deg += bin[e];
849 for (j = jstart + elen[v]; j < jstop; j++)
855 deg =
min(degree[v], deg);
856 degree[v] =
max(1,
min(deg+degree[me]-vwghtv, totvwght-vwghtv));
860 printf(
" >> variable %d (totvwght %d, vwght %d): deg %d, "
861 "degme %d, approx degree %d\n", v, totvwght, vwghtv, deg,
862 degree[me], degree[v]);
870 for (i = istart; i < istop; i++)
875 jstop = jstart + elen[v];
876 for (j = jstart; j < jstop; j++)
878 if (e != me) bin[e] = -1;
891{
PORD_INT *xadj, *adjncy, *vwght, *len, *elen, *degree, *score;
892 PORD_INT vwghtv, deg, degme, u, v, me,
r, i, istart, istop;
901 xadj = Gelim->
G->
xadj;
907 score = Gelim->
score;
913 for (
r = 0;
r < nreach;
r++)
922 scoretype = scoretype % 10;
923 for (
r = 0;
r < nreach;
r++)
926 { me = adjncy[xadj[u]];
929 printf(
"Updating score of all variables in L(%d) (initiated by %d)\n",
934 istop = xadj[me] + len[me];
935 for (i = istart; i < istop; i++)
940 degme = degree[me] - vwghtv;
941 if (deg > 40000 || degme > 40000)
945 scr_dbl = (double)deg;
948 scr_dbl = (double)deg*(
double)(deg-1)/2 - (
double)degme*(double)(degme-1)/2;
951 scr_dbl = ((double)deg*(double)(deg-1)/2 - (double)degme*(double)(degme-1)/2) / (
double)vwghtv;
954 scr_dbl =
max(0, ((
double)deg*(
double)(deg-1)/2 - (
double)degme*(
double)(degme-1)/2)
955 - (
double)deg*(
double)vwghtv);
958 fprintf(stderr,
"\nError in function updateScore\n"
959 " unrecognized selection strategy %d\n", scoretype);
973 scr = deg*(deg-1)/2 - degme*(degme-1)/2;
976 scr = (deg*(deg-1)/2 - degme*(degme-1)/2) / vwghtv;
979 scr =
max(0, (deg*(deg-1)/2 - degme*(degme-1)/2)
983 fprintf(stderr,
"\nError in function updateScore\n"
984 " unrecognized selection strategy %d\n", scoretype);
992 printf(
" >> variable %d (me %d): weight %d, (ext)degme %d, "
993 "degree %d, score %d\n", u, me, vwghtv, degme, degree[v],
998 { fprintf(stderr,
"\nError in function updateScore\n"
999 " score[%d] = %d is negative\n", v, score[v]);
1014 PORD_INT *vwght, *par, *degree, *score, *sib, *fch;
1015 PORD_INT *ncolfactor, *ncolupdate, *parent, *vtx2front;
1018 nvtx = Gelim->
G->
nvtx;
1022 score = Gelim->
score;
1029 for (u = 0; u < nvtx; u++)
1030 sib[u] = fch[u] = -1;
1037 for (u = 0; u < nvtx; u++)
1053 fprintf(stderr,
"\nError in function extractElimTree\n"
1054 " ordering not complete (score[%d] = %d)\n", u, score[u]);
1059 for (u = 0; u < nvtx; u++)
1060 printf(
"node %d: score %d, par %d, fch %d, sib %d\n", u, score[u],
1061 par[u], fch[u], sib[u]);
1080 {
while (fch[u] != -1)
1082 vtx2front[u] = nfronts++;
1083 while ((sib[u] == -1) && (par[u] != -1))
1085 vtx2front[u] = nfronts++;
1093 for (u = 0; u < nvtx; u++)
1096 while ((par[v] != -1) && (score[v] == -2))
1098 vtx2front[u] = vtx2front[v];
1104 for (u = 0; u < nvtx; u++)
1105 { front = vtx2front[u];
1107 { parent[front] = -1;
1108 ncolfactor[front] = vwght[u];
1109 ncolupdate[front] = degree[u];
1112 { parent[front] = vtx2front[par[u]];
1113 ncolfactor[front] = vwght[u];
1114 ncolupdate[front] = degree[u];
1126 free(sib); free(fch);
void findIndNodes(gelim_t *Gelim, PORD_INT *reachset, PORD_INT nreach, PORD_INT *bin, PORD_INT *next, PORD_INT *tmp, PORD_INT *pflag)
void updateScore(gelim_t *Gelim, PORD_INT *reachset, PORD_INT nreach, PORD_INT scoretype, PORD_INT *bin)