30 for (i=0; i<nvtxs; i++)
34 for (i=0; i<nvtxs; i++)
35 for (j=xadj[i]; j<xadj[i+1]; j++)
38 for (i=0; i<nvtxs; i++)
39 for (j=xadj[i]; j<xadj[i+1]; j++)
47 idxtype *xadj, *adjncy, *adjwgt, *where;
56 for (i=0; i<nvtxs; i++)
57 for (j=xadj[i]; j<xadj[i+1]; j++)
60 for (i=0; i<nvtxs; i++)
61 for (j=xadj[i]; j<xadj[i+1]; j++)
62 m_adjwgt[j] = adjwgt[j];
66 for (i=0; i<nvtxs; i++)
67 for (j=xadj[i]; j<xadj[i+1]; j++)
69 m_adjwgt[j] = 1.0/w[i];
70 for (i=0; i<nvtxs; i++)
71 for (j=xadj[i]; j<xadj[i+1]; j++)
73 m_adjwgt[j] /= w[adjncy[j]];
76 for (i=0; i<nvtxs; i++)
77 for (j=xadj[i]; j<xadj[i+1]; j++)
79 m_adjwgt[j] = adjwgt[j] *1.0/w[i];
82 for (i=0; i<nvtxs; i++)
83 for (j=xadj[i]; j<xadj[i+1]; j++)
85 m_adjwgt[j] /= w[adjncy[j]];
94 int nvtxs, nedges, moves, iter;
116 moves =
local_search(ctrl, graph, nparts, chain_length, w, tpwgts, ubfactor);
136 int nvtxs, nbnd, nedges, me, i, j;
137 idxtype *squared_sum, *sum, *xadj, *adjncy, *adjwgt, *where, *new_where, *bndptr, *bndind;
138 float obj, old_obj, epsilon, *inv_sum, *squared_inv_sum;
144 nvtxs = graph->
nvtxs;
149 where = graph->
where;
155 new_where =
imalloc(nvtxs,
"Weighted_kernel_k_means: new_where");
156 for (i=0; i<nvtxs; i++)
157 new_where[i] = where[i];
159 sum =
idxsmalloc(nparts,0,
"Weighted_kernel_k_means: weight sum");
160 inv_sum =
fmalloc(nparts,
"Weighted_kernel_k_means: sum inverse");
161 squared_inv_sum =
fmalloc(nparts,
"Weighted_kernel_k_means: squared sum inverse");
162 squared_sum =
idxsmalloc(nparts,0,
"Weighted_kernel_k_means: weight squared sum");
167 for (i=0; i<nvtxs; i++)
168 sum[where[i]] += w[i];
169 for (i=0; i<nparts; i++)
171 inv_sum[i] = 1.0/sum[i];
172 squared_inv_sum[i] = inv_sum[i]*inv_sum[i];
175 inv_sum[i] = squared_inv_sum[i] = 0;
186 for (i=0; i<nvtxs; i++){
188 for (j=xadj[i]; j<xadj[i+1]; j++)
189 if (where[adjncy[j]] == me)
190 squared_sum[me] += adjwgt[j];
194 for (i=0; i<nparts; i++)
196 obj += squared_sum[i]*1.0/sum[i];
199 linearTerm =
imalloc(nparts,
"Weighted_kernel_k_means: new_where");
202 float min_dist,
dist;
248 for (ii=0; ii<loopend; ii++){
254 float inv_wi=1.0/w[i];
255 for (k=0; k<nparts; k++)
257 for (j=xadj[i]; j<xadj[i+1]; j++)
258 linearTerm[where[adjncy[j]]] += adjwgt[j];
260 min_ind = me = where[i];
261 min_dist = squared_sum[me]*squared_inv_sum[me] - 2*inv_wi*linearTerm[me]*inv_sum[me];
265 for (k=0; k<me; k++){
266 dist = squared_sum[k]*squared_inv_sum[k] -2*inv_wi*linearTerm[k]*inv_sum[k];
278 for (k=me+1; k<nparts; k++){
279 dist = squared_sum[k]*squared_inv_sum[k] -2*inv_wi*linearTerm[k]*inv_sum[k];
293 new_where[i] = min_ind;
302 for (i=0; i<nparts; i++)
303 sum[i] = squared_sum[i] = 0;
304 for (i=0; i<nvtxs; i++)
305 sum[new_where[i]] += w[i];
306 for (i=0; i<nparts; i++)
308 inv_sum[i] = 1.0/sum[i];
309 squared_inv_sum[i] = inv_sum[i]*inv_sum[i];
312 inv_sum[i] = squared_inv_sum[i] = 0;
323 for (i=0; i<nvtxs; i++){
325 for (j=xadj[i]; j<xadj[i+1]; j++)
326 if (new_where[adjncy[j]] == me)
327 squared_sum[me] += adjwgt[j];
332 for (i=0; i<nparts; i++)
334 obj += squared_sum[i]*1.0/sum[i];
343 for (ii=0; ii<loopend; ii++){
348 where[i] = new_where[i];
352 }
while((obj - old_obj)> epsilon*obj);
353 free(sum); free(squared_sum); free(new_where); free(linearTerm); free(inv_sum); free(squared_inv_sum);
542 int k, j, s, i, nbnd, temp, q1, q2, minchange_id, new_squared_sum1, new_squared_sum2, me, nedges, nvtxs;
543 float tempchange, minchange, obj, cut;
544 idxtype *xadj, *adjncy, *adjwgt, *where, *bndptr, *bndind;
547 nvtxs = graph->
nvtxs;
551 where = graph->
where;
563 new_squared_sum1= new_squared_sum2= squared_sum[me];
566 float inv_sum1 = 1.0/sum[me], inv_sum2 = 1.0/(sum[me]-w[s]);
568 for(k= 0; k<me; k++){
569 q1 = squared_sum[me] - linearTerm[ii][me]*2 + self_sim[ii];
570 q2 = squared_sum[k] + linearTerm[ii][k] *2 + self_sim[ii];
572 tempchange = squared_sum[me]*inv_sum1 + squared_sum[k]*1.0/sum[k] - q1*inv_sum2- q2*1.0/(sum[k]+w[s]);
574 tempchange = squared_sum[me]*inv_sum1 - q1*inv_sum2 - q2*1.0/(sum[k]+w[s]);
576 tempchange = squared_sum[me]*inv_sum1 - q1*inv_sum2;
578 if(tempchange < minchange){
579 minchange = tempchange;
581 new_squared_sum1 = q1;
582 new_squared_sum2 = q2;
585 for(k= me+1; k<nparts; k++){
586 q1 = squared_sum[me] - linearTerm[ii][me]*2 +self_sim[ii];
587 q2 = squared_sum[k] + linearTerm[ii][k]*2 + self_sim[ii];
589 tempchange = squared_sum[me]*inv_sum1 + squared_sum[k]*1.0/sum[k] - q1*inv_sum2- q2*1.0/(sum[k]+w[s]);
591 tempchange = squared_sum[me]*inv_sum1 - q1*inv_sum2 - q2*1.0/(sum[k]+w[s]);
593 tempchange = squared_sum[me]*inv_sum1 - q1*inv_sum2;
595 if(tempchange < minchange){
596 minchange = tempchange;
598 new_squared_sum1 = q1;
599 new_squared_sum2 = q2;
603 where[s] = minchange_id;
605 sum[minchange_id] += w[s];
611 for (j=xadj[s]; j<xadj[s+1]; j++){
612 int boundary, adj_temp;
613 adj_temp = adjncy[j];
614 boundary = bndptr[adj_temp];
618 linearTerm[boundary][me] -= adjwgt[j];
622 linearTerm[boundary][minchange_id] += adjwgt[j];
635 squared_sum[me] = new_squared_sum1;
636 squared_sum[minchange_id] = new_squared_sum2;
643 int j, s, ii, nbnd, q1, q2, minchange_id, new_squared_sum1, new_squared_sum2, me, nvtxs, loopend;
644 float tempchange, minchange;
645 idxtype *xadj, *adjncy, *adjwgt, *where, *bndptr, *bndind;
647 nvtxs = graph->
nvtxs;
651 where = graph->
where;
655 minchange_id = bndind[0];
663 for(ii=0; ii<loopend; ii++){
669 new_squared_sum1= new_squared_sum2= squared_sum[me];
672 float inv_sum1 = 1.0/sum[me], inv_sum2 = 1.0/(sum[me]-w[s]);
674 q1 = squared_sum[me] - linearTerm[ii][me]*2 + self_sim[ii];
675 q2 = squared_sum[k] + linearTerm[ii][k] *2 + self_sim[ii];
677 tempchange = squared_sum[me]*inv_sum1 - q1*inv_sum2 - q2*1.0/(sum[k]+w[s]);
679 tempchange = squared_sum[me]*inv_sum1 - q1*inv_sum2;
681 if(tempchange < minchange){
682 minchange = tempchange;
684 new_squared_sum1 = q1;
685 new_squared_sum2 = q2;
690 where[minchange_id] = k;
691 sum[me] -= w[minchange_id];
692 sum[k] += w[minchange_id];
694 for (j=xadj[minchange_id]; j<xadj[minchange_id+1]; j++){
695 int boundary, adj_temp;
696 adj_temp = adjncy[j];
697 boundary = bndptr[adj_temp];
699 linearTerm[boundary][me] -= adjwgt[j];
700 linearTerm[boundary][k] += adjwgt[j];
702 squared_sum[me] = new_squared_sum1;
703 squared_sum[k] = new_squared_sum2;
710 int nvtxs, nedges, nbnd, me, i, j, k, s, ii, loopend;
711 idxtype *sum, *squared_sum, *xadj, *adjncy, *adjwgt, *where, *bndptr, *bndind, *self_sim;
712 float change, obj, epsilon, accum_change, minchange;
713 int moves, loopTimes, **linearTerm;
716 nvtxs = graph->
nvtxs;
720 where = graph->
where;
725 sum =
idxsmalloc(nparts,0,
"Local_search: weight sum");
726 squared_sum =
idxsmalloc(nparts,0,
"Local_search: weight squared sum");
729 self_sim =
idxsmalloc(nvtxs, 0,
"Local_search: self similarity");
730 linearTerm =
i2malloc(nvtxs, nparts,
"Local_search: linear term");
736 for (i=0; i<nvtxs; i++)
737 sum[where[i]] += w[i];
738 for (i=0; i<nvtxs; i++){
740 for (j=xadj[i]; j<xadj[i+1]; j++)
741 if (where[adjncy[j]] == me)
742 squared_sum[me] += adjwgt[j];
746 for (ii = 0; ii<nvtxs; ii++)
747 for (j = 0; j<nparts; j++)
748 linearTerm[ii][j] = 0;
754 for (ii =0; ii<loopend; ii++){
759 for (j=xadj[s]; j<xadj[s+1]; j++){
761 linearTerm[ii][where[adjncy[j]]] += adjwgt[j];
763 self_sim[ii] = adjwgt[j];
769 for (i=0; i<nparts; i++)
771 obj += squared_sum[i]*1.0/sum[i];
777 while (loopTimes < chain_length){
782 for (j=0; j<nvtxs; j++)
783 minchange =
onePoint_move(graph, nparts, sum, squared_sum, w, self_sim, linearTerm, j);
787 for (ii=0; ii<nbnd; ii++){
788 minchange =
onePoint_move(graph, nparts, sum, squared_sum, w, self_sim, linearTerm, bndind[ii]);
791 accum_change += minchange;
794 if (accum_change > -epsilon * obj){
801 free(sum); free(squared_sum); free(self_sim);
803 for (i= 0; i<nvtxs; i++)
814 int *clustersize=
imalloc(nparts,
"remove_empty_clusters: clusterSize");
815 int number_of_empty_cluster=0, i, s;
817 for(i=0; i<nparts; i++)
820 for(i=0; i<nparts; i++)
821 if(clustersize[i] ==0)
822 number_of_empty_cluster ++;
824 if(number_of_empty_cluster>0)
825 local_search(ctrl, graph, nparts, 1, w, tpwgts, ubfactor);
831 int *clustersize=
imalloc(nparts,
"remove_empty_clusters: clusterSize");
832 int number_of_empty_cluster=0, i, s;
834 for(i=0; i<nparts; i++)
837 for(i=0; i<nparts; i++)
838 if(clustersize[i] ==0)
839 number_of_empty_cluster ++;
842 if(number_of_empty_cluster>0){
843 int nvtxs, me, j, k, ii, loopend;
844 idxtype *sum, *squared_sum, *xadj, *adjncy, *adjwgt, *where, *bndptr, *bndind, *self_sim, nbnd;
847 nvtxs = graph->
nvtxs;
851 where = graph->
where;
856 sum =
idxsmalloc(nparts,0,
"Local_search: weight sum");
857 squared_sum =
idxsmalloc(nparts,0,
"Local_search: weight squared sum");
858 self_sim =
idxsmalloc(nbnd, 0,
"Local_search: self similarity");
859 linearTerm =
i2malloc(nbnd, nparts,
"Local_search: linear term");
861 for (i=0; i<nvtxs; i++)
862 sum[where[i]] += w[i];
863 for (i=0; i<nvtxs; i++){
865 for (j=xadj[i]; j<xadj[i+1]; j++)
866 if (where[adjncy[j]] == me)
867 squared_sum[me] += adjwgt[j];
871 for (ii = 0; ii<nvtxs; ii++)
872 for (j = 0; j<nparts; j++)
873 linearTerm[ii][j] = 0;
878 for (ii =0; ii<loopend; ii++){
883 for (j=xadj[s]; j<xadj[s+1]; j++){
884 linearTerm[ii][where[adjncy[j]]] += adjwgt[j];
886 self_sim[ii] = adjwgt[j];
889 for(k=0; k<nparts; k++)
890 if(clustersize[k] ==0){
893 free(sum); free(squared_sum); free(self_sim);
895 for (i= 0; i<nvtxs; i++)
915 int i, nlevels, mustfree=0, temp_cl;
922 temp_cl = chain_length;
925 for (ptr=graph, nlevels=0; ptr!=orggraph; ptr=ptr->
finer, nlevels++);
939 if (graph == orggraph){
941 pingpong(ctrl, graph, nparts, chain_length, tpwgts, ubfactor, 1);
946 pingpong(ctrl, graph, nparts, chain_length, tpwgts, ubfactor, 0);
968 if (graph == orggraph)
976 graph = graph->
finer;
float ComputeRAsso(GraphType *graph, idxtype *where, int npart)
float ComputeNCut(GraphType *graph, idxtype *where, int npart)
static double dist(double x1, double y1, double x2, double y2)
#define IFSET(a, flag, cmd)
int ** i2malloc(int, int, char *)
void clusterSize(GraphType *graph, int *clustersize)
#define ComputeKWayPartitionParams
#define ProjectKWayPartition
int local_search(CtrlType *ctrl, GraphType *graph, int nparts, int chain_length, idxtype *w, float *tpwgts, float ubfactor)
void move1Point2EmptyCluster(GraphType *graph, int nparts, idxtype *sum, idxtype *squared_sum, idxtype *w, idxtype *self_sim, int **linearTerm, int k)
void Weighted_kernel_k_means(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *w, float *tpwgts, float ubfactor)
void Compute_Weights(CtrlType *ctrl, GraphType *graph, idxtype *w)
void remove_empty_clusters_l2(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *w, float *tpwgts, float ubfactor)
float onePoint_move(GraphType *graph, int nparts, idxtype *sum, idxtype *squared_sum, idxtype *w, idxtype *self_sim, int **linearTerm, int ii)
void remove_empty_clusters_l1(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *w, float *tpwgts, float ubfactor)
void transform_matrix(CtrlType *ctrl, GraphType *graph, idxtype *w, float *m_adjwgt)
void pingpong(CtrlType *ctrl, GraphType *graph, int nparts, int chain_length, float *tpwgts, float ubfactor, int toplevel)
void MLKKMRefine(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, int nparts, int chain_length, float *tpwgts, float ubfactor)