📄 redomylink.c
字号:
/* * Copyright 1997, Regents of the University of Minnesota * * redomylink.c * * This file contains code that implements the edge-based FM refinement * * Started 7/23/97 * George * * $Id: redomylink.c,v 1.2 2004/03/08 04:58:31 benkirk Exp $ */#include <parmetislib.h>#define PE 0/************************************************************************** This function performs an edge-based FM refinement**************************************************************************/void RedoMyLink(CtrlType *ctrl, GraphType *graph, idxtype *home, int me, int you, float *flows, float *sr_cost, float *sr_lbavg){ int h, i, r; int nvtxs, nedges, ncon; int pass, lastseed, totalv; idxtype *xadj, *adjncy, *adjwgt, *where, *vsize; idxtype *costwhere, *lbwhere, *selectwhere; idxtype *rdata, *ed, *id, *bndptr, *bndind, *perm; float *nvwgt, mycost; float lbavg, lbvec[MAXNCON]; float best_lbavg, other_lbavg = -1.0, bestcost, othercost = -1.0; float npwgts[2*MAXNCON], pwgts[MAXNCON*2], tpwgts[MAXNCON*2]; float ipc_factor, redist_factor, ftmp;int mype;MPI_Comm_rank(MPI_COMM_WORLD, &mype); nvtxs = graph->nvtxs; nedges = graph->nedges; ncon = graph->ncon; xadj = graph->xadj; nvwgt = graph->nvwgt; vsize = graph->vsize; adjncy = graph->adjncy; adjwgt = graph->adjwgt; where = graph->where; ipc_factor = ctrl->ipc_factor; redist_factor = ctrl->redist_factor; /**************************/ /* set up data structures */ /**************************/ rdata = idxmalloc(7*nvtxs, "rdata"); id = graph->sendind = rdata; ed = graph->recvind = rdata + nvtxs; bndptr = graph->sendptr = rdata + 2*nvtxs; bndind = graph->recvptr = rdata + 3*nvtxs; costwhere = rdata + 4*nvtxs; lbwhere = rdata + 5*nvtxs; perm = rdata + 6*nvtxs; graph->gnpwgts = npwgts; RandomPermute(nvtxs, perm, 1); idxcopy(nvtxs, where, costwhere); idxcopy(nvtxs, where, lbwhere); /*****************************/ /* compute target pwgts */ /*****************************/ sset(ncon*2, 0.0, pwgts); for (h=0; h<ncon; h++) { tpwgts[h] = -1.0 * flows[h]; tpwgts[ncon+h] = flows[h]; } for (i=0; i<nvtxs; i++) { if (where[i] == me) { for (h=0; h<ncon; h++) { tpwgts[h] += nvwgt[i*ncon+h]; pwgts[h] += nvwgt[i*ncon+h]; } } else { ASSERTS(where[i] == you); for (h=0; h<ncon; h++) { tpwgts[ncon+h] += nvwgt[i*ncon+h]; pwgts[ncon+h] += nvwgt[i*ncon+h]; } } } /* we don't want any weights to be less than zero */ for (h=0; h<ncon; h++) { if (tpwgts[h] < 0.0) { tpwgts[ncon+h] += tpwgts[h]; tpwgts[h] = 0.0; } if (tpwgts[ncon+h] < 0.0) { tpwgts[h] += tpwgts[ncon+h]; tpwgts[ncon+h] = 0.0; } } /*****************************/ /* now compute new bisection */ /*****************************/ bestcost = (float)idxsum(nedges, adjwgt)*ipc_factor + (float)idxsum(nvtxs, vsize)*redist_factor; best_lbavg = 10.0; lastseed = 0; for (pass = N_MOC_REDO_PASSES; pass>0; pass--) { idxset(nvtxs, 1, where); /***************************/ /* find seed vertices */ /***************************/ r = perm[lastseed] % nvtxs; lastseed = (lastseed+1) % nvtxs; where[r] = 0; Moc_Serial_Compute2WayPartitionParams(graph); Moc_Serial_Init2WayBalance(graph, tpwgts); Moc_Serial_FM_2WayRefine(graph, tpwgts, 4); Moc_Serial_Balance2Way(graph, tpwgts, 1.02); Moc_Serial_FM_2WayRefine(graph, tpwgts, 4); for (i=0; i<nvtxs; i++) where[i] = (where[i] == 0) ? me : you; for (i=0; i<ncon; i++) { ftmp = (pwgts[i]+pwgts[ncon+i])/2.0; if (ftmp != 0.0) lbvec[i] = fabs(npwgts[i]-tpwgts[i])/ftmp; else lbvec[i] = 0.0; } lbavg = savg(ncon, lbvec); totalv = 0; for (i=0; i<nvtxs; i++) if (where[i] != home[i]) totalv += vsize[i]; mycost = (float)(graph->mincut)*ipc_factor + (float)totalv*redist_factor; if (bestcost >= mycost) { bestcost = mycost; other_lbavg = lbavg; idxcopy(nvtxs, where, costwhere); } if (best_lbavg >= lbavg) { best_lbavg = lbavg; othercost = mycost; idxcopy(nvtxs, where, lbwhere); } } if (other_lbavg <= .05) { selectwhere = costwhere; *sr_cost = bestcost; *sr_lbavg = other_lbavg; } else { selectwhere = lbwhere; *sr_cost = othercost; *sr_lbavg = best_lbavg; } idxcopy(nvtxs, selectwhere, where); GKfree((void **)&rdata, LTERM); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -